From cd5509a0f98db63d9b3ad10be3960b35ec1a6f6a Mon Sep 17 00:00:00 2001 From: Rasmus Lerchedahl Petersen Date: Fri, 15 Nov 2024 11:28:38 +0100 Subject: [PATCH 01/71] Java: locations for range analysis --- .../code/java/dataflow/RangeAnalysis.qll | 10 ++++---- .../semmle/code/java/dataflow/RangeUtils.qll | 2 +- .../codeql/rangeanalysis/ModulusAnalysis.qll | 4 ++-- .../codeql/rangeanalysis/RangeAnalysis.qll | 23 +++++++++++-------- .../rangeanalysis/internal/RangeUtils.qll | 3 ++- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll b/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll index e0055d53f08..774b165e949 100644 --- a/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll +++ b/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll @@ -75,7 +75,7 @@ private import semmle.code.java.Maps import Bound private import codeql.rangeanalysis.RangeAnalysis -module Sem implements Semantic { +module Sem implements Semantic { private import java as J private import SSA as SSA private import RangeUtils as RU @@ -264,7 +264,7 @@ module Sem implements Semantic { predicate conversionCannotOverflow = safeCast/2; } -module SignInp implements SignAnalysisSig { +module SignInp implements SignAnalysisSig { private import SignAnalysis private import internal.rangeanalysis.Sign @@ -281,7 +281,7 @@ module SignInp implements SignAnalysisSig { predicate semMayBeNegative(Sem::Expr e) { exprSign(e) = TNeg() } } -module Modulus implements ModulusAnalysisSig { +module Modulus implements ModulusAnalysisSig { class ModBound = Bound; private import codeql.rangeanalysis.ModulusAnalysis as Mod @@ -307,7 +307,7 @@ module IntDelta implements DeltaSig { Delta fromFloat(float f) { result = f } } -module JavaLangImpl implements LangSig { +module JavaLangImpl implements LangSig { /** * Holds if `e >= bound` (if `upper = false`) or `e <= bound` (if `upper = true`). */ @@ -379,7 +379,7 @@ module Bounds implements BoundSig { } } -module Overflow implements OverflowSig { +module Overflow implements OverflowSig { predicate semExprDoesNotOverflow(boolean positively, Sem::Expr expr) { positively = [true, false] and exists(expr) } diff --git a/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll b/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll index be7f73fe766..e96d591ced5 100644 --- a/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll +++ b/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll @@ -9,7 +9,7 @@ private import semmle.code.java.Constants private import semmle.code.java.dataflow.RangeAnalysis private import codeql.rangeanalysis.internal.RangeUtils -private module U = MakeUtils; +private module U = MakeUtils; private predicate backEdge = U::backEdge/3; diff --git a/shared/rangeanalysis/codeql/rangeanalysis/ModulusAnalysis.qll b/shared/rangeanalysis/codeql/rangeanalysis/ModulusAnalysis.qll index f8b4a94079a..88d816b8644 100644 --- a/shared/rangeanalysis/codeql/rangeanalysis/ModulusAnalysis.qll +++ b/shared/rangeanalysis/codeql/rangeanalysis/ModulusAnalysis.qll @@ -14,9 +14,9 @@ private import codeql.util.Location private import RangeAnalysis module ModulusAnalysis< - LocationSig Location, Semantic Sem, DeltaSig D, BoundSig Bounds> + LocationSig Location, Semantic Sem, DeltaSig D, BoundSig Bounds> { - private import internal.RangeUtils::MakeUtils + private import internal.RangeUtils::MakeUtils bindingset[pos, v] pragma[inline_late] diff --git a/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll b/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll index e178c44cafb..d0fc084e6c5 100644 --- a/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll +++ b/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll @@ -65,11 +65,13 @@ private import codeql.util.Location -signature module Semantic { +signature module Semantic { class Expr { string toString(); BasicBlock getBasicBlock(); + + Location getLocation(); } class ConstantIntegerExpr extends Expr { @@ -294,7 +296,7 @@ signature module Semantic { predicate conversionCannotOverflow(Type fromType, Type toType); } -signature module SignAnalysisSig { +signature module SignAnalysisSig Sem> { /** Holds if `e` can be positive and cannot be negative. */ predicate semPositive(Sem::Expr e); @@ -320,7 +322,7 @@ signature module SignAnalysisSig { predicate semMayBeNegative(Sem::Expr e); } -signature module ModulusAnalysisSig { +signature module ModulusAnalysisSig Sem> { class ModBound; predicate exprModulus(Sem::Expr e, ModBound b, int val, int mod); @@ -346,7 +348,7 @@ signature module DeltaSig { Delta fromFloat(float f); } -signature module LangSig { +signature module LangSig Sem, DeltaSig D> { /** * Holds if `e >= bound` (if `upper = false`) or `e <= bound` (if `upper = true`). */ @@ -372,7 +374,7 @@ signature module LangSig { default predicate includeRelativeBounds() { any() } } -signature module BoundSig { +signature module BoundSig Sem, DeltaSig D> { /** * A bound that the range analysis can infer for a variable. This includes * constant bounds represented by the abstract value zero, SSA bounds for when @@ -409,14 +411,15 @@ signature module BoundSig { } } -signature module OverflowSig { +signature module OverflowSig Sem, DeltaSig D> { predicate semExprDoesNotOverflow(boolean positively, Sem::Expr expr); } module RangeStage< - LocationSig Location, Semantic Sem, DeltaSig D, BoundSig Bounds, - OverflowSig OverflowParam, LangSig LangParam, SignAnalysisSig SignAnalysis, - ModulusAnalysisSig ModulusAnalysisParam> + LocationSig Location, Semantic Sem, DeltaSig D, BoundSig Bounds, + OverflowSig OverflowParam, LangSig LangParam, + SignAnalysisSig SignAnalysis, + ModulusAnalysisSig ModulusAnalysisParam> { private import Bounds private import LangParam @@ -424,7 +427,7 @@ module RangeStage< private import OverflowParam private import SignAnalysis private import ModulusAnalysisParam - private import internal.RangeUtils::MakeUtils + private import internal.RangeUtils::MakeUtils /** * An expression that does conversion, boxing, or unboxing diff --git a/shared/rangeanalysis/codeql/rangeanalysis/internal/RangeUtils.qll b/shared/rangeanalysis/codeql/rangeanalysis/internal/RangeUtils.qll index dc1014a886e..ee6e3a4c958 100644 --- a/shared/rangeanalysis/codeql/rangeanalysis/internal/RangeUtils.qll +++ b/shared/rangeanalysis/codeql/rangeanalysis/internal/RangeUtils.qll @@ -1,6 +1,7 @@ private import codeql.rangeanalysis.RangeAnalysis +private import codeql.util.Location -module MakeUtils { +module MakeUtils Lang, DeltaSig D> { private import Lang /** From 065f3d1d7a3b9fa8ed5a7d47ea5788a18c3efcbd Mon Sep 17 00:00:00 2001 From: Rasmus Lerchedahl Petersen Date: Fri, 15 Nov 2024 14:10:51 +0100 Subject: [PATCH 02/71] cpp: locations in range analysis --- .../rangeanalysis/new/internal/semantic/SemanticExpr.qll | 3 ++- .../new/internal/semantic/analysis/FloatDelta.qll | 3 ++- .../semantic/analysis/RangeAnalysisConstantSpecific.qll | 3 ++- .../new/internal/semantic/analysis/RangeAnalysisImpl.qll | 6 +++--- .../semantic/analysis/RangeAnalysisRelativeSpecific.qll | 3 ++- .../new/internal/semantic/analysis/SignAnalysisCommon.qll | 3 ++- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll index a2905e185f1..668d9b52659 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll @@ -3,6 +3,7 @@ */ private import Semantic +private import SemanticLocation private import SemanticExprSpecific::SemanticExprConfig as Specific private import SemanticType @@ -15,7 +16,7 @@ private import SemanticType class SemExpr instanceof Specific::Expr { final string toString() { result = super.toString() } - final Specific::Location getLocation() { result = super.getLocation() } + SemLocation getLocation() { result = super.getLocation() } Opcode getOpcode() { result instanceof Opcode::Unknown } diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll index 2cdeb9544ab..4eb3d7a89d1 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/FloatDelta.qll @@ -2,6 +2,7 @@ private import RangeAnalysisImpl private import codeql.rangeanalysis.RangeAnalysis private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticExpr private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticType +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticLocation module FloatDelta implements DeltaSig { class Delta = float; @@ -22,7 +23,7 @@ module FloatDelta implements DeltaSig { Delta fromFloat(float f) { result = f } } -module FloatOverflow implements OverflowSig { +module FloatOverflow implements OverflowSig { predicate semExprDoesNotOverflow(boolean positively, SemExpr expr) { exists(float lb, float ub, float delta | typeBounds(expr.getSemType(), lb, ub) and diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisConstantSpecific.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisConstantSpecific.qll index e9a7dc836e4..6c259faaddc 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisConstantSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisConstantSpecific.qll @@ -3,11 +3,12 @@ */ private import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticLocation private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.FloatDelta private import RangeAnalysisImpl private import codeql.rangeanalysis.RangeAnalysis -module CppLangImplConstant implements LangSig { +module CppLangImplConstant implements LangSig { /** * Ignore the bound on this expression. * diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll index a19baf2eea7..22acb6fc1ca 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisImpl.qll @@ -12,7 +12,7 @@ private import SemanticType private import codeql.rangeanalysis.RangeAnalysis private import ConstantAnalysis as ConstantAnalysis -module Sem implements Semantic { +module Sem implements Semantic { class Expr = SemExpr; class ConstantIntegerExpr = ConstantAnalysis::SemConstantIntegerExpr; @@ -104,7 +104,7 @@ module Sem implements Semantic { } } -module SignAnalysis implements SignAnalysisSig { +module SignAnalysis implements SignAnalysisSig { private import SignAnalysisCommon as SA import SA::SignAnalysis } @@ -165,7 +165,7 @@ module AllBounds implements BoundSig { } } -private module ModulusAnalysisInstantiated implements ModulusAnalysisSig { +private module ModulusAnalysisInstantiated implements ModulusAnalysisSig { class ModBound = AllBounds::SemBound; private import codeql.rangeanalysis.ModulusAnalysis as MA diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisRelativeSpecific.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisRelativeSpecific.qll index 3774d47db8b..cf23fd09f6f 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisRelativeSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/RangeAnalysisRelativeSpecific.qll @@ -3,12 +3,13 @@ */ private import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticLocation private import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.FloatDelta private import RangeAnalysisImpl private import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils private import codeql.rangeanalysis.RangeAnalysis -module CppLangImplRelative implements LangSig { +module CppLangImplRelative implements LangSig { /** * Ignore the bound on this expression. * diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/SignAnalysisCommon.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/SignAnalysisCommon.qll index 9cd57e5ed62..e07ea789252 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/SignAnalysisCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/analysis/SignAnalysisCommon.qll @@ -10,11 +10,12 @@ private import codeql.rangeanalysis.RangeAnalysis private import RangeAnalysisImpl private import SignAnalysisSpecific as Specific private import semmle.code.cpp.rangeanalysis.new.internal.semantic.Semantic +private import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticLocation private import ConstantAnalysis private import Sign module SignAnalysis { - private import codeql.rangeanalysis.internal.RangeUtils::MakeUtils + private import codeql.rangeanalysis.internal.RangeUtils::MakeUtils /** * An SSA definition for which the analysis can compute the sign. From 218bc8069bfda0b492040e0b7c8940fc3d0dc8d4 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 18 Dec 2024 11:50:08 +0100 Subject: [PATCH 03/71] Rust: exclude extraction of code excluded by `cfg` --- rust/ast-generator/src/main.rs | 28 +- rust/extractor/src/translate/base.rs | 47 +- rust/extractor/src/translate/generated.rs | 1660 +++++++++-------- .../options/cfg/functions.ql | 1 - .../options/features/functions.ql | 1 - .../options/target/functions.ql | 1 - 6 files changed, 915 insertions(+), 823 deletions(-) diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index 1e1e9613128..e1d44a0a0f0 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -4,6 +4,7 @@ use std::{fs, path::PathBuf}; pub mod codegen; mod flags; use codegen::grammar::ast_src::{AstNodeSrc, AstSrc, Field}; +use itertools::Itertools; use std::collections::{BTreeMap, BTreeSet}; use std::env; use ungrammar::Grammar; @@ -475,10 +476,10 @@ use ra_ap_syntax::ast::{{ use ra_ap_syntax::{{ast, AstNode}}; impl Translator<'_> {{ - fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Label {{ + fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Option> {{ match node {{ - ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).into(), - ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).into(), + ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into), + ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).map(Into::into), }} }}\n" )?; @@ -488,7 +489,7 @@ impl Translator<'_> {{ writeln!( buf, - " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label {{", + " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option> {{", to_lower_snake_case(type_name), type_name, class_name @@ -497,7 +498,7 @@ impl Translator<'_> {{ for variant in &node.variants { writeln!( buf, - " ast::{}::{}(inner) => self.emit_{}(inner).into(),", + " ast::{}::{}(inner) => self.emit_{}(inner).map(Into::into),", type_name, variant, to_lower_snake_case(variant) @@ -513,7 +514,7 @@ impl Translator<'_> {{ writeln!( buf, - " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Label {{", + " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option> {{", to_lower_snake_case(type_name), type_name, class_name @@ -523,6 +524,15 @@ impl Translator<'_> {{ continue; } + if field.name == "attrs" { + // special case: this means the node type implements `HasAttrs`, and we want to + // check whether it was not excluded by a `cfg` attribute + writeln!( + buf, + " if self.should_be_excluded(&node) {{ return None; }}" + )?; + } + let type_name = &field.tp; let struct_field_name = &field.name; let class_field_name = property_name(&node.name, &field.name); @@ -542,7 +552,7 @@ impl Translator<'_> {{ } else if field.is_many { writeln!( buf, - " let {} = node.{}().map(|x| self.emit_{}(x)).collect();", + " let {} = node.{}().filter_map(|x| self.emit_{}(x)).collect();", class_field_name, struct_field_name, to_lower_snake_case(type_name) @@ -550,7 +560,7 @@ impl Translator<'_> {{ } else { writeln!( buf, - " let {} = node.{}().map(|x| self.emit_{}(x));", + " let {} = node.{}().and_then(|x| self.emit_{}(x));", class_field_name, struct_field_name, to_lower_snake_case(type_name) @@ -582,7 +592,7 @@ impl Translator<'_> {{ buf, " self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens());" )?; - writeln!(buf, " label")?; + writeln!(buf, " Some(label)")?; writeln!(buf, " }}\n")?; } diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index ac13676e690..40f73cd8908 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -1,5 +1,4 @@ use super::mappings::{AddressableAst, AddressableHir, PathAst}; -use crate::generated::MacroCall; use crate::generated::{self}; use crate::rust_analyzer::FileSemanticInformation; use crate::trap::{DiagnosticSeverity, TrapFile, TrapId}; @@ -267,22 +266,22 @@ impl<'a> Translator<'a> { expanded: SyntaxNode, ) -> Option> { match expand_to { - ra_ap_hir_expand::ExpandTo::Statements => { - ast::MacroStmts::cast(expanded).map(|x| self.emit_macro_stmts(x).into()) - } - ra_ap_hir_expand::ExpandTo::Items => { - ast::MacroItems::cast(expanded).map(|x| self.emit_macro_items(x).into()) - } + ra_ap_hir_expand::ExpandTo::Statements => ast::MacroStmts::cast(expanded) + .and_then(|x| self.emit_macro_stmts(x)) + .map(Into::into), + ra_ap_hir_expand::ExpandTo::Items => ast::MacroItems::cast(expanded) + .and_then(|x| self.emit_macro_items(x)) + .map(Into::into), - ra_ap_hir_expand::ExpandTo::Pattern => { - ast::Pat::cast(expanded).map(|x| self.emit_pat(x).into()) - } - ra_ap_hir_expand::ExpandTo::Type => { - ast::Type::cast(expanded).map(|x| self.emit_type(x).into()) - } - ra_ap_hir_expand::ExpandTo::Expr => { - ast::Expr::cast(expanded).map(|x| self.emit_expr(x).into()) - } + ra_ap_hir_expand::ExpandTo::Pattern => ast::Pat::cast(expanded) + .and_then(|x| self.emit_pat(x)) + .map(Into::into), + ra_ap_hir_expand::ExpandTo::Type => ast::Type::cast(expanded) + .and_then(|x| self.emit_type(x)) + .map(Into::into), + ra_ap_hir_expand::ExpandTo::Expr => ast::Expr::cast(expanded) + .and_then(|x| self.emit_expr(x)) + .map(Into::into), } } pub(crate) fn extract_macro_call_expanded( @@ -295,7 +294,7 @@ impl<'a> Translator<'a> { let expand_to = ra_ap_hir_expand::ExpandTo::from_call_site(mcall); let kind = expanded.kind(); if let Some(value) = self.emit_expanded_as(expand_to, expanded) { - MacroCall::emit_expanded(label, value, &mut self.trap.writer); + generated::MacroCall::emit_expanded(label, value, &mut self.trap.writer); } else { let range = self.text_range_for_node(mcall); self.emit_parse_error(mcall, &SyntaxError::new( @@ -559,4 +558,18 @@ impl<'a> Translator<'a> { Some(()) })(); } + + pub(crate) fn should_be_excluded(&self, item: &impl ast::HasAttrs) -> bool { + let Some(sema) = self.semantics else { + return false; + }; + for attr in item.attrs() { + if let Some((name, tokens)) = attr.as_simple_call() { + if name == "cfg" && sema.check_cfg_attr(&tokens) == Some(false) { + return true; + } + } + } + false + } } diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index 9116ae67c21..9a811ebb564 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -14,191 +14,191 @@ use ra_ap_syntax::ast::{ use ra_ap_syntax::{ast, AstNode}; impl Translator<'_> { - fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Label { + fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Option> { match node { - ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).into(), - ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).into(), + ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into), + ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).map(Into::into), } } - pub(crate) fn emit_asm_operand(&mut self, node: ast::AsmOperand) -> Label { + pub(crate) fn emit_asm_operand(&mut self, node: ast::AsmOperand) -> Option> { match node { - ast::AsmOperand::AsmConst(inner) => self.emit_asm_const(inner).into(), - ast::AsmOperand::AsmLabel(inner) => self.emit_asm_label(inner).into(), - ast::AsmOperand::AsmRegOperand(inner) => self.emit_asm_reg_operand(inner).into(), - ast::AsmOperand::AsmSym(inner) => self.emit_asm_sym(inner).into(), + ast::AsmOperand::AsmConst(inner) => self.emit_asm_const(inner).map(Into::into), + ast::AsmOperand::AsmLabel(inner) => self.emit_asm_label(inner).map(Into::into), + ast::AsmOperand::AsmRegOperand(inner) => self.emit_asm_reg_operand(inner).map(Into::into), + ast::AsmOperand::AsmSym(inner) => self.emit_asm_sym(inner).map(Into::into), } } - pub(crate) fn emit_asm_piece(&mut self, node: ast::AsmPiece) -> Label { + pub(crate) fn emit_asm_piece(&mut self, node: ast::AsmPiece) -> Option> { match node { - ast::AsmPiece::AsmClobberAbi(inner) => self.emit_asm_clobber_abi(inner).into(), - ast::AsmPiece::AsmOperandNamed(inner) => self.emit_asm_operand_named(inner).into(), - ast::AsmPiece::AsmOptions(inner) => self.emit_asm_options(inner).into(), + ast::AsmPiece::AsmClobberAbi(inner) => self.emit_asm_clobber_abi(inner).map(Into::into), + ast::AsmPiece::AsmOperandNamed(inner) => self.emit_asm_operand_named(inner).map(Into::into), + ast::AsmPiece::AsmOptions(inner) => self.emit_asm_options(inner).map(Into::into), } } - pub(crate) fn emit_assoc_item(&mut self, node: ast::AssocItem) -> Label { + pub(crate) fn emit_assoc_item(&mut self, node: ast::AssocItem) -> Option> { match node { - ast::AssocItem::Const(inner) => self.emit_const(inner).into(), - ast::AssocItem::Fn(inner) => self.emit_fn(inner).into(), - ast::AssocItem::MacroCall(inner) => self.emit_macro_call(inner).into(), - ast::AssocItem::TypeAlias(inner) => self.emit_type_alias(inner).into(), + ast::AssocItem::Const(inner) => self.emit_const(inner).map(Into::into), + ast::AssocItem::Fn(inner) => self.emit_fn(inner).map(Into::into), + ast::AssocItem::MacroCall(inner) => self.emit_macro_call(inner).map(Into::into), + ast::AssocItem::TypeAlias(inner) => self.emit_type_alias(inner).map(Into::into), } } - pub(crate) fn emit_expr(&mut self, node: ast::Expr) -> Label { + pub(crate) fn emit_expr(&mut self, node: ast::Expr) -> Option> { match node { - ast::Expr::ArrayExpr(inner) => self.emit_array_expr(inner).into(), - ast::Expr::AsmExpr(inner) => self.emit_asm_expr(inner).into(), - ast::Expr::AwaitExpr(inner) => self.emit_await_expr(inner).into(), - ast::Expr::BecomeExpr(inner) => self.emit_become_expr(inner).into(), - ast::Expr::BinExpr(inner) => self.emit_bin_expr(inner).into(), - ast::Expr::BlockExpr(inner) => self.emit_block_expr(inner).into(), - ast::Expr::BreakExpr(inner) => self.emit_break_expr(inner).into(), - ast::Expr::CallExpr(inner) => self.emit_call_expr(inner).into(), - ast::Expr::CastExpr(inner) => self.emit_cast_expr(inner).into(), - ast::Expr::ClosureExpr(inner) => self.emit_closure_expr(inner).into(), - ast::Expr::ContinueExpr(inner) => self.emit_continue_expr(inner).into(), - ast::Expr::FieldExpr(inner) => self.emit_field_expr(inner).into(), - ast::Expr::ForExpr(inner) => self.emit_for_expr(inner).into(), - ast::Expr::FormatArgsExpr(inner) => self.emit_format_args_expr(inner).into(), - ast::Expr::IfExpr(inner) => self.emit_if_expr(inner).into(), - ast::Expr::IndexExpr(inner) => self.emit_index_expr(inner).into(), - ast::Expr::LetExpr(inner) => self.emit_let_expr(inner).into(), - ast::Expr::Literal(inner) => self.emit_literal(inner).into(), - ast::Expr::LoopExpr(inner) => self.emit_loop_expr(inner).into(), - ast::Expr::MacroExpr(inner) => self.emit_macro_expr(inner).into(), - ast::Expr::MatchExpr(inner) => self.emit_match_expr(inner).into(), - ast::Expr::MethodCallExpr(inner) => self.emit_method_call_expr(inner).into(), - ast::Expr::OffsetOfExpr(inner) => self.emit_offset_of_expr(inner).into(), - ast::Expr::ParenExpr(inner) => self.emit_paren_expr(inner).into(), - ast::Expr::PathExpr(inner) => self.emit_path_expr(inner).into(), - ast::Expr::PrefixExpr(inner) => self.emit_prefix_expr(inner).into(), - ast::Expr::RangeExpr(inner) => self.emit_range_expr(inner).into(), - ast::Expr::RecordExpr(inner) => self.emit_record_expr(inner).into(), - ast::Expr::RefExpr(inner) => self.emit_ref_expr(inner).into(), - ast::Expr::ReturnExpr(inner) => self.emit_return_expr(inner).into(), - ast::Expr::TryExpr(inner) => self.emit_try_expr(inner).into(), - ast::Expr::TupleExpr(inner) => self.emit_tuple_expr(inner).into(), - ast::Expr::UnderscoreExpr(inner) => self.emit_underscore_expr(inner).into(), - ast::Expr::WhileExpr(inner) => self.emit_while_expr(inner).into(), - ast::Expr::YeetExpr(inner) => self.emit_yeet_expr(inner).into(), - ast::Expr::YieldExpr(inner) => self.emit_yield_expr(inner).into(), + ast::Expr::ArrayExpr(inner) => self.emit_array_expr(inner).map(Into::into), + ast::Expr::AsmExpr(inner) => self.emit_asm_expr(inner).map(Into::into), + ast::Expr::AwaitExpr(inner) => self.emit_await_expr(inner).map(Into::into), + ast::Expr::BecomeExpr(inner) => self.emit_become_expr(inner).map(Into::into), + ast::Expr::BinExpr(inner) => self.emit_bin_expr(inner).map(Into::into), + ast::Expr::BlockExpr(inner) => self.emit_block_expr(inner).map(Into::into), + ast::Expr::BreakExpr(inner) => self.emit_break_expr(inner).map(Into::into), + ast::Expr::CallExpr(inner) => self.emit_call_expr(inner).map(Into::into), + ast::Expr::CastExpr(inner) => self.emit_cast_expr(inner).map(Into::into), + ast::Expr::ClosureExpr(inner) => self.emit_closure_expr(inner).map(Into::into), + ast::Expr::ContinueExpr(inner) => self.emit_continue_expr(inner).map(Into::into), + ast::Expr::FieldExpr(inner) => self.emit_field_expr(inner).map(Into::into), + ast::Expr::ForExpr(inner) => self.emit_for_expr(inner).map(Into::into), + ast::Expr::FormatArgsExpr(inner) => self.emit_format_args_expr(inner).map(Into::into), + ast::Expr::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into), + ast::Expr::IndexExpr(inner) => self.emit_index_expr(inner).map(Into::into), + ast::Expr::LetExpr(inner) => self.emit_let_expr(inner).map(Into::into), + ast::Expr::Literal(inner) => self.emit_literal(inner).map(Into::into), + ast::Expr::LoopExpr(inner) => self.emit_loop_expr(inner).map(Into::into), + ast::Expr::MacroExpr(inner) => self.emit_macro_expr(inner).map(Into::into), + ast::Expr::MatchExpr(inner) => self.emit_match_expr(inner).map(Into::into), + ast::Expr::MethodCallExpr(inner) => self.emit_method_call_expr(inner).map(Into::into), + ast::Expr::OffsetOfExpr(inner) => self.emit_offset_of_expr(inner).map(Into::into), + ast::Expr::ParenExpr(inner) => self.emit_paren_expr(inner).map(Into::into), + ast::Expr::PathExpr(inner) => self.emit_path_expr(inner).map(Into::into), + ast::Expr::PrefixExpr(inner) => self.emit_prefix_expr(inner).map(Into::into), + ast::Expr::RangeExpr(inner) => self.emit_range_expr(inner).map(Into::into), + ast::Expr::RecordExpr(inner) => self.emit_record_expr(inner).map(Into::into), + ast::Expr::RefExpr(inner) => self.emit_ref_expr(inner).map(Into::into), + ast::Expr::ReturnExpr(inner) => self.emit_return_expr(inner).map(Into::into), + ast::Expr::TryExpr(inner) => self.emit_try_expr(inner).map(Into::into), + ast::Expr::TupleExpr(inner) => self.emit_tuple_expr(inner).map(Into::into), + ast::Expr::UnderscoreExpr(inner) => self.emit_underscore_expr(inner).map(Into::into), + ast::Expr::WhileExpr(inner) => self.emit_while_expr(inner).map(Into::into), + ast::Expr::YeetExpr(inner) => self.emit_yeet_expr(inner).map(Into::into), + ast::Expr::YieldExpr(inner) => self.emit_yield_expr(inner).map(Into::into), } } - pub(crate) fn emit_extern_item(&mut self, node: ast::ExternItem) -> Label { + pub(crate) fn emit_extern_item(&mut self, node: ast::ExternItem) -> Option> { match node { - ast::ExternItem::Fn(inner) => self.emit_fn(inner).into(), - ast::ExternItem::MacroCall(inner) => self.emit_macro_call(inner).into(), - ast::ExternItem::Static(inner) => self.emit_static(inner).into(), - ast::ExternItem::TypeAlias(inner) => self.emit_type_alias(inner).into(), + ast::ExternItem::Fn(inner) => self.emit_fn(inner).map(Into::into), + ast::ExternItem::MacroCall(inner) => self.emit_macro_call(inner).map(Into::into), + ast::ExternItem::Static(inner) => self.emit_static(inner).map(Into::into), + ast::ExternItem::TypeAlias(inner) => self.emit_type_alias(inner).map(Into::into), } } - pub(crate) fn emit_field_list(&mut self, node: ast::FieldList) -> Label { + pub(crate) fn emit_field_list(&mut self, node: ast::FieldList) -> Option> { match node { - ast::FieldList::RecordFieldList(inner) => self.emit_record_field_list(inner).into(), - ast::FieldList::TupleFieldList(inner) => self.emit_tuple_field_list(inner).into(), + ast::FieldList::RecordFieldList(inner) => self.emit_record_field_list(inner).map(Into::into), + ast::FieldList::TupleFieldList(inner) => self.emit_tuple_field_list(inner).map(Into::into), } } - pub(crate) fn emit_generic_arg(&mut self, node: ast::GenericArg) -> Label { + pub(crate) fn emit_generic_arg(&mut self, node: ast::GenericArg) -> Option> { match node { - ast::GenericArg::AssocTypeArg(inner) => self.emit_assoc_type_arg(inner).into(), - ast::GenericArg::ConstArg(inner) => self.emit_const_arg(inner).into(), - ast::GenericArg::LifetimeArg(inner) => self.emit_lifetime_arg(inner).into(), - ast::GenericArg::TypeArg(inner) => self.emit_type_arg(inner).into(), + ast::GenericArg::AssocTypeArg(inner) => self.emit_assoc_type_arg(inner).map(Into::into), + ast::GenericArg::ConstArg(inner) => self.emit_const_arg(inner).map(Into::into), + ast::GenericArg::LifetimeArg(inner) => self.emit_lifetime_arg(inner).map(Into::into), + ast::GenericArg::TypeArg(inner) => self.emit_type_arg(inner).map(Into::into), } } - pub(crate) fn emit_generic_param(&mut self, node: ast::GenericParam) -> Label { + pub(crate) fn emit_generic_param(&mut self, node: ast::GenericParam) -> Option> { match node { - ast::GenericParam::ConstParam(inner) => self.emit_const_param(inner).into(), - ast::GenericParam::LifetimeParam(inner) => self.emit_lifetime_param(inner).into(), - ast::GenericParam::TypeParam(inner) => self.emit_type_param(inner).into(), + ast::GenericParam::ConstParam(inner) => self.emit_const_param(inner).map(Into::into), + ast::GenericParam::LifetimeParam(inner) => self.emit_lifetime_param(inner).map(Into::into), + ast::GenericParam::TypeParam(inner) => self.emit_type_param(inner).map(Into::into), } } - pub(crate) fn emit_pat(&mut self, node: ast::Pat) -> Label { + pub(crate) fn emit_pat(&mut self, node: ast::Pat) -> Option> { match node { - ast::Pat::BoxPat(inner) => self.emit_box_pat(inner).into(), - ast::Pat::ConstBlockPat(inner) => self.emit_const_block_pat(inner).into(), - ast::Pat::IdentPat(inner) => self.emit_ident_pat(inner).into(), - ast::Pat::LiteralPat(inner) => self.emit_literal_pat(inner).into(), - ast::Pat::MacroPat(inner) => self.emit_macro_pat(inner).into(), - ast::Pat::OrPat(inner) => self.emit_or_pat(inner).into(), - ast::Pat::ParenPat(inner) => self.emit_paren_pat(inner).into(), - ast::Pat::PathPat(inner) => self.emit_path_pat(inner).into(), - ast::Pat::RangePat(inner) => self.emit_range_pat(inner).into(), - ast::Pat::RecordPat(inner) => self.emit_record_pat(inner).into(), - ast::Pat::RefPat(inner) => self.emit_ref_pat(inner).into(), - ast::Pat::RestPat(inner) => self.emit_rest_pat(inner).into(), - ast::Pat::SlicePat(inner) => self.emit_slice_pat(inner).into(), - ast::Pat::TuplePat(inner) => self.emit_tuple_pat(inner).into(), - ast::Pat::TupleStructPat(inner) => self.emit_tuple_struct_pat(inner).into(), - ast::Pat::WildcardPat(inner) => self.emit_wildcard_pat(inner).into(), + ast::Pat::BoxPat(inner) => self.emit_box_pat(inner).map(Into::into), + ast::Pat::ConstBlockPat(inner) => self.emit_const_block_pat(inner).map(Into::into), + ast::Pat::IdentPat(inner) => self.emit_ident_pat(inner).map(Into::into), + ast::Pat::LiteralPat(inner) => self.emit_literal_pat(inner).map(Into::into), + ast::Pat::MacroPat(inner) => self.emit_macro_pat(inner).map(Into::into), + ast::Pat::OrPat(inner) => self.emit_or_pat(inner).map(Into::into), + ast::Pat::ParenPat(inner) => self.emit_paren_pat(inner).map(Into::into), + ast::Pat::PathPat(inner) => self.emit_path_pat(inner).map(Into::into), + ast::Pat::RangePat(inner) => self.emit_range_pat(inner).map(Into::into), + ast::Pat::RecordPat(inner) => self.emit_record_pat(inner).map(Into::into), + ast::Pat::RefPat(inner) => self.emit_ref_pat(inner).map(Into::into), + ast::Pat::RestPat(inner) => self.emit_rest_pat(inner).map(Into::into), + ast::Pat::SlicePat(inner) => self.emit_slice_pat(inner).map(Into::into), + ast::Pat::TuplePat(inner) => self.emit_tuple_pat(inner).map(Into::into), + ast::Pat::TupleStructPat(inner) => self.emit_tuple_struct_pat(inner).map(Into::into), + ast::Pat::WildcardPat(inner) => self.emit_wildcard_pat(inner).map(Into::into), } } - pub(crate) fn emit_stmt(&mut self, node: ast::Stmt) -> Label { + pub(crate) fn emit_stmt(&mut self, node: ast::Stmt) -> Option> { match node { - ast::Stmt::ExprStmt(inner) => self.emit_expr_stmt(inner).into(), - ast::Stmt::Item(inner) => self.emit_item(inner).into(), - ast::Stmt::LetStmt(inner) => self.emit_let_stmt(inner).into(), + ast::Stmt::ExprStmt(inner) => self.emit_expr_stmt(inner).map(Into::into), + ast::Stmt::Item(inner) => self.emit_item(inner).map(Into::into), + ast::Stmt::LetStmt(inner) => self.emit_let_stmt(inner).map(Into::into), } } - pub(crate) fn emit_type(&mut self, node: ast::Type) -> Label { + pub(crate) fn emit_type(&mut self, node: ast::Type) -> Option> { match node { - ast::Type::ArrayType(inner) => self.emit_array_type(inner).into(), - ast::Type::DynTraitType(inner) => self.emit_dyn_trait_type(inner).into(), - ast::Type::FnPtrType(inner) => self.emit_fn_ptr_type(inner).into(), - ast::Type::ForType(inner) => self.emit_for_type(inner).into(), - ast::Type::ImplTraitType(inner) => self.emit_impl_trait_type(inner).into(), - ast::Type::InferType(inner) => self.emit_infer_type(inner).into(), - ast::Type::MacroType(inner) => self.emit_macro_type(inner).into(), - ast::Type::NeverType(inner) => self.emit_never_type(inner).into(), - ast::Type::ParenType(inner) => self.emit_paren_type(inner).into(), - ast::Type::PathType(inner) => self.emit_path_type(inner).into(), - ast::Type::PtrType(inner) => self.emit_ptr_type(inner).into(), - ast::Type::RefType(inner) => self.emit_ref_type(inner).into(), - ast::Type::SliceType(inner) => self.emit_slice_type(inner).into(), - ast::Type::TupleType(inner) => self.emit_tuple_type(inner).into(), + ast::Type::ArrayType(inner) => self.emit_array_type(inner).map(Into::into), + ast::Type::DynTraitType(inner) => self.emit_dyn_trait_type(inner).map(Into::into), + ast::Type::FnPtrType(inner) => self.emit_fn_ptr_type(inner).map(Into::into), + ast::Type::ForType(inner) => self.emit_for_type(inner).map(Into::into), + ast::Type::ImplTraitType(inner) => self.emit_impl_trait_type(inner).map(Into::into), + ast::Type::InferType(inner) => self.emit_infer_type(inner).map(Into::into), + ast::Type::MacroType(inner) => self.emit_macro_type(inner).map(Into::into), + ast::Type::NeverType(inner) => self.emit_never_type(inner).map(Into::into), + ast::Type::ParenType(inner) => self.emit_paren_type(inner).map(Into::into), + ast::Type::PathType(inner) => self.emit_path_type(inner).map(Into::into), + ast::Type::PtrType(inner) => self.emit_ptr_type(inner).map(Into::into), + ast::Type::RefType(inner) => self.emit_ref_type(inner).map(Into::into), + ast::Type::SliceType(inner) => self.emit_slice_type(inner).map(Into::into), + ast::Type::TupleType(inner) => self.emit_tuple_type(inner).map(Into::into), } } - pub(crate) fn emit_use_bound_generic_arg(&mut self, node: ast::UseBoundGenericArg) -> Label { + pub(crate) fn emit_use_bound_generic_arg(&mut self, node: ast::UseBoundGenericArg) -> Option> { match node { - ast::UseBoundGenericArg::Lifetime(inner) => self.emit_lifetime(inner).into(), - ast::UseBoundGenericArg::NameRef(inner) => self.emit_name_ref(inner).into(), + ast::UseBoundGenericArg::Lifetime(inner) => self.emit_lifetime(inner).map(Into::into), + ast::UseBoundGenericArg::NameRef(inner) => self.emit_name_ref(inner).map(Into::into), } } - pub(crate) fn emit_item(&mut self, node: ast::Item) -> Label { + pub(crate) fn emit_item(&mut self, node: ast::Item) -> Option> { match node { - ast::Item::Const(inner) => self.emit_const(inner).into(), - ast::Item::Enum(inner) => self.emit_enum(inner).into(), - ast::Item::ExternBlock(inner) => self.emit_extern_block(inner).into(), - ast::Item::ExternCrate(inner) => self.emit_extern_crate(inner).into(), - ast::Item::Fn(inner) => self.emit_fn(inner).into(), - ast::Item::Impl(inner) => self.emit_impl(inner).into(), - ast::Item::MacroCall(inner) => self.emit_macro_call(inner).into(), - ast::Item::MacroDef(inner) => self.emit_macro_def(inner).into(), - ast::Item::MacroRules(inner) => self.emit_macro_rules(inner).into(), - ast::Item::Module(inner) => self.emit_module(inner).into(), - ast::Item::Static(inner) => self.emit_static(inner).into(), - ast::Item::Struct(inner) => self.emit_struct(inner).into(), - ast::Item::Trait(inner) => self.emit_trait(inner).into(), - ast::Item::TraitAlias(inner) => self.emit_trait_alias(inner).into(), - ast::Item::TypeAlias(inner) => self.emit_type_alias(inner).into(), - ast::Item::Union(inner) => self.emit_union(inner).into(), - ast::Item::Use(inner) => self.emit_use(inner).into(), + ast::Item::Const(inner) => self.emit_const(inner).map(Into::into), + ast::Item::Enum(inner) => self.emit_enum(inner).map(Into::into), + ast::Item::ExternBlock(inner) => self.emit_extern_block(inner).map(Into::into), + ast::Item::ExternCrate(inner) => self.emit_extern_crate(inner).map(Into::into), + ast::Item::Fn(inner) => self.emit_fn(inner).map(Into::into), + ast::Item::Impl(inner) => self.emit_impl(inner).map(Into::into), + ast::Item::MacroCall(inner) => self.emit_macro_call(inner).map(Into::into), + ast::Item::MacroDef(inner) => self.emit_macro_def(inner).map(Into::into), + ast::Item::MacroRules(inner) => self.emit_macro_rules(inner).map(Into::into), + ast::Item::Module(inner) => self.emit_module(inner).map(Into::into), + ast::Item::Static(inner) => self.emit_static(inner).map(Into::into), + ast::Item::Struct(inner) => self.emit_struct(inner).map(Into::into), + ast::Item::Trait(inner) => self.emit_trait(inner).map(Into::into), + ast::Item::TraitAlias(inner) => self.emit_trait_alias(inner).map(Into::into), + ast::Item::TypeAlias(inner) => self.emit_type_alias(inner).map(Into::into), + ast::Item::Union(inner) => self.emit_union(inner).map(Into::into), + ast::Item::Use(inner) => self.emit_use(inner).map(Into::into), } } - pub(crate) fn emit_abi(&mut self, node: ast::Abi) -> Label { + pub(crate) fn emit_abi(&mut self, node: ast::Abi) -> Option> { let abi_string = node.try_get_text(); let label = self.trap.emit(generated::Abi { id: TrapId::Star, @@ -207,11 +207,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Abi, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_arg_list(&mut self, node: ast::ArgList) -> Label { - let args = node.args().map(|x| self.emit_expr(x)).collect(); + pub(crate) fn emit_arg_list(&mut self, node: ast::ArgList) -> Option> { + let args = node.args().filter_map(|x| self.emit_expr(x)).collect(); let label = self.trap.emit(generated::ArgList { id: TrapId::Star, args, @@ -219,12 +219,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ArgList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_array_expr(&mut self, node: ast::ArrayExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let exprs = node.exprs().map(|x| self.emit_expr(x)).collect(); + pub(crate) fn emit_array_expr(&mut self, node: ast::ArrayExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let exprs = node.exprs().filter_map(|x| self.emit_expr(x)).collect(); let is_semicolon = node.semicolon_token().is_some(); let label = self.trap.emit(generated::ArrayExprInternal { id: TrapId::Star, @@ -235,12 +236,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ArrayExprInternal, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_array_type(&mut self, node: ast::ArrayType) -> Label { - let const_arg = node.const_arg().map(|x| self.emit_const_arg(x)); - let element_type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_array_type(&mut self, node: ast::ArrayType) -> Option> { + let const_arg = node.const_arg().and_then(|x| self.emit_const_arg(x)); + let element_type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::ArrayTypeRepr { id: TrapId::Star, const_arg, @@ -249,21 +250,21 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ArrayTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_clobber_abi(&mut self, node: ast::AsmClobberAbi) -> Label { + pub(crate) fn emit_asm_clobber_abi(&mut self, node: ast::AsmClobberAbi) -> Option> { let label = self.trap.emit(generated::AsmClobberAbi { id: TrapId::Star, }); self.emit_location(label, &node); emit_detached!(AsmClobberAbi, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_const(&mut self, node: ast::AsmConst) -> Label { - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_asm_const(&mut self, node: ast::AsmConst) -> Option> { + let expr = node.expr().and_then(|x| self.emit_expr(x)); let is_const = node.const_token().is_some(); let label = self.trap.emit(generated::AsmConst { id: TrapId::Star, @@ -273,23 +274,24 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmConst, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_dir_spec(&mut self, node: ast::AsmDirSpec) -> Label { + pub(crate) fn emit_asm_dir_spec(&mut self, node: ast::AsmDirSpec) -> Option> { let label = self.trap.emit(generated::AsmDirSpec { id: TrapId::Star, }); self.emit_location(label, &node); emit_detached!(AsmDirSpec, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_expr(&mut self, node: ast::AsmExpr) -> Label { - let asm_pieces = node.asm_pieces().map(|x| self.emit_asm_piece(x)).collect(); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let template = node.template().map(|x| self.emit_expr(x)).collect(); + pub(crate) fn emit_asm_expr(&mut self, node: ast::AsmExpr) -> Option> { + let asm_pieces = node.asm_pieces().filter_map(|x| self.emit_asm_piece(x)).collect(); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let template = node.template().filter_map(|x| self.emit_expr(x)).collect(); let label = self.trap.emit(generated::AsmExpr { id: TrapId::Star, asm_pieces, @@ -299,11 +301,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_label(&mut self, node: ast::AsmLabel) -> Label { - let block_expr = node.block_expr().map(|x| self.emit_block_expr(x)); + pub(crate) fn emit_asm_label(&mut self, node: ast::AsmLabel) -> Option> { + let block_expr = node.block_expr().and_then(|x| self.emit_block_expr(x)); let label = self.trap.emit(generated::AsmLabel { id: TrapId::Star, block_expr, @@ -311,12 +313,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmLabel, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_operand_expr(&mut self, node: ast::AsmOperandExpr) -> Label { - let in_expr = node.in_expr().map(|x| self.emit_expr(x)); - let out_expr = node.out_expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_asm_operand_expr(&mut self, node: ast::AsmOperandExpr) -> Option> { + let in_expr = node.in_expr().and_then(|x| self.emit_expr(x)); + let out_expr = node.out_expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::AsmOperandExpr { id: TrapId::Star, in_expr, @@ -325,12 +327,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmOperandExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_operand_named(&mut self, node: ast::AsmOperandNamed) -> Label { - let asm_operand = node.asm_operand().map(|x| self.emit_asm_operand(x)); - let name = node.name().map(|x| self.emit_name(x)); + pub(crate) fn emit_asm_operand_named(&mut self, node: ast::AsmOperandNamed) -> Option> { + let asm_operand = node.asm_operand().and_then(|x| self.emit_asm_operand(x)); + let name = node.name().and_then(|x| self.emit_name(x)); let label = self.trap.emit(generated::AsmOperandNamed { id: TrapId::Star, asm_operand, @@ -339,10 +341,10 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmOperandNamed, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_option(&mut self, node: ast::AsmOption) -> Label { + pub(crate) fn emit_asm_option(&mut self, node: ast::AsmOption) -> Option> { let is_raw = node.raw_token().is_some(); let label = self.trap.emit(generated::AsmOption { id: TrapId::Star, @@ -351,11 +353,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmOption, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_options(&mut self, node: ast::AsmOptions) -> Label { - let asm_options = node.asm_options().map(|x| self.emit_asm_option(x)).collect(); + pub(crate) fn emit_asm_options(&mut self, node: ast::AsmOptions) -> Option> { + let asm_options = node.asm_options().filter_map(|x| self.emit_asm_option(x)).collect(); let label = self.trap.emit(generated::AsmOptionsList { id: TrapId::Star, asm_options, @@ -363,13 +365,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmOptionsList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_reg_operand(&mut self, node: ast::AsmRegOperand) -> Label { - let asm_dir_spec = node.asm_dir_spec().map(|x| self.emit_asm_dir_spec(x)); - let asm_operand_expr = node.asm_operand_expr().map(|x| self.emit_asm_operand_expr(x)); - let asm_reg_spec = node.asm_reg_spec().map(|x| self.emit_asm_reg_spec(x)); + pub(crate) fn emit_asm_reg_operand(&mut self, node: ast::AsmRegOperand) -> Option> { + let asm_dir_spec = node.asm_dir_spec().and_then(|x| self.emit_asm_dir_spec(x)); + let asm_operand_expr = node.asm_operand_expr().and_then(|x| self.emit_asm_operand_expr(x)); + let asm_reg_spec = node.asm_reg_spec().and_then(|x| self.emit_asm_reg_spec(x)); let label = self.trap.emit(generated::AsmRegOperand { id: TrapId::Star, asm_dir_spec, @@ -379,11 +381,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmRegOperand, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_reg_spec(&mut self, node: ast::AsmRegSpec) -> Label { - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); + pub(crate) fn emit_asm_reg_spec(&mut self, node: ast::AsmRegSpec) -> Option> { + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); let label = self.trap.emit(generated::AsmRegSpec { id: TrapId::Star, name_ref, @@ -391,11 +393,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmRegSpec, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_asm_sym(&mut self, node: ast::AsmSym) -> Label { - let path = node.path().map(|x| self.emit_path(x)); + pub(crate) fn emit_asm_sym(&mut self, node: ast::AsmSym) -> Option> { + let path = node.path().and_then(|x| self.emit_path(x)); let label = self.trap.emit(generated::AsmSym { id: TrapId::Star, path, @@ -403,12 +405,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AsmSym, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_assoc_item_list(&mut self, node: ast::AssocItemList) -> Label { - let assoc_items = node.assoc_items().map(|x| self.emit_assoc_item(x)).collect(); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_assoc_item_list(&mut self, node: ast::AssocItemList) -> Option> { + let assoc_items = node.assoc_items().filter_map(|x| self.emit_assoc_item(x)).collect(); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let label = self.trap.emit(generated::AssocItemList { id: TrapId::Star, assoc_items, @@ -417,18 +420,18 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AssocItemList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_assoc_type_arg(&mut self, node: ast::AssocTypeArg) -> Label { - let const_arg = node.const_arg().map(|x| self.emit_const_arg(x)); - let generic_arg_list = node.generic_arg_list().map(|x| self.emit_generic_arg_list(x)); - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); - let param_list = node.param_list().map(|x| self.emit_param_list(x)); - let ret_type = node.ret_type().map(|x| self.emit_ret_type(x)); - let return_type_syntax = node.return_type_syntax().map(|x| self.emit_return_type_syntax(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); + pub(crate) fn emit_assoc_type_arg(&mut self, node: ast::AssocTypeArg) -> Option> { + let const_arg = node.const_arg().and_then(|x| self.emit_const_arg(x)); + let generic_arg_list = node.generic_arg_list().and_then(|x| self.emit_generic_arg_list(x)); + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); + let param_list = node.param_list().and_then(|x| self.emit_param_list(x)); + let ret_type = node.ret_type().and_then(|x| self.emit_ret_type(x)); + let return_type_syntax = node.return_type_syntax().and_then(|x| self.emit_return_type_syntax(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); let label = self.trap.emit(generated::AssocTypeArg { id: TrapId::Star, const_arg, @@ -443,11 +446,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AssocTypeArg, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_attr(&mut self, node: ast::Attr) -> Label { - let meta = node.meta().map(|x| self.emit_meta(x)); + pub(crate) fn emit_attr(&mut self, node: ast::Attr) -> Option> { + let meta = node.meta().and_then(|x| self.emit_meta(x)); let label = self.trap.emit(generated::Attr { id: TrapId::Star, meta, @@ -455,12 +458,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Attr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_await_expr(&mut self, node: ast::AwaitExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_await_expr(&mut self, node: ast::AwaitExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::AwaitExpr { id: TrapId::Star, attrs, @@ -469,12 +473,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(AwaitExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_become_expr(&mut self, node: ast::BecomeExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_become_expr(&mut self, node: ast::BecomeExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::BecomeExpr { id: TrapId::Star, attrs, @@ -483,14 +488,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(BecomeExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_bin_expr(&mut self, node: ast::BinExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let lhs = node.lhs().map(|x| self.emit_expr(x)); + pub(crate) fn emit_bin_expr(&mut self, node: ast::BinExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let lhs = node.lhs().and_then(|x| self.emit_expr(x)); let operator_name = node.try_get_text(); - let rhs = node.rhs().map(|x| self.emit_expr(x)); + let rhs = node.rhs().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::BinaryExpr { id: TrapId::Star, attrs, @@ -501,19 +507,20 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(BinaryExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_block_expr(&mut self, node: ast::BlockExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_block_expr(&mut self, node: ast::BlockExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let is_async = node.async_token().is_some(); let is_const = node.const_token().is_some(); let is_gen = node.gen_token().is_some(); let is_move = node.move_token().is_some(); let is_try = node.try_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); - let label = node.label().map(|x| self.emit_label(x)); - let stmt_list = node.stmt_list().map(|x| self.emit_stmt_list(x)); + let label = node.label().and_then(|x| self.emit_label(x)); + let stmt_list = node.stmt_list().and_then(|x| self.emit_stmt_list(x)); let label = self.trap.emit(generated::BlockExpr { id: TrapId::Star, attrs, @@ -529,11 +536,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(BlockExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_box_pat(&mut self, node: ast::BoxPat) -> Label { - let pat = node.pat().map(|x| self.emit_pat(x)); + pub(crate) fn emit_box_pat(&mut self, node: ast::BoxPat) -> Option> { + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::BoxPat { id: TrapId::Star, pat, @@ -541,13 +548,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(BoxPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_break_expr(&mut self, node: ast::BreakExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); + pub(crate) fn emit_break_expr(&mut self, node: ast::BreakExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); let label = self.trap.emit(generated::BreakExpr { id: TrapId::Star, attrs, @@ -557,13 +565,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(BreakExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_call_expr(&mut self, node: ast::CallExpr) -> Label { - let arg_list = node.arg_list().map(|x| self.emit_arg_list(x)); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let function = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_call_expr(&mut self, node: ast::CallExpr) -> Option> { + let arg_list = node.arg_list().and_then(|x| self.emit_arg_list(x)); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let function = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::CallExpr { id: TrapId::Star, arg_list, @@ -573,13 +582,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(CallExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_cast_expr(&mut self, node: ast::CastExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_cast_expr(&mut self, node: ast::CastExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::CastExpr { id: TrapId::Star, attrs, @@ -589,11 +599,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(CastExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_closure_binder(&mut self, node: ast::ClosureBinder) -> Label { - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); + pub(crate) fn emit_closure_binder(&mut self, node: ast::ClosureBinder) -> Option> { + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); let label = self.trap.emit(generated::ClosureBinder { id: TrapId::Star, generic_param_list, @@ -601,20 +611,21 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ClosureBinder, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_closure_expr(&mut self, node: ast::ClosureExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let body = node.body().map(|x| self.emit_expr(x)); - let closure_binder = node.closure_binder().map(|x| self.emit_closure_binder(x)); + pub(crate) fn emit_closure_expr(&mut self, node: ast::ClosureExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let body = node.body().and_then(|x| self.emit_expr(x)); + let closure_binder = node.closure_binder().and_then(|x| self.emit_closure_binder(x)); let is_async = node.async_token().is_some(); let is_const = node.const_token().is_some(); let is_gen = node.gen_token().is_some(); let is_move = node.move_token().is_some(); let is_static = node.static_token().is_some(); - let param_list = node.param_list().map(|x| self.emit_param_list(x)); - let ret_type = node.ret_type().map(|x| self.emit_ret_type(x)); + let param_list = node.param_list().and_then(|x| self.emit_param_list(x)); + let ret_type = node.ret_type().and_then(|x| self.emit_ret_type(x)); let label = self.trap.emit(generated::ClosureExpr { id: TrapId::Star, attrs, @@ -631,17 +642,18 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ClosureExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_const(&mut self, node: ast::Const) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let body = node.body().map(|x| self.emit_expr(x)); + pub(crate) fn emit_const(&mut self, node: ast::Const) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let body = node.body().and_then(|x| self.emit_expr(x)); let is_const = node.const_token().is_some(); let is_default = node.default_token().is_some(); - let name = node.name().map(|x| self.emit_name(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::Const { id: TrapId::Star, attrs, @@ -655,11 +667,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Const, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_const_arg(&mut self, node: ast::ConstArg) -> Label { - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_const_arg(&mut self, node: ast::ConstArg) -> Option> { + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::ConstArg { id: TrapId::Star, expr, @@ -667,11 +679,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ConstArg, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_const_block_pat(&mut self, node: ast::ConstBlockPat) -> Label { - let block_expr = node.block_expr().map(|x| self.emit_block_expr(x)); + pub(crate) fn emit_const_block_pat(&mut self, node: ast::ConstBlockPat) -> Option> { + let block_expr = node.block_expr().and_then(|x| self.emit_block_expr(x)); let is_const = node.const_token().is_some(); let label = self.trap.emit(generated::ConstBlockPat { id: TrapId::Star, @@ -681,15 +693,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ConstBlockPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_const_param(&mut self, node: ast::ConstParam) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let default_val = node.default_val().map(|x| self.emit_const_arg(x)); + pub(crate) fn emit_const_param(&mut self, node: ast::ConstParam) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let default_val = node.default_val().and_then(|x| self.emit_const_arg(x)); let is_const = node.const_token().is_some(); - let name = node.name().map(|x| self.emit_name(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::ConstParam { id: TrapId::Star, attrs, @@ -701,12 +714,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ConstParam, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_continue_expr(&mut self, node: ast::ContinueExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); + pub(crate) fn emit_continue_expr(&mut self, node: ast::ContinueExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); let label = self.trap.emit(generated::ContinueExpr { id: TrapId::Star, attrs, @@ -715,11 +729,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ContinueExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_dyn_trait_type(&mut self, node: ast::DynTraitType) -> Label { - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); + pub(crate) fn emit_dyn_trait_type(&mut self, node: ast::DynTraitType) -> Option> { + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); let label = self.trap.emit(generated::DynTraitTypeRepr { id: TrapId::Star, type_bound_list, @@ -727,16 +741,17 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(DynTraitTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_enum(&mut self, node: ast::Enum) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); - let name = node.name().map(|x| self.emit_name(x)); - let variant_list = node.variant_list().map(|x| self.emit_variant_list(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + pub(crate) fn emit_enum(&mut self, node: ast::Enum) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let variant_list = node.variant_list().and_then(|x| self.emit_variant_list(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::Enum { id: TrapId::Star, attrs, @@ -749,11 +764,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Enum, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_expr_stmt(&mut self, node: ast::ExprStmt) -> Label { - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_expr_stmt(&mut self, node: ast::ExprStmt) -> Option> { + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::ExprStmt { id: TrapId::Star, expr, @@ -761,13 +776,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ExprStmt, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_extern_block(&mut self, node: ast::ExternBlock) -> Label { - let abi = node.abi().map(|x| self.emit_abi(x)); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let extern_item_list = node.extern_item_list().map(|x| self.emit_extern_item_list(x)); + pub(crate) fn emit_extern_block(&mut self, node: ast::ExternBlock) -> Option> { + let abi = node.abi().and_then(|x| self.emit_abi(x)); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let extern_item_list = node.extern_item_list().and_then(|x| self.emit_extern_item_list(x)); let is_unsafe = node.unsafe_token().is_some(); let label = self.trap.emit(generated::ExternBlock { id: TrapId::Star, @@ -779,14 +795,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ExternBlock, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_extern_crate(&mut self, node: ast::ExternCrate) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); - let rename = node.rename().map(|x| self.emit_rename(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_extern_crate(&mut self, node: ast::ExternCrate) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); + let rename = node.rename().and_then(|x| self.emit_rename(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::ExternCrate { id: TrapId::Star, attrs, @@ -797,12 +814,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ExternCrate, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_extern_item_list(&mut self, node: ast::ExternItemList) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let extern_items = node.extern_items().map(|x| self.emit_extern_item(x)).collect(); + pub(crate) fn emit_extern_item_list(&mut self, node: ast::ExternItemList) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let extern_items = node.extern_items().filter_map(|x| self.emit_extern_item(x)).collect(); let label = self.trap.emit(generated::ExternItemList { id: TrapId::Star, attrs, @@ -811,13 +829,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ExternItemList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_field_expr(&mut self, node: ast::FieldExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); + pub(crate) fn emit_field_expr(&mut self, node: ast::FieldExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); let label = self.trap.emit(generated::FieldExpr { id: TrapId::Star, attrs, @@ -827,24 +846,25 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(FieldExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_fn(&mut self, node: ast::Fn) -> Label { - let abi = node.abi().map(|x| self.emit_abi(x)); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let body = node.body().map(|x| self.emit_block_expr(x)); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); + pub(crate) fn emit_fn(&mut self, node: ast::Fn) -> Option> { + let abi = node.abi().and_then(|x| self.emit_abi(x)); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let body = node.body().and_then(|x| self.emit_block_expr(x)); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); let is_async = node.async_token().is_some(); let is_const = node.const_token().is_some(); let is_default = node.default_token().is_some(); let is_gen = node.gen_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); - let name = node.name().map(|x| self.emit_name(x)); - let param_list = node.param_list().map(|x| self.emit_param_list(x)); - let ret_type = node.ret_type().map(|x| self.emit_ret_type(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let param_list = node.param_list().and_then(|x| self.emit_param_list(x)); + let ret_type = node.ret_type().and_then(|x| self.emit_ret_type(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::Function { id: TrapId::Star, abi, @@ -865,16 +885,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Function, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_fn_ptr_type(&mut self, node: ast::FnPtrType) -> Label { - let abi = node.abi().map(|x| self.emit_abi(x)); + pub(crate) fn emit_fn_ptr_type(&mut self, node: ast::FnPtrType) -> Option> { + let abi = node.abi().and_then(|x| self.emit_abi(x)); let is_async = node.async_token().is_some(); let is_const = node.const_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); - let param_list = node.param_list().map(|x| self.emit_param_list(x)); - let ret_type = node.ret_type().map(|x| self.emit_ret_type(x)); + let param_list = node.param_list().and_then(|x| self.emit_param_list(x)); + let ret_type = node.ret_type().and_then(|x| self.emit_ret_type(x)); let label = self.trap.emit(generated::FnPtrTypeRepr { id: TrapId::Star, abi, @@ -887,15 +907,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(FnPtrTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_for_expr(&mut self, node: ast::ForExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let iterable = node.iterable().map(|x| self.emit_expr(x)); - let label = node.label().map(|x| self.emit_label(x)); - let loop_body = node.loop_body().map(|x| self.emit_block_expr(x)); - let pat = node.pat().map(|x| self.emit_pat(x)); + pub(crate) fn emit_for_expr(&mut self, node: ast::ForExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let iterable = node.iterable().and_then(|x| self.emit_expr(x)); + let label = node.label().and_then(|x| self.emit_label(x)); + let loop_body = node.loop_body().and_then(|x| self.emit_block_expr(x)); + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::ForExpr { id: TrapId::Star, attrs, @@ -907,12 +928,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ForExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_for_type(&mut self, node: ast::ForType) -> Label { - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_for_type(&mut self, node: ast::ForType) -> Option> { + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::ForTypeRepr { id: TrapId::Star, generic_param_list, @@ -921,12 +942,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ForTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_format_args_arg(&mut self, node: ast::FormatArgsArg) -> Label { - let expr = node.expr().map(|x| self.emit_expr(x)); - let name = node.name().map(|x| self.emit_name(x)); + pub(crate) fn emit_format_args_arg(&mut self, node: ast::FormatArgsArg) -> Option> { + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let name = node.name().and_then(|x| self.emit_name(x)); let label = self.trap.emit(generated::FormatArgsArg { id: TrapId::Star, expr, @@ -935,13 +956,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(FormatArgsArg, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_format_args_expr(&mut self, node: ast::FormatArgsExpr) -> Label { - let args = node.args().map(|x| self.emit_format_args_arg(x)).collect(); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let template = node.template().map(|x| self.emit_expr(x)); + pub(crate) fn emit_format_args_expr(&mut self, node: ast::FormatArgsExpr) -> Option> { + let args = node.args().filter_map(|x| self.emit_format_args_arg(x)).collect(); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let template = node.template().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::FormatArgsExpr { id: TrapId::Star, args, @@ -951,11 +973,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(FormatArgsExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_generic_arg_list(&mut self, node: ast::GenericArgList) -> Label { - let generic_args = node.generic_args().map(|x| self.emit_generic_arg(x)).collect(); + pub(crate) fn emit_generic_arg_list(&mut self, node: ast::GenericArgList) -> Option> { + let generic_args = node.generic_args().filter_map(|x| self.emit_generic_arg(x)).collect(); let label = self.trap.emit(generated::GenericArgList { id: TrapId::Star, generic_args, @@ -963,11 +985,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(GenericArgList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_generic_param_list(&mut self, node: ast::GenericParamList) -> Label { - let generic_params = node.generic_params().map(|x| self.emit_generic_param(x)).collect(); + pub(crate) fn emit_generic_param_list(&mut self, node: ast::GenericParamList) -> Option> { + let generic_params = node.generic_params().filter_map(|x| self.emit_generic_param(x)).collect(); let label = self.trap.emit(generated::GenericParamList { id: TrapId::Star, generic_params, @@ -975,15 +997,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(GenericParamList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_ident_pat(&mut self, node: ast::IdentPat) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_ident_pat(&mut self, node: ast::IdentPat) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let is_mut = node.mut_token().is_some(); let is_ref = node.ref_token().is_some(); - let name = node.name().map(|x| self.emit_name(x)); - let pat = node.pat().map(|x| self.emit_pat(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::IdentPat { id: TrapId::Star, attrs, @@ -995,14 +1018,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(IdentPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_if_expr(&mut self, node: ast::IfExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let condition = node.condition().map(|x| self.emit_expr(x)); - let else_ = node.else_branch().map(|x| self.emit_else_branch(x)); - let then = node.then_branch().map(|x| self.emit_block_expr(x)); + pub(crate) fn emit_if_expr(&mut self, node: ast::IfExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let condition = node.condition().and_then(|x| self.emit_expr(x)); + let else_ = node.else_branch().and_then(|x| self.emit_else_branch(x)); + let then = node.then_branch().and_then(|x| self.emit_block_expr(x)); let label = self.trap.emit(generated::IfExpr { id: TrapId::Star, attrs, @@ -1013,20 +1037,21 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(IfExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_impl(&mut self, node: ast::Impl) -> Label { - let assoc_item_list = node.assoc_item_list().map(|x| self.emit_assoc_item_list(x)); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); + pub(crate) fn emit_impl(&mut self, node: ast::Impl) -> Option> { + let assoc_item_list = node.assoc_item_list().and_then(|x| self.emit_assoc_item_list(x)); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); let is_const = node.const_token().is_some(); let is_default = node.default_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); - let self_ty = node.self_ty().map(|x| self.emit_type(x)); - let trait_ = node.trait_().map(|x| self.emit_type(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + let self_ty = node.self_ty().and_then(|x| self.emit_type(x)); + let trait_ = node.trait_().and_then(|x| self.emit_type(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::Impl { id: TrapId::Star, assoc_item_list, @@ -1043,11 +1068,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Impl, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_impl_trait_type(&mut self, node: ast::ImplTraitType) -> Label { - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); + pub(crate) fn emit_impl_trait_type(&mut self, node: ast::ImplTraitType) -> Option> { + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); let label = self.trap.emit(generated::ImplTraitTypeRepr { id: TrapId::Star, type_bound_list, @@ -1055,13 +1080,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ImplTraitTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_index_expr(&mut self, node: ast::IndexExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let base = node.base().map(|x| self.emit_expr(x)); - let index = node.index().map(|x| self.emit_expr(x)); + pub(crate) fn emit_index_expr(&mut self, node: ast::IndexExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let base = node.base().and_then(|x| self.emit_expr(x)); + let index = node.index().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::IndexExpr { id: TrapId::Star, attrs, @@ -1071,22 +1097,23 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(IndexExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_infer_type(&mut self, node: ast::InferType) -> Label { + pub(crate) fn emit_infer_type(&mut self, node: ast::InferType) -> Option> { let label = self.trap.emit(generated::InferTypeRepr { id: TrapId::Star, }); self.emit_location(label, &node); emit_detached!(InferTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_item_list(&mut self, node: ast::ItemList) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let items = node.items().map(|x| self.emit_item(x)).collect(); + pub(crate) fn emit_item_list(&mut self, node: ast::ItemList) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let items = node.items().filter_map(|x| self.emit_item(x)).collect(); let label = self.trap.emit(generated::ItemList { id: TrapId::Star, attrs, @@ -1095,11 +1122,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ItemList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_label(&mut self, node: ast::Label) -> Label { - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); + pub(crate) fn emit_label(&mut self, node: ast::Label) -> Option> { + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); let label = self.trap.emit(generated::Label { id: TrapId::Star, lifetime, @@ -1107,11 +1134,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Label, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_let_else(&mut self, node: ast::LetElse) -> Label { - let block_expr = node.block_expr().map(|x| self.emit_block_expr(x)); + pub(crate) fn emit_let_else(&mut self, node: ast::LetElse) -> Option> { + let block_expr = node.block_expr().and_then(|x| self.emit_block_expr(x)); let label = self.trap.emit(generated::LetElse { id: TrapId::Star, block_expr, @@ -1119,13 +1146,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LetElse, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_let_expr(&mut self, node: ast::LetExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let scrutinee = node.expr().map(|x| self.emit_expr(x)); - let pat = node.pat().map(|x| self.emit_pat(x)); + pub(crate) fn emit_let_expr(&mut self, node: ast::LetExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let scrutinee = node.expr().and_then(|x| self.emit_expr(x)); + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::LetExpr { id: TrapId::Star, attrs, @@ -1135,15 +1163,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LetExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_let_stmt(&mut self, node: ast::LetStmt) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let initializer = node.initializer().map(|x| self.emit_expr(x)); - let let_else = node.let_else().map(|x| self.emit_let_else(x)); - let pat = node.pat().map(|x| self.emit_pat(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_let_stmt(&mut self, node: ast::LetStmt) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let initializer = node.initializer().and_then(|x| self.emit_expr(x)); + let let_else = node.let_else().and_then(|x| self.emit_let_else(x)); + let pat = node.pat().and_then(|x| self.emit_pat(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::LetStmt { id: TrapId::Star, attrs, @@ -1155,10 +1184,10 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LetStmt, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_lifetime(&mut self, node: ast::Lifetime) -> Label { + pub(crate) fn emit_lifetime(&mut self, node: ast::Lifetime) -> Option> { let text = node.try_get_text(); let label = self.trap.emit(generated::Lifetime { id: TrapId::Star, @@ -1167,11 +1196,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Lifetime, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_lifetime_arg(&mut self, node: ast::LifetimeArg) -> Label { - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); + pub(crate) fn emit_lifetime_arg(&mut self, node: ast::LifetimeArg) -> Option> { + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); let label = self.trap.emit(generated::LifetimeArg { id: TrapId::Star, lifetime, @@ -1179,13 +1208,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LifetimeArg, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_lifetime_param(&mut self, node: ast::LifetimeParam) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); + pub(crate) fn emit_lifetime_param(&mut self, node: ast::LifetimeParam) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); let label = self.trap.emit(generated::LifetimeParam { id: TrapId::Star, attrs, @@ -1195,11 +1225,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LifetimeParam, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_literal(&mut self, node: ast::Literal) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_literal(&mut self, node: ast::Literal) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let text_value = node.try_get_text(); let label = self.trap.emit(generated::LiteralExpr { id: TrapId::Star, @@ -1209,11 +1240,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LiteralExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_literal_pat(&mut self, node: ast::LiteralPat) -> Label { - let literal = node.literal().map(|x| self.emit_literal(x)); + pub(crate) fn emit_literal_pat(&mut self, node: ast::LiteralPat) -> Option> { + let literal = node.literal().and_then(|x| self.emit_literal(x)); let label = self.trap.emit(generated::LiteralPat { id: TrapId::Star, literal, @@ -1221,13 +1252,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LiteralPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_loop_expr(&mut self, node: ast::LoopExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let label = node.label().map(|x| self.emit_label(x)); - let loop_body = node.loop_body().map(|x| self.emit_block_expr(x)); + pub(crate) fn emit_loop_expr(&mut self, node: ast::LoopExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let label = node.label().and_then(|x| self.emit_label(x)); + let loop_body = node.loop_body().and_then(|x| self.emit_block_expr(x)); let label = self.trap.emit(generated::LoopExpr { id: TrapId::Star, attrs, @@ -1237,13 +1269,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(LoopExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_call(&mut self, node: ast::MacroCall) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let path = node.path().map(|x| self.emit_path(x)); - let token_tree = node.token_tree().map(|x| self.emit_token_tree(x)); + pub(crate) fn emit_macro_call(&mut self, node: ast::MacroCall) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let path = node.path().and_then(|x| self.emit_path(x)); + let token_tree = node.token_tree().and_then(|x| self.emit_token_tree(x)); let label = self.trap.emit(generated::MacroCall { id: TrapId::Star, attrs, @@ -1253,15 +1286,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroCall, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_def(&mut self, node: ast::MacroDef) -> Label { - let args = node.args().map(|x| self.emit_token_tree(x)); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let body = node.body().map(|x| self.emit_token_tree(x)); - let name = node.name().map(|x| self.emit_name(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_macro_def(&mut self, node: ast::MacroDef) -> Option> { + let args = node.args().and_then(|x| self.emit_token_tree(x)); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let body = node.body().and_then(|x| self.emit_token_tree(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::MacroDef { id: TrapId::Star, args, @@ -1273,11 +1307,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroDef, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_expr(&mut self, node: ast::MacroExpr) -> Label { - let macro_call = node.macro_call().map(|x| self.emit_macro_call(x)); + pub(crate) fn emit_macro_expr(&mut self, node: ast::MacroExpr) -> Option> { + let macro_call = node.macro_call().and_then(|x| self.emit_macro_call(x)); let label = self.trap.emit(generated::MacroExpr { id: TrapId::Star, macro_call, @@ -1285,11 +1319,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_items(&mut self, node: ast::MacroItems) -> Label { - let items = node.items().map(|x| self.emit_item(x)).collect(); + pub(crate) fn emit_macro_items(&mut self, node: ast::MacroItems) -> Option> { + let items = node.items().filter_map(|x| self.emit_item(x)).collect(); let label = self.trap.emit(generated::MacroItems { id: TrapId::Star, items, @@ -1297,11 +1331,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroItems, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_pat(&mut self, node: ast::MacroPat) -> Label { - let macro_call = node.macro_call().map(|x| self.emit_macro_call(x)); + pub(crate) fn emit_macro_pat(&mut self, node: ast::MacroPat) -> Option> { + let macro_call = node.macro_call().and_then(|x| self.emit_macro_call(x)); let label = self.trap.emit(generated::MacroPat { id: TrapId::Star, macro_call, @@ -1309,14 +1343,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_rules(&mut self, node: ast::MacroRules) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let name = node.name().map(|x| self.emit_name(x)); - let token_tree = node.token_tree().map(|x| self.emit_token_tree(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_macro_rules(&mut self, node: ast::MacroRules) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let name = node.name().and_then(|x| self.emit_name(x)); + let token_tree = node.token_tree().and_then(|x| self.emit_token_tree(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::MacroRules { id: TrapId::Star, attrs, @@ -1327,12 +1362,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroRules, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_stmts(&mut self, node: ast::MacroStmts) -> Label { - let expr = node.expr().map(|x| self.emit_expr(x)); - let statements = node.statements().map(|x| self.emit_stmt(x)).collect(); + pub(crate) fn emit_macro_stmts(&mut self, node: ast::MacroStmts) -> Option> { + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let statements = node.statements().filter_map(|x| self.emit_stmt(x)).collect(); let label = self.trap.emit(generated::MacroStmts { id: TrapId::Star, expr, @@ -1341,11 +1376,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroStmts, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_macro_type(&mut self, node: ast::MacroType) -> Label { - let macro_call = node.macro_call().map(|x| self.emit_macro_call(x)); + pub(crate) fn emit_macro_type(&mut self, node: ast::MacroType) -> Option> { + let macro_call = node.macro_call().and_then(|x| self.emit_macro_call(x)); let label = self.trap.emit(generated::MacroTypeRepr { id: TrapId::Star, macro_call, @@ -1353,14 +1388,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MacroTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_match_arm(&mut self, node: ast::MatchArm) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); - let guard = node.guard().map(|x| self.emit_match_guard(x)); - let pat = node.pat().map(|x| self.emit_pat(x)); + pub(crate) fn emit_match_arm(&mut self, node: ast::MatchArm) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let guard = node.guard().and_then(|x| self.emit_match_guard(x)); + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::MatchArm { id: TrapId::Star, attrs, @@ -1371,12 +1407,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MatchArm, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_match_arm_list(&mut self, node: ast::MatchArmList) -> Label { - let arms = node.arms().map(|x| self.emit_match_arm(x)).collect(); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_match_arm_list(&mut self, node: ast::MatchArmList) -> Option> { + let arms = node.arms().filter_map(|x| self.emit_match_arm(x)).collect(); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let label = self.trap.emit(generated::MatchArmList { id: TrapId::Star, arms, @@ -1385,13 +1422,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MatchArmList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_match_expr(&mut self, node: ast::MatchExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let scrutinee = node.expr().map(|x| self.emit_expr(x)); - let match_arm_list = node.match_arm_list().map(|x| self.emit_match_arm_list(x)); + pub(crate) fn emit_match_expr(&mut self, node: ast::MatchExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let scrutinee = node.expr().and_then(|x| self.emit_expr(x)); + let match_arm_list = node.match_arm_list().and_then(|x| self.emit_match_arm_list(x)); let label = self.trap.emit(generated::MatchExpr { id: TrapId::Star, attrs, @@ -1401,11 +1439,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MatchExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_match_guard(&mut self, node: ast::MatchGuard) -> Label { - let condition = node.condition().map(|x| self.emit_expr(x)); + pub(crate) fn emit_match_guard(&mut self, node: ast::MatchGuard) -> Option> { + let condition = node.condition().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::MatchGuard { id: TrapId::Star, condition, @@ -1413,14 +1451,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MatchGuard, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_meta(&mut self, node: ast::Meta) -> Label { - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_meta(&mut self, node: ast::Meta) -> Option> { + let expr = node.expr().and_then(|x| self.emit_expr(x)); let is_unsafe = node.unsafe_token().is_some(); - let path = node.path().map(|x| self.emit_path(x)); - let token_tree = node.token_tree().map(|x| self.emit_token_tree(x)); + let path = node.path().and_then(|x| self.emit_path(x)); + let token_tree = node.token_tree().and_then(|x| self.emit_token_tree(x)); let label = self.trap.emit(generated::Meta { id: TrapId::Star, expr, @@ -1431,15 +1469,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Meta, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_method_call_expr(&mut self, node: ast::MethodCallExpr) -> Label { - let arg_list = node.arg_list().map(|x| self.emit_arg_list(x)); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let generic_arg_list = node.generic_arg_list().map(|x| self.emit_generic_arg_list(x)); - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); - let receiver = node.receiver().map(|x| self.emit_expr(x)); + pub(crate) fn emit_method_call_expr(&mut self, node: ast::MethodCallExpr) -> Option> { + let arg_list = node.arg_list().and_then(|x| self.emit_arg_list(x)); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let generic_arg_list = node.generic_arg_list().and_then(|x| self.emit_generic_arg_list(x)); + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); + let receiver = node.receiver().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::MethodCallExpr { id: TrapId::Star, arg_list, @@ -1451,14 +1490,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(MethodCallExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_module(&mut self, node: ast::Module) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let item_list = node.item_list().map(|x| self.emit_item_list(x)); - let name = node.name().map(|x| self.emit_name(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_module(&mut self, node: ast::Module) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let item_list = node.item_list().and_then(|x| self.emit_item_list(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::Module { id: TrapId::Star, attrs, @@ -1469,10 +1509,10 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Module, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_name(&mut self, node: ast::Name) -> Label { + pub(crate) fn emit_name(&mut self, node: ast::Name) -> Option> { let text = node.try_get_text(); let label = self.trap.emit(generated::Name { id: TrapId::Star, @@ -1481,10 +1521,10 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Name, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_name_ref(&mut self, node: ast::NameRef) -> Label { + pub(crate) fn emit_name_ref(&mut self, node: ast::NameRef) -> Option> { let text = node.try_get_text(); let label = self.trap.emit(generated::NameRef { id: TrapId::Star, @@ -1493,23 +1533,24 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(NameRef, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_never_type(&mut self, node: ast::NeverType) -> Label { + pub(crate) fn emit_never_type(&mut self, node: ast::NeverType) -> Option> { let label = self.trap.emit(generated::NeverTypeRepr { id: TrapId::Star, }); self.emit_location(label, &node); emit_detached!(NeverTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_offset_of_expr(&mut self, node: ast::OffsetOfExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let fields = node.fields().map(|x| self.emit_name_ref(x)).collect(); - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_offset_of_expr(&mut self, node: ast::OffsetOfExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let fields = node.fields().filter_map(|x| self.emit_name_ref(x)).collect(); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::OffsetOfExpr { id: TrapId::Star, attrs, @@ -1519,11 +1560,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(OffsetOfExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_or_pat(&mut self, node: ast::OrPat) -> Label { - let pats = node.pats().map(|x| self.emit_pat(x)).collect(); + pub(crate) fn emit_or_pat(&mut self, node: ast::OrPat) -> Option> { + let pats = node.pats().filter_map(|x| self.emit_pat(x)).collect(); let label = self.trap.emit(generated::OrPat { id: TrapId::Star, pats, @@ -1531,13 +1572,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(OrPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_param(&mut self, node: ast::Param) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let pat = node.pat().map(|x| self.emit_pat(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_param(&mut self, node: ast::Param) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let pat = node.pat().and_then(|x| self.emit_pat(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::Param { id: TrapId::Star, attrs, @@ -1547,12 +1589,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Param, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_param_list(&mut self, node: ast::ParamList) -> Label { - let params = node.params().map(|x| self.emit_param(x)).collect(); - let self_param = node.self_param().map(|x| self.emit_self_param(x)); + pub(crate) fn emit_param_list(&mut self, node: ast::ParamList) -> Option> { + let params = node.params().filter_map(|x| self.emit_param(x)).collect(); + let self_param = node.self_param().and_then(|x| self.emit_self_param(x)); let label = self.trap.emit(generated::ParamList { id: TrapId::Star, params, @@ -1561,12 +1603,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ParamList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_paren_expr(&mut self, node: ast::ParenExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_paren_expr(&mut self, node: ast::ParenExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::ParenExpr { id: TrapId::Star, attrs, @@ -1575,11 +1618,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ParenExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_paren_pat(&mut self, node: ast::ParenPat) -> Label { - let pat = node.pat().map(|x| self.emit_pat(x)); + pub(crate) fn emit_paren_pat(&mut self, node: ast::ParenPat) -> Option> { + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::ParenPat { id: TrapId::Star, pat, @@ -1587,11 +1630,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ParenPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_paren_type(&mut self, node: ast::ParenType) -> Label { - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_paren_type(&mut self, node: ast::ParenType) -> Option> { + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::ParenTypeRepr { id: TrapId::Star, type_repr, @@ -1599,11 +1642,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ParenTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_parenthesized_arg_list(&mut self, node: ast::ParenthesizedArgList) -> Label { - let type_args = node.type_args().map(|x| self.emit_type_arg(x)).collect(); + pub(crate) fn emit_parenthesized_arg_list(&mut self, node: ast::ParenthesizedArgList) -> Option> { + let type_args = node.type_args().filter_map(|x| self.emit_type_arg(x)).collect(); let label = self.trap.emit(generated::ParenthesizedArgList { id: TrapId::Star, type_args, @@ -1611,12 +1654,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ParenthesizedArgList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_path(&mut self, node: ast::Path) -> Label { - let qualifier = node.qualifier().map(|x| self.emit_path(x)); - let part = node.segment().map(|x| self.emit_path_segment(x)); + pub(crate) fn emit_path(&mut self, node: ast::Path) -> Option> { + let qualifier = node.qualifier().and_then(|x| self.emit_path(x)); + let part = node.segment().and_then(|x| self.emit_path_segment(x)); let label = self.trap.emit(generated::Path { id: TrapId::Star, qualifier, @@ -1625,12 +1668,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Path, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_path_expr(&mut self, node: ast::PathExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let path = node.path().map(|x| self.emit_path(x)); + pub(crate) fn emit_path_expr(&mut self, node: ast::PathExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let path = node.path().and_then(|x| self.emit_path(x)); let label = self.trap.emit(generated::PathExpr { id: TrapId::Star, attrs, @@ -1639,11 +1683,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(PathExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_path_pat(&mut self, node: ast::PathPat) -> Label { - let path = node.path().map(|x| self.emit_path(x)); + pub(crate) fn emit_path_pat(&mut self, node: ast::PathPat) -> Option> { + let path = node.path().and_then(|x| self.emit_path(x)); let label = self.trap.emit(generated::PathPat { id: TrapId::Star, path, @@ -1651,17 +1695,17 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(PathPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_path_segment(&mut self, node: ast::PathSegment) -> Label { - let generic_arg_list = node.generic_arg_list().map(|x| self.emit_generic_arg_list(x)); - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); - let parenthesized_arg_list = node.parenthesized_arg_list().map(|x| self.emit_parenthesized_arg_list(x)); - let path_type = node.path_type().map(|x| self.emit_path_type(x)); - let ret_type = node.ret_type().map(|x| self.emit_ret_type(x)); - let return_type_syntax = node.return_type_syntax().map(|x| self.emit_return_type_syntax(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_path_segment(&mut self, node: ast::PathSegment) -> Option> { + let generic_arg_list = node.generic_arg_list().and_then(|x| self.emit_generic_arg_list(x)); + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); + let parenthesized_arg_list = node.parenthesized_arg_list().and_then(|x| self.emit_parenthesized_arg_list(x)); + let path_type = node.path_type().and_then(|x| self.emit_path_type(x)); + let ret_type = node.ret_type().and_then(|x| self.emit_ret_type(x)); + let return_type_syntax = node.return_type_syntax().and_then(|x| self.emit_return_type_syntax(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::PathSegment { id: TrapId::Star, generic_arg_list, @@ -1675,11 +1719,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(PathSegment, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_path_type(&mut self, node: ast::PathType) -> Label { - let path = node.path().map(|x| self.emit_path(x)); + pub(crate) fn emit_path_type(&mut self, node: ast::PathType) -> Option> { + let path = node.path().and_then(|x| self.emit_path(x)); let label = self.trap.emit(generated::PathTypeRepr { id: TrapId::Star, path, @@ -1687,12 +1731,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(PathTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_prefix_expr(&mut self, node: ast::PrefixExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_prefix_expr(&mut self, node: ast::PrefixExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let operator_name = node.try_get_text(); let label = self.trap.emit(generated::PrefixExpr { id: TrapId::Star, @@ -1703,13 +1748,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(PrefixExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_ptr_type(&mut self, node: ast::PtrType) -> Label { + pub(crate) fn emit_ptr_type(&mut self, node: ast::PtrType) -> Option> { let is_const = node.const_token().is_some(); let is_mut = node.mut_token().is_some(); - let type_repr = node.ty().map(|x| self.emit_type(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::PtrTypeRepr { id: TrapId::Star, is_const, @@ -1719,14 +1764,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(PtrTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_range_expr(&mut self, node: ast::RangeExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let end = node.end().map(|x| self.emit_expr(x)); + pub(crate) fn emit_range_expr(&mut self, node: ast::RangeExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let end = node.end().and_then(|x| self.emit_expr(x)); let operator_name = node.try_get_text(); - let start = node.start().map(|x| self.emit_expr(x)); + let start = node.start().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::RangeExpr { id: TrapId::Star, attrs, @@ -1737,13 +1783,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RangeExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_range_pat(&mut self, node: ast::RangePat) -> Label { - let end = node.end().map(|x| self.emit_pat(x)); + pub(crate) fn emit_range_pat(&mut self, node: ast::RangePat) -> Option> { + let end = node.end().and_then(|x| self.emit_pat(x)); let operator_name = node.try_get_text(); - let start = node.start().map(|x| self.emit_pat(x)); + let start = node.start().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::RangePat { id: TrapId::Star, end, @@ -1753,12 +1799,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RangePat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_expr(&mut self, node: ast::RecordExpr) -> Label { - let path = node.path().map(|x| self.emit_path(x)); - let record_expr_field_list = node.record_expr_field_list().map(|x| self.emit_record_expr_field_list(x)); + pub(crate) fn emit_record_expr(&mut self, node: ast::RecordExpr) -> Option> { + let path = node.path().and_then(|x| self.emit_path(x)); + let record_expr_field_list = node.record_expr_field_list().and_then(|x| self.emit_record_expr_field_list(x)); let label = self.trap.emit(generated::RecordExpr { id: TrapId::Star, path, @@ -1767,13 +1813,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_expr_field(&mut self, node: ast::RecordExprField) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); + pub(crate) fn emit_record_expr_field(&mut self, node: ast::RecordExprField) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); let label = self.trap.emit(generated::RecordExprField { id: TrapId::Star, attrs, @@ -1783,13 +1830,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordExprField, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_expr_field_list(&mut self, node: ast::RecordExprFieldList) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let fields = node.fields().map(|x| self.emit_record_expr_field(x)).collect(); - let spread = node.spread().map(|x| self.emit_expr(x)); + pub(crate) fn emit_record_expr_field_list(&mut self, node: ast::RecordExprFieldList) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let fields = node.fields().filter_map(|x| self.emit_record_expr_field(x)).collect(); + let spread = node.spread().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::RecordExprFieldList { id: TrapId::Star, attrs, @@ -1799,14 +1847,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordExprFieldList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_field(&mut self, node: ast::RecordField) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let name = node.name().map(|x| self.emit_name(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_record_field(&mut self, node: ast::RecordField) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::RecordField { id: TrapId::Star, attrs, @@ -1817,11 +1866,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordField, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_field_list(&mut self, node: ast::RecordFieldList) -> Label { - let fields = node.fields().map(|x| self.emit_record_field(x)).collect(); + pub(crate) fn emit_record_field_list(&mut self, node: ast::RecordFieldList) -> Option> { + let fields = node.fields().filter_map(|x| self.emit_record_field(x)).collect(); let label = self.trap.emit(generated::RecordFieldList { id: TrapId::Star, fields, @@ -1829,12 +1878,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordFieldList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_pat(&mut self, node: ast::RecordPat) -> Label { - let path = node.path().map(|x| self.emit_path(x)); - let record_pat_field_list = node.record_pat_field_list().map(|x| self.emit_record_pat_field_list(x)); + pub(crate) fn emit_record_pat(&mut self, node: ast::RecordPat) -> Option> { + let path = node.path().and_then(|x| self.emit_path(x)); + let record_pat_field_list = node.record_pat_field_list().and_then(|x| self.emit_record_pat_field_list(x)); let label = self.trap.emit(generated::RecordPat { id: TrapId::Star, path, @@ -1843,13 +1892,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_pat_field(&mut self, node: ast::RecordPatField) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let name_ref = node.name_ref().map(|x| self.emit_name_ref(x)); - let pat = node.pat().map(|x| self.emit_pat(x)); + pub(crate) fn emit_record_pat_field(&mut self, node: ast::RecordPatField) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::RecordPatField { id: TrapId::Star, attrs, @@ -1859,12 +1909,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordPatField, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_record_pat_field_list(&mut self, node: ast::RecordPatFieldList) -> Label { - let fields = node.fields().map(|x| self.emit_record_pat_field(x)).collect(); - let rest_pat = node.rest_pat().map(|x| self.emit_rest_pat(x)); + pub(crate) fn emit_record_pat_field_list(&mut self, node: ast::RecordPatFieldList) -> Option> { + let fields = node.fields().filter_map(|x| self.emit_record_pat_field(x)).collect(); + let rest_pat = node.rest_pat().and_then(|x| self.emit_rest_pat(x)); let label = self.trap.emit(generated::RecordPatFieldList { id: TrapId::Star, fields, @@ -1873,12 +1923,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RecordPatFieldList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_ref_expr(&mut self, node: ast::RefExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_ref_expr(&mut self, node: ast::RefExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let is_const = node.const_token().is_some(); let is_mut = node.mut_token().is_some(); let is_raw = node.raw_token().is_some(); @@ -1893,12 +1944,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RefExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_ref_pat(&mut self, node: ast::RefPat) -> Label { + pub(crate) fn emit_ref_pat(&mut self, node: ast::RefPat) -> Option> { let is_mut = node.mut_token().is_some(); - let pat = node.pat().map(|x| self.emit_pat(x)); + let pat = node.pat().and_then(|x| self.emit_pat(x)); let label = self.trap.emit(generated::RefPat { id: TrapId::Star, is_mut, @@ -1907,13 +1958,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RefPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_ref_type(&mut self, node: ast::RefType) -> Label { + pub(crate) fn emit_ref_type(&mut self, node: ast::RefType) -> Option> { let is_mut = node.mut_token().is_some(); - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::RefTypeRepr { id: TrapId::Star, is_mut, @@ -1923,11 +1974,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RefTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_rename(&mut self, node: ast::Rename) -> Label { - let name = node.name().map(|x| self.emit_name(x)); + pub(crate) fn emit_rename(&mut self, node: ast::Rename) -> Option> { + let name = node.name().and_then(|x| self.emit_name(x)); let label = self.trap.emit(generated::Rename { id: TrapId::Star, name, @@ -1935,11 +1986,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Rename, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_rest_pat(&mut self, node: ast::RestPat) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_rest_pat(&mut self, node: ast::RestPat) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let label = self.trap.emit(generated::RestPat { id: TrapId::Star, attrs, @@ -1947,11 +1999,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RestPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_ret_type(&mut self, node: ast::RetType) -> Label { - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_ret_type(&mut self, node: ast::RetType) -> Option> { + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::RetTypeRepr { id: TrapId::Star, type_repr, @@ -1959,12 +2011,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(RetTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_return_expr(&mut self, node: ast::ReturnExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_return_expr(&mut self, node: ast::ReturnExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::ReturnExpr { id: TrapId::Star, attrs, @@ -1973,26 +2026,27 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(ReturnExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_return_type_syntax(&mut self, node: ast::ReturnTypeSyntax) -> Label { + pub(crate) fn emit_return_type_syntax(&mut self, node: ast::ReturnTypeSyntax) -> Option> { let label = self.trap.emit(generated::ReturnTypeSyntax { id: TrapId::Star, }); self.emit_location(label, &node); emit_detached!(ReturnTypeSyntax, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_self_param(&mut self, node: ast::SelfParam) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_self_param(&mut self, node: ast::SelfParam) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let is_ref = node.amp_token().is_some(); let is_mut = node.mut_token().is_some(); - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); - let name = node.name().map(|x| self.emit_name(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::SelfParam { id: TrapId::Star, attrs, @@ -2005,11 +2059,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(SelfParam, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_slice_pat(&mut self, node: ast::SlicePat) -> Label { - let pats = node.pats().map(|x| self.emit_pat(x)).collect(); + pub(crate) fn emit_slice_pat(&mut self, node: ast::SlicePat) -> Option> { + let pats = node.pats().filter_map(|x| self.emit_pat(x)).collect(); let label = self.trap.emit(generated::SlicePat { id: TrapId::Star, pats, @@ -2017,11 +2071,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(SlicePat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_slice_type(&mut self, node: ast::SliceType) -> Label { - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_slice_type(&mut self, node: ast::SliceType) -> Option> { + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::SliceTypeRepr { id: TrapId::Star, type_repr, @@ -2029,12 +2083,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(SliceTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_source_file(&mut self, node: ast::SourceFile) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let items = node.items().map(|x| self.emit_item(x)).collect(); + pub(crate) fn emit_source_file(&mut self, node: ast::SourceFile) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let items = node.items().filter_map(|x| self.emit_item(x)).collect(); let label = self.trap.emit(generated::SourceFile { id: TrapId::Star, attrs, @@ -2043,18 +2098,19 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(SourceFile, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_static(&mut self, node: ast::Static) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let body = node.body().map(|x| self.emit_expr(x)); + pub(crate) fn emit_static(&mut self, node: ast::Static) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let body = node.body().and_then(|x| self.emit_expr(x)); let is_mut = node.mut_token().is_some(); let is_static = node.static_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); - let name = node.name().map(|x| self.emit_name(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::Static { id: TrapId::Star, attrs, @@ -2069,13 +2125,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Static, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_stmt_list(&mut self, node: ast::StmtList) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let statements = node.statements().map(|x| self.emit_stmt(x)).collect(); - let tail_expr = node.tail_expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_stmt_list(&mut self, node: ast::StmtList) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let statements = node.statements().filter_map(|x| self.emit_stmt(x)).collect(); + let tail_expr = node.tail_expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::StmtList { id: TrapId::Star, attrs, @@ -2085,16 +2142,17 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(StmtList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_struct(&mut self, node: ast::Struct) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let field_list = node.field_list().map(|x| self.emit_field_list(x)); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); - let name = node.name().map(|x| self.emit_name(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + pub(crate) fn emit_struct(&mut self, node: ast::Struct) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let field_list = node.field_list().and_then(|x| self.emit_field_list(x)); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::Struct { id: TrapId::Star, attrs, @@ -2107,29 +2165,30 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Struct, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_token_tree(&mut self, node: ast::TokenTree) -> Label { + pub(crate) fn emit_token_tree(&mut self, node: ast::TokenTree) -> Option> { let label = self.trap.emit(generated::TokenTree { id: TrapId::Star, }); self.emit_location(label, &node); emit_detached!(TokenTree, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_trait(&mut self, node: ast::Trait) -> Label { - let assoc_item_list = node.assoc_item_list().map(|x| self.emit_assoc_item_list(x)); - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); + pub(crate) fn emit_trait(&mut self, node: ast::Trait) -> Option> { + let assoc_item_list = node.assoc_item_list().and_then(|x| self.emit_assoc_item_list(x)); + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); let is_auto = node.auto_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); - let name = node.name().map(|x| self.emit_name(x)); - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::Trait { id: TrapId::Star, assoc_item_list, @@ -2145,16 +2204,17 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Trait, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_trait_alias(&mut self, node: ast::TraitAlias) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); - let name = node.name().map(|x| self.emit_name(x)); - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + pub(crate) fn emit_trait_alias(&mut self, node: ast::TraitAlias) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::TraitAlias { id: TrapId::Star, attrs, @@ -2167,12 +2227,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TraitAlias, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_try_expr(&mut self, node: ast::TryExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_try_expr(&mut self, node: ast::TryExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::TryExpr { id: TrapId::Star, attrs, @@ -2181,12 +2242,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TryExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_tuple_expr(&mut self, node: ast::TupleExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let fields = node.fields().map(|x| self.emit_expr(x)).collect(); + pub(crate) fn emit_tuple_expr(&mut self, node: ast::TupleExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let fields = node.fields().filter_map(|x| self.emit_expr(x)).collect(); let label = self.trap.emit(generated::TupleExpr { id: TrapId::Star, attrs, @@ -2195,13 +2257,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TupleExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_tuple_field(&mut self, node: ast::TupleField) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_tuple_field(&mut self, node: ast::TupleField) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::TupleField { id: TrapId::Star, attrs, @@ -2211,11 +2274,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TupleField, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_tuple_field_list(&mut self, node: ast::TupleFieldList) -> Label { - let fields = node.fields().map(|x| self.emit_tuple_field(x)).collect(); + pub(crate) fn emit_tuple_field_list(&mut self, node: ast::TupleFieldList) -> Option> { + let fields = node.fields().filter_map(|x| self.emit_tuple_field(x)).collect(); let label = self.trap.emit(generated::TupleFieldList { id: TrapId::Star, fields, @@ -2223,11 +2286,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TupleFieldList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_tuple_pat(&mut self, node: ast::TuplePat) -> Label { - let fields = node.fields().map(|x| self.emit_pat(x)).collect(); + pub(crate) fn emit_tuple_pat(&mut self, node: ast::TuplePat) -> Option> { + let fields = node.fields().filter_map(|x| self.emit_pat(x)).collect(); let label = self.trap.emit(generated::TuplePat { id: TrapId::Star, fields, @@ -2235,12 +2298,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TuplePat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_tuple_struct_pat(&mut self, node: ast::TupleStructPat) -> Label { - let fields = node.fields().map(|x| self.emit_pat(x)).collect(); - let path = node.path().map(|x| self.emit_path(x)); + pub(crate) fn emit_tuple_struct_pat(&mut self, node: ast::TupleStructPat) -> Option> { + let fields = node.fields().filter_map(|x| self.emit_pat(x)).collect(); + let path = node.path().and_then(|x| self.emit_path(x)); let label = self.trap.emit(generated::TupleStructPat { id: TrapId::Star, fields, @@ -2249,11 +2312,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TupleStructPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_tuple_type(&mut self, node: ast::TupleType) -> Label { - let fields = node.fields().map(|x| self.emit_type(x)).collect(); + pub(crate) fn emit_tuple_type(&mut self, node: ast::TupleType) -> Option> { + let fields = node.fields().filter_map(|x| self.emit_type(x)).collect(); let label = self.trap.emit(generated::TupleTypeRepr { id: TrapId::Star, fields, @@ -2261,18 +2324,19 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TupleTypeRepr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_type_alias(&mut self, node: ast::TypeAlias) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); + pub(crate) fn emit_type_alias(&mut self, node: ast::TypeAlias) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); let is_default = node.default_token().is_some(); - let name = node.name().map(|x| self.emit_name(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::TypeAlias { id: TrapId::Star, attrs, @@ -2287,11 +2351,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TypeAlias, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_type_arg(&mut self, node: ast::TypeArg) -> Label { - let type_repr = node.ty().map(|x| self.emit_type(x)); + pub(crate) fn emit_type_arg(&mut self, node: ast::TypeArg) -> Option> { + let type_repr = node.ty().and_then(|x| self.emit_type(x)); let label = self.trap.emit(generated::TypeArg { id: TrapId::Star, type_repr, @@ -2299,15 +2363,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TypeArg, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_type_bound(&mut self, node: ast::TypeBound) -> Label { + pub(crate) fn emit_type_bound(&mut self, node: ast::TypeBound) -> Option> { let is_async = node.async_token().is_some(); let is_const = node.const_token().is_some(); - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let use_bound_generic_args = node.use_bound_generic_args().map(|x| self.emit_use_bound_generic_args(x)); + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let use_bound_generic_args = node.use_bound_generic_args().and_then(|x| self.emit_use_bound_generic_args(x)); let label = self.trap.emit(generated::TypeBound { id: TrapId::Star, is_async, @@ -2319,11 +2383,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TypeBound, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_type_bound_list(&mut self, node: ast::TypeBoundList) -> Label { - let bounds = node.bounds().map(|x| self.emit_type_bound(x)).collect(); + pub(crate) fn emit_type_bound_list(&mut self, node: ast::TypeBoundList) -> Option> { + let bounds = node.bounds().filter_map(|x| self.emit_type_bound(x)).collect(); let label = self.trap.emit(generated::TypeBoundList { id: TrapId::Star, bounds, @@ -2331,14 +2395,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TypeBoundList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_type_param(&mut self, node: ast::TypeParam) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let default_type = node.default_type().map(|x| self.emit_type(x)); - let name = node.name().map(|x| self.emit_name(x)); - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); + pub(crate) fn emit_type_param(&mut self, node: ast::TypeParam) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let default_type = node.default_type().and_then(|x| self.emit_type(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); let label = self.trap.emit(generated::TypeParam { id: TrapId::Star, attrs, @@ -2349,11 +2414,12 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(TypeParam, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_underscore_expr(&mut self, node: ast::UnderscoreExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); + pub(crate) fn emit_underscore_expr(&mut self, node: ast::UnderscoreExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let label = self.trap.emit(generated::UnderscoreExpr { id: TrapId::Star, attrs, @@ -2361,16 +2427,17 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(UnderscoreExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_union(&mut self, node: ast::Union) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); - let name = node.name().map(|x| self.emit_name(x)); - let record_field_list = node.record_field_list().map(|x| self.emit_record_field_list(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); - let where_clause = node.where_clause().map(|x| self.emit_where_clause(x)); + pub(crate) fn emit_union(&mut self, node: ast::Union) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let record_field_list = node.record_field_list().and_then(|x| self.emit_record_field_list(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(x)); let label = self.trap.emit(generated::Union { id: TrapId::Star, attrs, @@ -2383,13 +2450,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Union, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_use(&mut self, node: ast::Use) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let use_tree = node.use_tree().map(|x| self.emit_use_tree(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_use(&mut self, node: ast::Use) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let use_tree = node.use_tree().and_then(|x| self.emit_use_tree(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::Use { id: TrapId::Star, attrs, @@ -2399,11 +2467,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Use, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_use_bound_generic_args(&mut self, node: ast::UseBoundGenericArgs) -> Label { - let use_bound_generic_args = node.use_bound_generic_args().map(|x| self.emit_use_bound_generic_arg(x)).collect(); + pub(crate) fn emit_use_bound_generic_args(&mut self, node: ast::UseBoundGenericArgs) -> Option> { + let use_bound_generic_args = node.use_bound_generic_args().filter_map(|x| self.emit_use_bound_generic_arg(x)).collect(); let label = self.trap.emit(generated::UseBoundGenericArgs { id: TrapId::Star, use_bound_generic_args, @@ -2411,13 +2479,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(UseBoundGenericArgs, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_use_tree(&mut self, node: ast::UseTree) -> Label { - let path = node.path().map(|x| self.emit_path(x)); - let rename = node.rename().map(|x| self.emit_rename(x)); - let use_tree_list = node.use_tree_list().map(|x| self.emit_use_tree_list(x)); + pub(crate) fn emit_use_tree(&mut self, node: ast::UseTree) -> Option> { + let path = node.path().and_then(|x| self.emit_path(x)); + let rename = node.rename().and_then(|x| self.emit_rename(x)); + let use_tree_list = node.use_tree_list().and_then(|x| self.emit_use_tree_list(x)); let label = self.trap.emit(generated::UseTree { id: TrapId::Star, path, @@ -2427,11 +2495,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(UseTree, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_use_tree_list(&mut self, node: ast::UseTreeList) -> Label { - let use_trees = node.use_trees().map(|x| self.emit_use_tree(x)).collect(); + pub(crate) fn emit_use_tree_list(&mut self, node: ast::UseTreeList) -> Option> { + let use_trees = node.use_trees().filter_map(|x| self.emit_use_tree(x)).collect(); let label = self.trap.emit(generated::UseTreeList { id: TrapId::Star, use_trees, @@ -2439,15 +2507,16 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(UseTreeList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_variant(&mut self, node: ast::Variant) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); - let field_list = node.field_list().map(|x| self.emit_field_list(x)); - let name = node.name().map(|x| self.emit_name(x)); - let visibility = node.visibility().map(|x| self.emit_visibility(x)); + pub(crate) fn emit_variant(&mut self, node: ast::Variant) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); + let field_list = node.field_list().and_then(|x| self.emit_field_list(x)); + let name = node.name().and_then(|x| self.emit_name(x)); + let visibility = node.visibility().and_then(|x| self.emit_visibility(x)); let label = self.trap.emit(generated::Variant { id: TrapId::Star, attrs, @@ -2459,11 +2528,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Variant, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_variant_list(&mut self, node: ast::VariantList) -> Label { - let variants = node.variants().map(|x| self.emit_variant(x)).collect(); + pub(crate) fn emit_variant_list(&mut self, node: ast::VariantList) -> Option> { + let variants = node.variants().filter_map(|x| self.emit_variant(x)).collect(); let label = self.trap.emit(generated::VariantList { id: TrapId::Star, variants, @@ -2471,11 +2540,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(VariantList, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_visibility(&mut self, node: ast::Visibility) -> Label { - let path = node.path().map(|x| self.emit_path(x)); + pub(crate) fn emit_visibility(&mut self, node: ast::Visibility) -> Option> { + let path = node.path().and_then(|x| self.emit_path(x)); let label = self.trap.emit(generated::Visibility { id: TrapId::Star, path, @@ -2483,11 +2552,11 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(Visibility, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_where_clause(&mut self, node: ast::WhereClause) -> Label { - let predicates = node.predicates().map(|x| self.emit_where_pred(x)).collect(); + pub(crate) fn emit_where_clause(&mut self, node: ast::WhereClause) -> Option> { + let predicates = node.predicates().filter_map(|x| self.emit_where_pred(x)).collect(); let label = self.trap.emit(generated::WhereClause { id: TrapId::Star, predicates, @@ -2495,14 +2564,14 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(WhereClause, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_where_pred(&mut self, node: ast::WherePred) -> Label { - let generic_param_list = node.generic_param_list().map(|x| self.emit_generic_param_list(x)); - let lifetime = node.lifetime().map(|x| self.emit_lifetime(x)); - let type_repr = node.ty().map(|x| self.emit_type(x)); - let type_bound_list = node.type_bound_list().map(|x| self.emit_type_bound_list(x)); + pub(crate) fn emit_where_pred(&mut self, node: ast::WherePred) -> Option> { + let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); + let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(x)); + let type_repr = node.ty().and_then(|x| self.emit_type(x)); + let type_bound_list = node.type_bound_list().and_then(|x| self.emit_type_bound_list(x)); let label = self.trap.emit(generated::WherePred { id: TrapId::Star, generic_param_list, @@ -2513,14 +2582,15 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(WherePred, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_while_expr(&mut self, node: ast::WhileExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let condition = node.condition().map(|x| self.emit_expr(x)); - let label = node.label().map(|x| self.emit_label(x)); - let loop_body = node.loop_body().map(|x| self.emit_block_expr(x)); + pub(crate) fn emit_while_expr(&mut self, node: ast::WhileExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let condition = node.condition().and_then(|x| self.emit_expr(x)); + let label = node.label().and_then(|x| self.emit_label(x)); + let loop_body = node.loop_body().and_then(|x| self.emit_block_expr(x)); let label = self.trap.emit(generated::WhileExpr { id: TrapId::Star, attrs, @@ -2531,22 +2601,23 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(WhileExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_wildcard_pat(&mut self, node: ast::WildcardPat) -> Label { + pub(crate) fn emit_wildcard_pat(&mut self, node: ast::WildcardPat) -> Option> { let label = self.trap.emit(generated::WildcardPat { id: TrapId::Star, }); self.emit_location(label, &node); emit_detached!(WildcardPat, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_yeet_expr(&mut self, node: ast::YeetExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_yeet_expr(&mut self, node: ast::YeetExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::YeetExpr { id: TrapId::Star, attrs, @@ -2555,12 +2626,13 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(YeetExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } - pub(crate) fn emit_yield_expr(&mut self, node: ast::YieldExpr) -> Label { - let attrs = node.attrs().map(|x| self.emit_attr(x)).collect(); - let expr = node.expr().map(|x| self.emit_expr(x)); + pub(crate) fn emit_yield_expr(&mut self, node: ast::YieldExpr) -> Option> { + if self.should_be_excluded(&node) { return None; } + let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::YieldExpr { id: TrapId::Star, attrs, @@ -2569,7 +2641,7 @@ impl Translator<'_> { self.emit_location(label, &node); emit_detached!(YieldExpr, self, node, label); self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); - label + Some(label) } } diff --git a/rust/ql/integration-tests/options/cfg/functions.ql b/rust/ql/integration-tests/options/cfg/functions.ql index da7b22cf584..c84e7a82ca5 100644 --- a/rust/ql/integration-tests/options/cfg/functions.ql +++ b/rust/ql/integration-tests/options/cfg/functions.ql @@ -1,5 +1,4 @@ import rust from Function f -where f.hasExtendedCanonicalPath() select f diff --git a/rust/ql/integration-tests/options/features/functions.ql b/rust/ql/integration-tests/options/features/functions.ql index da7b22cf584..c84e7a82ca5 100644 --- a/rust/ql/integration-tests/options/features/functions.ql +++ b/rust/ql/integration-tests/options/features/functions.ql @@ -1,5 +1,4 @@ import rust from Function f -where f.hasExtendedCanonicalPath() select f diff --git a/rust/ql/integration-tests/options/target/functions.ql b/rust/ql/integration-tests/options/target/functions.ql index da7b22cf584..c84e7a82ca5 100644 --- a/rust/ql/integration-tests/options/target/functions.ql +++ b/rust/ql/integration-tests/options/target/functions.ql @@ -1,5 +1,4 @@ import rust from Function f -where f.hasExtendedCanonicalPath() select f From 978a816f112bf6398a2b894624369f5f34673eb9 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 13 Dec 2023 09:44:50 +0100 Subject: [PATCH 04/71] Ruby: Track types in data flow --- .../DataFlowConsistency.ql | 8 + .../dataflow/internal/DataFlowDispatch.qll | 173 +- .../dataflow/internal/DataFlowPrivate.qll | 363 +- .../ruby/dataflow/internal/DataFlowPublic.qll | 19 + .../internal/TaintTrackingPrivate.qll | 13 +- .../dataflow/array-flow/array-flow.expected | 7526 ++++++++--------- .../call-sensitivity.expected | 8 +- .../library-tests/dataflow/erb/erb.expected | 152 +- .../test/library-tests/dataflow/erb/main.rb | 3 + .../test/library-tests/dataflow/erb/view1.rb | 5 +- .../flow-summaries/semantics.expected | 2980 +++---- .../dataflow/global/Flow.expected | 698 +- .../dataflow/hash-flow/hash-flow.expected | 3350 ++++---- .../dataflow/params/params-flow.expected | 438 +- .../dataflow/ssa-flow/ssa-flow.expected | 10 +- .../dataflow/summaries/Summaries.expected | 444 +- .../dataflow/type-flow/Flow.expected | 373 + .../library-tests/dataflow/type-flow/Flow.ql | 54 + .../library-tests/dataflow/type-flow/types.rb | 89 + .../action_controller/params-flow.expected | 88 +- .../ActiveSupportDataFlow.expected | 780 +- .../frameworks/pathname/Pathname.expected | 2 - .../frameworks/sinatra/Flow.expected | 6 +- .../TemplateInjection.expected | 14 +- .../security/cwe-022/PathInjection.expected | 18 +- .../UnsafeShellCommandConstruction.expected | 8 +- .../security/cwe-079/ReflectedXSS.expected | 62 +- .../security/cwe-079/StoredXSS.expected | 56 +- .../security/cwe-089/SqlInjection.expected | 55 +- .../CodeInjection/CodeInjection.expected | 24 +- .../UnsafeCodeConstruction.expected | 48 +- .../security/cwe-117/LogInjection.expected | 18 +- .../cwe-312/CleartextLogging.expected | 160 +- .../cwe-312/CleartextStorage.expected | 232 +- .../HardcodedDataInterpretedAsCode.expected | 54 +- .../cwe-732/WeakFilePermissions.expected | 32 +- .../cwe-798/HardcodedCredentials.expected | 64 +- .../cwe-829/InsecureDownload.expected | 20 +- .../internal/DataFlowImplConsistency.qll | 4 + 39 files changed, 9606 insertions(+), 8845 deletions(-) create mode 100644 ruby/ql/test/library-tests/dataflow/type-flow/Flow.expected create mode 100644 ruby/ql/test/library-tests/dataflow/type-flow/Flow.ql create mode 100644 ruby/ql/test/library-tests/dataflow/type-flow/types.rb diff --git a/ruby/ql/consistency-queries/DataFlowConsistency.ql b/ruby/ql/consistency-queries/DataFlowConsistency.ql index 76155d5d1c1..86350eba192 100644 --- a/ruby/ql/consistency-queries/DataFlowConsistency.ql +++ b/ruby/ql/consistency-queries/DataFlowConsistency.ql @@ -44,6 +44,14 @@ private module Input implements InputSig { n.getASplit() instanceof Split::ConditionalCompletionSplit ) } + + predicate uniqueTypeExclude(Node n) { + n = + any(DataFlow::CallNode call | + Private::isStandardNewCall(call.getExprNode(), _, _) and + not call.getReceiver().asExpr().getExpr() instanceof ConstantReadAccess + ) + } } import MakeConsistency diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 268c289259e..8049416a6ab 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -237,7 +237,7 @@ class NormalCall extends DataFlowCall, TNormalCall { * need to track the `View` instance (2) into the receiver of the adjusted method * call, in order to figure out that the call target is in fact `view.html.erb`. */ -private module ViewComponentRenderModeling { +module ViewComponentRenderModeling { private import codeql.ruby.frameworks.ViewComponent private class RenderMethod extends SummarizedCallable, LibraryCallableToIncludeInTypeTracking { @@ -333,7 +333,7 @@ private predicate selfInModule(SelfVariable self, Module m) { /** Holds if `self` belongs to method `method` inside module `m`. */ pragma[nomagic] -private predicate selfInMethod(SelfVariable self, MethodBase method, Module m) { +predicate selfInMethod(SelfVariable self, MethodBase method, Module m) { exists(ModuleBase encl | method = self.getDeclaringScope() and encl = method.getEnclosingModule() and @@ -343,67 +343,6 @@ private predicate selfInMethod(SelfVariable self, MethodBase method, Module m) { ) } -/** Holds if `self` belongs to the top-level. */ -pragma[nomagic] -private predicate selfInToplevel(SelfVariable self, Module m) { - ViewComponentRenderModeling::selfInErbToplevel(self, m) - or - not ViewComponentRenderModeling::selfInErbToplevel(self, _) and - self.getDeclaringScope() instanceof Toplevel and - m = Module::TResolved("Object") -} - -/** - * Holds if SSA definition `def` belongs to a variable introduced via pattern - * matching on type `m`. For example, in - * - * ```rb - * case object - * in C => c then c.foo - * end - * ``` - * - * the SSA definition for `c` is introduced by matching on `C`. - */ -private predicate asModulePattern(SsaDefinitionExtNode def, Module m) { - exists(AsPattern ap | - m = Module::resolveConstantReadAccess(ap.getPattern()) and - def.getDefinitionExt().(Ssa::WriteDefinition).getWriteAccess().getAstNode() = - ap.getVariableAccess() - ) -} - -/** - * Holds if `read1` and `read2` are adjacent reads of SSA definition `def`, - * and `read2` is checked to have type `m`. For example, in - * - * ```rb - * case object - * when C then object.foo - * end - * ``` - * - * the two reads of `object` are adjacent, and the second is checked to have type `C`. - */ -private predicate hasAdjacentTypeCheckedReads( - Ssa::Definition def, CfgNodes::ExprCfgNode read1, CfgNodes::ExprCfgNode read2, Module m -) { - exists( - CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case - | - m = Module::resolveConstantReadAccess(pattern.getExpr()) and - cb.getLastNode() = pattern and - cb.controls(read2.getBasicBlock(), - any(SuccessorTypes::MatchingSuccessor match | match.getValue() = true)) and - def.hasAdjacentReads(read1, read2) and - case.getValue() = read1 - | - pattern = case.getBranch(_).(CfgNodes::ExprNodes::WhenClauseCfgNode).getPattern(_) - or - pattern = case.getBranch(_).(CfgNodes::ExprNodes::InClauseCfgNode).getPattern() - ) -} - /** Holds if `new` is a user-defined `self.new` method. */ predicate isUserDefinedNew(SingletonMethod new) { exists(Expr object | singletonMethod(new, "new", object) | @@ -638,7 +577,7 @@ private predicate hasUserDefinedNew(Module m) { * `self.new` on `m`. */ pragma[nomagic] -private predicate isStandardNewCall(RelevantCall new, Module m, boolean exact) { +predicate isStandardNewCall(RelevantCall new, Module m, boolean exact) { exists(DataFlow::LocalSourceNode sourceNode | flowsToMethodCallReceiver(TNormalCall(new), sourceNode, "new") and // `m` should not have a user-defined `self.new` method @@ -667,106 +606,11 @@ private predicate localFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo, } private module TrackInstanceInput implements CallGraphConstruction::InputSig { - pragma[nomagic] - private predicate isInstanceNoCall(DataFlow::Node n, Module tp, boolean exact) { - n.asExpr().getExpr() instanceof NilLiteral and - tp = Module::TResolved("NilClass") and - exact = true - or - n.asExpr().getExpr().(BooleanLiteral).isFalse() and - tp = Module::TResolved("FalseClass") and - exact = true - or - n.asExpr().getExpr().(BooleanLiteral).isTrue() and - tp = Module::TResolved("TrueClass") and - exact = true - or - n.asExpr().getExpr() instanceof IntegerLiteral and - tp = Module::TResolved("Integer") and - exact = true - or - n.asExpr().getExpr() instanceof FloatLiteral and - tp = Module::TResolved("Float") and - exact = true - or - n.asExpr().getExpr() instanceof RationalLiteral and - tp = Module::TResolved("Rational") and - exact = true - or - n.asExpr().getExpr() instanceof ComplexLiteral and - tp = Module::TResolved("Complex") and - exact = true - or - n.asExpr().getExpr() instanceof StringlikeLiteral and - tp = Module::TResolved("String") and - exact = true - or - n.asExpr() instanceof CfgNodes::ExprNodes::ArrayLiteralCfgNode and - tp = Module::TResolved("Array") and - exact = true - or - n.asExpr() instanceof CfgNodes::ExprNodes::HashLiteralCfgNode and - tp = Module::TResolved("Hash") and - exact = true - or - n.asExpr().getExpr() instanceof MethodBase and - tp = Module::TResolved("Symbol") and - exact = true - or - n.asParameter() instanceof BlockParameter and - tp = Module::TResolved("Proc") and - exact = true - or - n.asExpr().getExpr() instanceof Lambda and - tp = Module::TResolved("Proc") and - exact = true - or - // `self` reference in method or top-level (but not in module or singleton method, - // where instance methods cannot be called; only singleton methods) - n = - any(SelfLocalSourceNode self | - exists(MethodBase m | - selfInMethod(self.getVariable(), m, tp) and - not m instanceof SingletonMethod and - if m.getEnclosingModule() instanceof Toplevel then exact = true else exact = false - ) - or - selfInToplevel(self.getVariable(), tp) and - exact = true - ) - or - // `in C => c then c.foo` - asModulePattern(n, tp) and - exact = false - or - // `case object when C then object.foo` - hasAdjacentTypeCheckedReads(_, _, n.asExpr(), tp) and - exact = false - } - - pragma[nomagic] - private predicate isInstanceCall(DataFlow::Node n, Module tp, boolean exact) { - isStandardNewCall(n.asExpr(), tp, exact) - } - - /** Holds if `n` is an instance of type `tp`. */ - pragma[inline] - private predicate isInstance(DataFlow::Node n, Module tp, boolean exact) { - isInstanceNoCall(n, tp, exact) - or - isInstanceCall(n, tp, exact) - } - - pragma[nomagic] - private predicate hasAdjacentTypeCheckedReads(DataFlow::Node node) { - hasAdjacentTypeCheckedReads(_, _, node.asExpr(), _) - } - newtype State = additional MkState(Module m, Boolean exact) predicate start(DataFlow::Node start, State state) { exists(Module tp, boolean exact | state = MkState(tp, exact) | - isInstance(start, tp, exact) + TypeInference::hasType(start, tp, exact) or exists(Module m | (if m.isClass() then tp = Module::TResolved("Class") else tp = Module::TResolved("Module")) and @@ -784,6 +628,11 @@ private module TrackInstanceInput implements CallGraphConstruction::InputSig { ) } + pragma[nomagic] + private predicate hasAdjacentTypeCheckedRead(DataFlow::Node node) { + TypeInference::hasAdjacentTypeCheckedRead(node.asExpr(), _) + } + pragma[nomagic] predicate stepNoCall(DataFlow::Node nodeFrom, DataFlow::Node nodeTo, StepSummary summary) { smallStepNoCall(nodeFrom, nodeTo, summary) @@ -791,8 +640,8 @@ private module TrackInstanceInput implements CallGraphConstruction::InputSig { // We exclude steps into type checked variables. For those, we instead rely on the // type being checked against localFlowStep(nodeFrom, nodeTo, summary) and - not hasAdjacentTypeCheckedReads(nodeTo) and - not asModulePattern(nodeTo, _) + not hasAdjacentTypeCheckedRead(nodeTo) and + not TypeInference::asModulePattern(nodeTo.(SsaDefinitionExtNode).getDefinitionExt(), _) } predicate stepCall(DataFlow::Node nodeFrom, DataFlow::Node nodeTo, StepSummary summary) { diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 260fb3cab6f..794fd31cffc 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -93,6 +93,14 @@ module SsaFlow { result = TSelfToplevelParameterNode(p.asToplevelSelf()) } + ParameterNodeImpl toParameterNodeImpl(SsaDefinitionExtNode node) { + exists(SsaImpl::WriteDefinition def, SsaImpl::ParameterExt p | + def = node.getDefinitionExt() and + result = toParameterNode(p) and + p.isInitializedBy(def) + ) + } + Impl::Node asNode(Node n) { n = TSsaNode(result) or @@ -694,7 +702,9 @@ private module Cached { cached newtype TDataFlowType = + TModuleDataFlowType(Module m) or TLambdaDataFlowType(Callable c) { c = any(LambdaSelfReferenceNode n).getCallable() } or + TCollectionType() or TUnknownDataFlowType() } @@ -1883,21 +1893,83 @@ predicate expectsContent(Node n, ContentSet c) { } class DataFlowType extends TDataFlowType { - string toString() { result = "" } + string toString() { + exists(Module m | + this = TModuleDataFlowType(m) and + result = m.toString() + ) + or + this = TLambdaDataFlowType(_) and result = "[lambda]" + or + this = TCollectionType() and result = "[collection]" + or + this = TUnknownDataFlowType() and + result = "" + } + + predicate isUnknown() { this = TUnknownDataFlowType() } + + Location getLocation() { + exists(Module m | + this = TModuleDataFlowType(m) and + result = m.getLocation() + ) + or + exists(Callable c | this = TLambdaDataFlowType(c) and result = c.getLocation()) + } } +pragma[nomagic] +private predicate isProcClass(DataFlowType t) { + t = TModuleDataFlowType(any(TypeInference::ProcClass m)) +} + +pragma[nomagic] +private predicate isArrayClass(DataFlowType t) { + t = TModuleDataFlowType(any(TypeInference::ArrayClass m).getADescendent()) +} + +pragma[nomagic] +private predicate isHashClass(DataFlowType t) { + t = TModuleDataFlowType(any(TypeInference::HashClass m).getADescendent()) +} + +private predicate isCollectionClass(DataFlowType t) { isArrayClass(t) or isHashClass(t) } + predicate typeStrongerThan(DataFlowType t1, DataFlowType t2) { - t1 != TUnknownDataFlowType() and - t2 = TUnknownDataFlowType() + not t1.isUnknown() and + t2.isUnknown() + or + exists(Module m1, Module m2 | + t1 = TModuleDataFlowType(m1) and + t2 = TModuleDataFlowType(m2) and + m1.getAnImmediateAncestor+() = m2 + ) + or + t1 instanceof TLambdaDataFlowType and + isProcClass(t2) } -private predicate mustHaveLambdaType(ExprNode n, Callable c) { +private predicate mustHaveLambdaType(Node n, Callable c) { exists(VariableCapture::ClosureExpr ce, CfgNodes::ExprCfgNode e | e = n.asExpr() and ce.hasBody(c) | e = ce or ce.hasAliasedAccess(e) ) + or + n.(CaptureNode).getSynthesizedCaptureNode().isInstanceAccess() and + c = n.(CaptureNode).getSynthesizedCaptureNode().getEnclosingCallable() +} + +private predicate mustHaveCollectionType(Node n, DataFlowType t) { + exists(ContentSet c | readStep(n, c, _) or storeStep(_, c, n) or expectsContent(n, c) | + c.isElement() and + t = TCollectionType() + ) and + not n instanceof SynthHashSplatOrSplatArgumentNode and + not n instanceof SynthHashSplatParameterNode and + not n instanceof SynthSplatParameterNode } predicate localMustFlowStep(Node node1, Node node2) { none() } @@ -1911,15 +1983,40 @@ DataFlowType getNodeType(Node n) { result = TLambdaDataFlowType(c) ) or + mustHaveCollectionType(n, result) + or not n instanceof LambdaSelfReferenceNode and not mustHaveLambdaType(n, _) and - result = TUnknownDataFlowType() + not mustHaveCollectionType(n, _) and + ( + TypeInference::hasModuleType(n, result) + or + not TypeInference::hasModuleType(n, _) and + result.isUnknown() + ) } -pragma[inline] +pragma[nomagic] private predicate compatibleTypesNonSymRefl(DataFlowType t1, DataFlowType t2) { - t1 != TUnknownDataFlowType() and - t2 = TUnknownDataFlowType() + not t1.isUnknown() and + t2.isUnknown() + or + t1 instanceof TLambdaDataFlowType and + isProcClass(t2) + or + t1 instanceof TCollectionType and + isCollectionClass(t2) +} + +pragma[nomagic] +private predicate compatibleModuleTypes(TModuleDataFlowType t1, TModuleDataFlowType t2) { + exists(Module m1, Module m2, Module m3 | + t1 = TModuleDataFlowType(m1) and + t2 = TModuleDataFlowType(m2) + | + m3.getAnAncestor() = m1 and + m3.getAnAncestor() = m2 + ) } /** @@ -1932,6 +2029,8 @@ predicate compatibleTypes(DataFlowType t1, DataFlowType t2) { compatibleTypesNonSymRefl(t1, t2) or compatibleTypesNonSymRefl(t2, t1) + or + compatibleModuleTypes(t1, t2) } abstract class PostUpdateNodeImpl extends Node { @@ -1991,7 +2090,11 @@ private import PostUpdateNodes /** A node that performs a type cast. */ class CastNode extends Node { - CastNode() { none() } + CastNode() { + TypeInference::hasAdjacentTypeCheckedRead(this.asExpr(), _) + or + TypeInference::asModulePattern(this.(SsaDefinitionNode).getDefinition(), _) + } } /** @@ -2191,3 +2294,245 @@ class AdditionalJumpStep extends Unit { */ abstract predicate step(Node pred, Node succ); } + +/** Provides logic for assigning types to data flow nodes. */ +module TypeInference { + private import codeql.ruby.ast.internal.Module + private import DataFlowDispatch + + /** The built-in `Proc` class. */ + class ProcClass extends Module { + ProcClass() { this = TResolved("Proc") } + } + + /** The built-in `Array` class. */ + class ArrayClass extends Module { + ArrayClass() { this = TResolved("Array") } + } + + /** The built-in `Hash` class. */ + class HashClass extends Module { + HashClass() { this = TResolved("Hash") } + } + + /** The built-in `String` class. */ + class StringClass extends Module { + StringClass() { this = TResolved("String") } + } + + /** Holds if `self` belongs to the top-level. */ + pragma[nomagic] + private predicate selfInToplevel(SelfVariable self, Module m) { + ViewComponentRenderModeling::selfInErbToplevel(self, m) + or + not ViewComponentRenderModeling::selfInErbToplevel(self, _) and + self.getDeclaringScope() instanceof Toplevel and + m = TResolved("Object") + } + + /** + * Holds if SSA definition `def` belongs to a variable introduced via pattern + * matching on type `m`. For example, in + * + * ```rb + * case object + * in C => c then c.foo + * end + * ``` + * + * the SSA definition for `c` is introduced by matching on `C`. + */ + predicate asModulePattern(Ssa::WriteDefinition def, Module m) { + exists(AsPattern ap | + m = resolveConstantReadAccess(ap.getPattern()) and + def.getWriteAccess().getAstNode() = ap.getVariableAccess() + ) + } + + /** + * Holds if `caseRead` and `read` are reads of SSA definition `def`, + * and `read` is checked to have type `m`. For example, in + * + * ```rb + * case object + * when C then object.foo + * end + * ``` + * + * the second read of `object` is known to have type `C`. + */ + private predicate hasTypeCheckedRead( + Ssa::Definition def, CfgNodes::ExprCfgNode caseRead, CfgNodes::ExprCfgNode read, Module m + ) { + exists( + CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case + | + m = resolveConstantReadAccess(pattern.getExpr()) and + cb.getLastNode() = pattern and + cb.controls(read.getBasicBlock(), + any(SuccessorTypes::MatchingSuccessor match | match.getValue() = true)) and + caseRead = def.getARead() and + read = def.getARead() and + case.getValue() = caseRead + | + pattern = case.getBranch(_).(CfgNodes::ExprNodes::WhenClauseCfgNode).getPattern(_) + or + pattern = case.getBranch(_).(CfgNodes::ExprNodes::InClauseCfgNode).getPattern() + ) + } + + predicate hasAdjacentTypeCheckedRead(CfgNodes::ExprCfgNode read, Module m) { + exists(Ssa::Definition def, CfgNodes::ExprCfgNode caseRead | + hasTypeCheckedRead(def, caseRead, read, m) and + def.hasAdjacentReads(caseRead, read) + ) + } + + private predicate isTypeCheckedRead(CfgNodes::ExprCfgNode read, Module m) { + exists(Ssa::Definition def | + hasTypeCheckedRead(def, _, read, m) and + // could in principle be checked against a new type + not exists(CfgNodes::ExprCfgNode innerCaseRead | + hasTypeCheckedRead(def, _, innerCaseRead, m) and + hasTypeCheckedRead(def, innerCaseRead, read, _) + ) + ) + } + + pragma[nomagic] + private predicate selfInMethodOrToplevelHasType(SelfVariable self, Module tp, boolean exact) { + exists(MethodBase m | + selfInMethod(self, m, tp) and + not m instanceof SingletonMethod and + if m.getEnclosingModule() instanceof Toplevel then exact = true else exact = false + ) + or + selfInToplevel(self, tp) and + exact = true + } + + pragma[nomagic] + private predicate parameterNodeHasType(ParameterNodeImpl p, Module tp, boolean exact) { + exists(ParameterPosition pos | + p.isParameterOf(_, pos) and + exact = true + | + (pos.isSplat(_) or pos.isSynthSplat(_)) and + tp instanceof ArrayClass + or + (pos.isHashSplat() or pos.isSynthHashSplat()) and + tp instanceof HashClass + ) + or + selfInMethodOrToplevelHasType(p.(SelfParameterNodeImpl).getSelfVariable(), tp, exact) + } + + pragma[nomagic] + private predicate ssaDefHasType(SsaDefinitionExtNode def, Module tp, boolean exact) { + exists(ParameterNodeImpl p | + parameterNodeHasType(p, tp, exact) and + p = SsaFlow::toParameterNodeImpl(def) + ) + or + selfInMethodOrToplevelHasType(def.getVariable(), tp, exact) + or + asModulePattern(def.getDefinitionExt(), tp) and + exact = false + } + + pragma[nomagic] + private predicate hasTypeNoCall(Node n, Module tp, boolean exact) { + n.asExpr().getExpr() instanceof NilLiteral and + tp = TResolved("NilClass") and + exact = true + or + n.asExpr().getExpr().(BooleanLiteral).isFalse() and + tp = TResolved("FalseClass") and + exact = true + or + n.asExpr().getExpr().(BooleanLiteral).isTrue() and + tp = TResolved("TrueClass") and + exact = true + or + n.asExpr().getExpr() instanceof IntegerLiteral and + tp = TResolved("Integer") and + exact = true + or + n.asExpr().getExpr() instanceof FloatLiteral and + tp = TResolved("Float") and + exact = true + or + n.asExpr().getExpr() instanceof RationalLiteral and + tp = TResolved("Rational") and + exact = true + or + n.asExpr().getExpr() instanceof ComplexLiteral and + tp = TResolved("Complex") and + exact = true + or + n.asExpr().getExpr() instanceof StringlikeLiteral and + tp instanceof StringClass and + exact = true + or + ( + n.asExpr() instanceof CfgNodes::ExprNodes::ArrayLiteralCfgNode or + n instanceof SynthSplatArgumentNode + ) and + tp instanceof ArrayClass and + exact = true + or + ( + n.asExpr() instanceof CfgNodes::ExprNodes::HashLiteralCfgNode + or + n instanceof SynthHashSplatArgumentNode + ) and + tp instanceof HashClass and + exact = true + or + n.asExpr().getExpr() instanceof MethodBase and + tp = TResolved("Symbol") and + exact = true + or + ( + n.asParameter() instanceof BlockParameter + or + n instanceof BlockParameterNode + or + n.asExpr().getExpr() instanceof Lambda + ) and + tp instanceof ProcClass and + exact = true + or + parameterNodeHasType(n, tp, exact) + or + exists(SsaDefinitionExtNode def | ssaDefHasType(def, tp, exact) | + n = def or + n.asExpr() = + any(CfgNodes::ExprCfgNode read | + read = def.getDefinitionExt().getARead() and + not isTypeCheckedRead(read, _) // could in principle be checked against a new type + ) + ) + or + // `case object when C then object.foo` + isTypeCheckedRead(n.asExpr(), tp) and + exact = false + } + + pragma[nomagic] + private predicate hasTypeCall(Node n, Module tp, boolean exact) { + isStandardNewCall(n.asExpr(), tp, exact) + } + + pragma[inline] + predicate hasType(Node n, Module tp, boolean exact) { + hasTypeNoCall(n, tp, exact) + or + hasTypeCall(n, tp, exact) + } + + pragma[nomagic] + predicate hasModuleType(Node n, DataFlowType t) { + exists(Module tp | t = TModuleDataFlowType(tp) | hasType(n, tp, _)) + } +} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll index 4daa5fc3011..1172ad8f733 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll @@ -727,6 +727,25 @@ class ContentSet extends TContentSet { this = TElementContentOfTypeContent(type, true) } + /** + * Holds if this content set represents an element in a collection (array or hash). + */ + predicate isElement() { + this.isSingleton(any(Content::ElementContent c)) + or + this.isAnyElement() + or + this.isKnownOrUnknownElement(any(Content::KnownElementContent c)) + or + this.isElementLowerBound(_) + or + this.isElementLowerBoundOrUnknown(_) + or + this.isElementOfType(_) + or + this.isElementOfTypeOrUnknown(_) + } + /** Gets a textual representation of this content set. */ string toString() { exists(Content c | diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll index 3a3eddea63f..2da85f79b5a 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll @@ -117,14 +117,11 @@ private module Cached { // Although flow through collections is modeled precisely using stores/reads, we still // allow flow out of a _tainted_ collection. This is needed in order to support taint- // tracking configurations where the source is a collection. - exists(DataFlow::ContentSet c | readStep(nodeFrom, c, nodeTo) | - c.isSingleton(any(DataFlow::Content::ElementContent ec)) - or - c.isKnownOrUnknownElement(_) - or - c.isAnyElement() - ) and - model = "" + exists(DataFlow::ContentSet c | + readStep(nodeFrom, c, nodeTo) and + c.isElement() and + model = "" + ) } cached diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected index 3899a648b45..b92ce5c33bf 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected @@ -1,2979 +1,2979 @@ models edges -| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:3:10:3:10 | a [element 0] | provenance | | -| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:5:10:5:10 | a [element 0] | provenance | | -| array_flow.rb:2:9:2:20 | * ... [element 0] | array_flow.rb:2:5:2:5 | a [element 0] | provenance | | -| array_flow.rb:2:10:2:20 | call to source | array_flow.rb:2:9:2:20 | * ... [element 0] | provenance | | -| array_flow.rb:3:10:3:10 | a [element 0] | array_flow.rb:3:10:3:13 | ...[...] | provenance | | -| array_flow.rb:5:10:5:10 | a [element 0] | array_flow.rb:5:10:5:13 | ...[...] | provenance | | -| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:11:10:11:10 | a [element 1] | provenance | | -| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:13:10:13:10 | a [element 1] | provenance | | -| array_flow.rb:9:9:9:25 | call to [] [element 1] | array_flow.rb:9:5:9:5 | a [element 1] | provenance | | -| array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:9:9:25 | call to [] [element 1] | provenance | | -| array_flow.rb:11:10:11:10 | a [element 1] | array_flow.rb:11:10:11:13 | ...[...] | provenance | | -| array_flow.rb:13:10:13:10 | a [element 1] | array_flow.rb:13:10:13:13 | ...[...] | provenance | | -| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:18:10:18:10 | a [element] | provenance | | -| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:19:10:19:10 | a [element] | provenance | | -| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:21:19:21:19 | a [element] | provenance | | -| array_flow.rb:17:9:17:33 | call to new [element] | array_flow.rb:17:5:17:5 | a [element] | provenance | | -| array_flow.rb:17:22:17:32 | call to source | array_flow.rb:17:9:17:33 | call to new [element] | provenance | | -| array_flow.rb:18:10:18:10 | a [element] | array_flow.rb:18:10:18:13 | ...[...] | provenance | | -| array_flow.rb:19:10:19:10 | a [element] | array_flow.rb:19:10:19:13 | ...[...] | provenance | | -| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:22:10:22:10 | b [element] | provenance | | -| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:23:10:23:10 | b [element] | provenance | | -| array_flow.rb:21:9:21:20 | call to new [element] | array_flow.rb:21:5:21:5 | b [element] | provenance | | -| array_flow.rb:21:19:21:19 | a [element] | array_flow.rb:21:9:21:20 | call to new [element] | provenance | | -| array_flow.rb:22:10:22:10 | b [element] | array_flow.rb:22:10:22:13 | ...[...] | provenance | | -| array_flow.rb:23:10:23:10 | b [element] | array_flow.rb:23:10:23:13 | ...[...] | provenance | | -| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:28:10:28:10 | c [element] | provenance | | -| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:29:10:29:10 | c [element] | provenance | | -| array_flow.rb:25:9:27:7 | call to new [element] | array_flow.rb:25:5:25:5 | c [element] | provenance | | -| array_flow.rb:26:9:26:19 | call to source | array_flow.rb:25:9:27:7 | call to new [element] | provenance | | -| array_flow.rb:28:10:28:10 | c [element] | array_flow.rb:28:10:28:13 | ...[...] | provenance | | -| array_flow.rb:29:10:29:10 | c [element] | array_flow.rb:29:10:29:13 | ...[...] | provenance | | -| array_flow.rb:33:5:33:5 | a [element 0] | array_flow.rb:34:27:34:27 | a [element 0] | provenance | | -| array_flow.rb:33:9:33:22 | call to [] [element 0] | array_flow.rb:33:5:33:5 | a [element 0] | provenance | | -| array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:9:33:22 | call to [] [element 0] | provenance | | -| array_flow.rb:34:5:34:5 | b [element 0] | array_flow.rb:35:10:35:10 | b [element 0] | provenance | | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | array_flow.rb:34:5:34:5 | b [element 0] | provenance | | -| array_flow.rb:34:27:34:27 | a [element 0] | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | provenance | | -| array_flow.rb:35:10:35:10 | b [element 0] | array_flow.rb:35:10:35:13 | ...[...] | provenance | | -| array_flow.rb:40:5:40:5 | a [element 0] | array_flow.rb:42:9:42:9 | a [element 0] | provenance | | -| array_flow.rb:40:9:40:24 | call to [] [element 0] | array_flow.rb:40:5:40:5 | a [element 0] | provenance | | -| array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:9:40:24 | call to [] [element 0] | provenance | | -| array_flow.rb:41:5:41:5 | b [element 2] | array_flow.rb:42:13:42:13 | b [element 2] | provenance | | -| array_flow.rb:41:9:41:27 | call to [] [element 2] | array_flow.rb:41:5:41:5 | b [element 2] | provenance | | -| array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:9:41:27 | call to [] [element 2] | provenance | | -| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:43:10:43:10 | c [element] | provenance | | -| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:44:10:44:10 | c [element] | provenance | | -| array_flow.rb:42:9:42:9 | a [element 0] | array_flow.rb:42:9:42:13 | ... & ... [element] | provenance | | -| array_flow.rb:42:9:42:13 | ... & ... [element] | array_flow.rb:42:5:42:5 | c [element] | provenance | | -| array_flow.rb:42:13:42:13 | b [element 2] | array_flow.rb:42:9:42:13 | ... & ... [element] | provenance | | -| array_flow.rb:43:10:43:10 | c [element] | array_flow.rb:43:10:43:13 | ...[...] | provenance | | -| array_flow.rb:44:10:44:10 | c [element] | array_flow.rb:44:10:44:13 | ...[...] | provenance | | -| array_flow.rb:48:5:48:5 | a [element 0] | array_flow.rb:49:9:49:9 | a [element 0] | provenance | | -| array_flow.rb:48:9:48:22 | call to [] [element 0] | array_flow.rb:48:5:48:5 | a [element 0] | provenance | | -| array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:9:48:22 | call to [] [element 0] | provenance | | -| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:50:10:50:10 | b [element] | provenance | | -| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:51:10:51:10 | b [element] | provenance | | -| array_flow.rb:49:9:49:9 | a [element 0] | array_flow.rb:49:9:49:13 | ... * ... [element] | provenance | | -| array_flow.rb:49:9:49:13 | ... * ... [element] | array_flow.rb:49:5:49:5 | b [element] | provenance | | -| array_flow.rb:50:10:50:10 | b [element] | array_flow.rb:50:10:50:13 | ...[...] | provenance | | -| array_flow.rb:51:10:51:10 | b [element] | array_flow.rb:51:10:51:13 | ...[...] | provenance | | -| array_flow.rb:55:5:55:5 | a [element 0] | array_flow.rb:57:9:57:9 | a [element 0] | provenance | | -| array_flow.rb:55:9:55:24 | call to [] [element 0] | array_flow.rb:55:5:55:5 | a [element 0] | provenance | | -| array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:9:55:24 | call to [] [element 0] | provenance | | -| array_flow.rb:56:5:56:5 | b [element 1] | array_flow.rb:57:13:57:13 | b [element 1] | provenance | | -| array_flow.rb:56:9:56:24 | call to [] [element 1] | array_flow.rb:56:5:56:5 | b [element 1] | provenance | | -| array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:9:56:24 | call to [] [element 1] | provenance | | -| array_flow.rb:57:5:57:5 | c [element 0] | array_flow.rb:58:10:58:10 | c [element 0] | provenance | | -| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:58:10:58:10 | c [element] | provenance | | -| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:59:10:59:10 | c [element] | provenance | | -| array_flow.rb:57:9:57:9 | a [element 0] | array_flow.rb:57:9:57:13 | ... + ... [element 0] | provenance | | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] | array_flow.rb:57:5:57:5 | c [element 0] | provenance | | -| array_flow.rb:57:9:57:13 | ... + ... [element] | array_flow.rb:57:5:57:5 | c [element] | provenance | | -| array_flow.rb:57:13:57:13 | b [element 1] | array_flow.rb:57:9:57:13 | ... + ... [element] | provenance | | -| array_flow.rb:58:10:58:10 | c [element 0] | array_flow.rb:58:10:58:13 | ...[...] | provenance | | -| array_flow.rb:58:10:58:10 | c [element] | array_flow.rb:58:10:58:13 | ...[...] | provenance | | -| array_flow.rb:59:10:59:10 | c [element] | array_flow.rb:59:10:59:13 | ...[...] | provenance | | -| array_flow.rb:63:5:63:5 | a [element 0] | array_flow.rb:65:9:65:9 | a [element 0] | provenance | | -| array_flow.rb:63:9:63:24 | call to [] [element 0] | array_flow.rb:63:5:63:5 | a [element 0] | provenance | | -| array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:9:63:24 | call to [] [element 0] | provenance | | -| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:66:10:66:10 | c [element] | provenance | | -| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:67:10:67:10 | c [element] | provenance | | -| array_flow.rb:65:9:65:9 | a [element 0] | array_flow.rb:65:9:65:13 | ... - ... [element] | provenance | | -| array_flow.rb:65:9:65:13 | ... - ... [element] | array_flow.rb:65:5:65:5 | c [element] | provenance | | -| array_flow.rb:66:10:66:10 | c [element] | array_flow.rb:66:10:66:13 | ...[...] | provenance | | -| array_flow.rb:67:10:67:10 | c [element] | array_flow.rb:67:10:67:13 | ...[...] | provenance | | -| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:72:9:72:9 | a [element 0] | provenance | | -| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:73:10:73:10 | a [element 0] | provenance | | -| array_flow.rb:71:9:71:24 | call to [] [element 0] | array_flow.rb:71:5:71:5 | a [element 0] | provenance | | -| array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:9:71:24 | call to [] [element 0] | provenance | | -| array_flow.rb:72:5:72:5 | b [element 0] | array_flow.rb:75:10:75:10 | b [element 0] | provenance | | -| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:75:10:75:10 | b [element] | provenance | | -| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:76:10:76:10 | b [element] | provenance | | -| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:73:10:73:10 | a [element] | provenance | | -| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:74:10:74:10 | a [element] | provenance | | -| array_flow.rb:72:9:72:9 | a [element 0] | array_flow.rb:72:9:72:24 | ... << ... [element 0] | provenance | | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] | array_flow.rb:72:5:72:5 | b [element 0] | provenance | | -| array_flow.rb:72:9:72:24 | ... << ... [element] | array_flow.rb:72:5:72:5 | b [element] | provenance | | -| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:9 | [post] a [element] | provenance | | -| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:24 | ... << ... [element] | provenance | | -| array_flow.rb:73:10:73:10 | a [element 0] | array_flow.rb:73:10:73:13 | ...[...] | provenance | | -| array_flow.rb:73:10:73:10 | a [element] | array_flow.rb:73:10:73:13 | ...[...] | provenance | | -| array_flow.rb:74:10:74:10 | a [element] | array_flow.rb:74:10:74:13 | ...[...] | provenance | | -| array_flow.rb:75:10:75:10 | b [element 0] | array_flow.rb:75:10:75:13 | ...[...] | provenance | | -| array_flow.rb:75:10:75:10 | b [element] | array_flow.rb:75:10:75:13 | ...[...] | provenance | | -| array_flow.rb:76:10:76:10 | b [element] | array_flow.rb:76:10:76:13 | ...[...] | provenance | | -| array_flow.rb:80:5:80:5 | a [element 1] | array_flow.rb:81:15:81:15 | a [element 1] | provenance | | -| array_flow.rb:80:9:80:25 | call to [] [element 1] | array_flow.rb:80:5:80:5 | a [element 1] | provenance | | -| array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:9:80:25 | call to [] [element 1] | provenance | | +| array_flow.rb:2:5:2:5 | a : [collection] [element 0] | array_flow.rb:3:10:3:10 | a : [collection] [element 0] | provenance | | +| array_flow.rb:2:5:2:5 | a : [collection] [element 0] | array_flow.rb:5:10:5:10 | a : [collection] [element 0] | provenance | | +| array_flow.rb:2:9:2:20 | * ... : [collection] [element 0] | array_flow.rb:2:5:2:5 | a : [collection] [element 0] | provenance | | +| array_flow.rb:2:10:2:20 | call to source | array_flow.rb:2:9:2:20 | * ... : [collection] [element 0] | provenance | | +| array_flow.rb:3:10:3:10 | a : [collection] [element 0] | array_flow.rb:3:10:3:13 | ...[...] | provenance | | +| array_flow.rb:5:10:5:10 | a : [collection] [element 0] | array_flow.rb:5:10:5:13 | ...[...] | provenance | | +| array_flow.rb:9:5:9:5 | a : Array [element 1] | array_flow.rb:11:10:11:10 | a : Array [element 1] | provenance | | +| array_flow.rb:9:5:9:5 | a : Array [element 1] | array_flow.rb:13:10:13:10 | a : Array [element 1] | provenance | | +| array_flow.rb:9:9:9:25 | call to [] : Array [element 1] | array_flow.rb:9:5:9:5 | a : Array [element 1] | provenance | | +| array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:9:9:25 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:11:10:11:10 | a : Array [element 1] | array_flow.rb:11:10:11:13 | ...[...] | provenance | | +| array_flow.rb:13:10:13:10 | a : Array [element 1] | array_flow.rb:13:10:13:13 | ...[...] | provenance | | +| array_flow.rb:17:5:17:5 | a : [collection] [element] | array_flow.rb:18:10:18:10 | a : [collection] [element] | provenance | | +| array_flow.rb:17:5:17:5 | a : [collection] [element] | array_flow.rb:19:10:19:10 | a : [collection] [element] | provenance | | +| array_flow.rb:17:5:17:5 | a : [collection] [element] | array_flow.rb:21:19:21:19 | a : [collection] [element] | provenance | | +| array_flow.rb:17:9:17:33 | call to new : [collection] [element] | array_flow.rb:17:5:17:5 | a : [collection] [element] | provenance | | +| array_flow.rb:17:22:17:32 | call to source | array_flow.rb:17:9:17:33 | call to new : [collection] [element] | provenance | | +| array_flow.rb:18:10:18:10 | a : [collection] [element] | array_flow.rb:18:10:18:13 | ...[...] | provenance | | +| array_flow.rb:19:10:19:10 | a : [collection] [element] | array_flow.rb:19:10:19:13 | ...[...] | provenance | | +| array_flow.rb:21:5:21:5 | b : [collection] [element] | array_flow.rb:22:10:22:10 | b : [collection] [element] | provenance | | +| array_flow.rb:21:5:21:5 | b : [collection] [element] | array_flow.rb:23:10:23:10 | b : [collection] [element] | provenance | | +| array_flow.rb:21:9:21:20 | call to new : [collection] [element] | array_flow.rb:21:5:21:5 | b : [collection] [element] | provenance | | +| array_flow.rb:21:19:21:19 | a : [collection] [element] | array_flow.rb:21:9:21:20 | call to new : [collection] [element] | provenance | | +| array_flow.rb:22:10:22:10 | b : [collection] [element] | array_flow.rb:22:10:22:13 | ...[...] | provenance | | +| array_flow.rb:23:10:23:10 | b : [collection] [element] | array_flow.rb:23:10:23:13 | ...[...] | provenance | | +| array_flow.rb:25:5:25:5 | c : [collection] [element] | array_flow.rb:28:10:28:10 | c : [collection] [element] | provenance | | +| array_flow.rb:25:5:25:5 | c : [collection] [element] | array_flow.rb:29:10:29:10 | c : [collection] [element] | provenance | | +| array_flow.rb:25:9:27:7 | call to new : [collection] [element] | array_flow.rb:25:5:25:5 | c : [collection] [element] | provenance | | +| array_flow.rb:26:9:26:19 | call to source | array_flow.rb:25:9:27:7 | call to new : [collection] [element] | provenance | | +| array_flow.rb:28:10:28:10 | c : [collection] [element] | array_flow.rb:28:10:28:13 | ...[...] | provenance | | +| array_flow.rb:29:10:29:10 | c : [collection] [element] | array_flow.rb:29:10:29:13 | ...[...] | provenance | | +| array_flow.rb:33:5:33:5 | a : Array [element 0] | array_flow.rb:34:27:34:27 | a : Array [element 0] | provenance | | +| array_flow.rb:33:9:33:22 | call to [] : Array [element 0] | array_flow.rb:33:5:33:5 | a : Array [element 0] | provenance | | +| array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:9:33:22 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:34:5:34:5 | b : Array [element 0] | array_flow.rb:35:10:35:10 | b : Array [element 0] | provenance | | +| array_flow.rb:34:9:34:28 | call to try_convert : Array [element 0] | array_flow.rb:34:5:34:5 | b : Array [element 0] | provenance | | +| array_flow.rb:34:27:34:27 | a : Array [element 0] | array_flow.rb:34:9:34:28 | call to try_convert : Array [element 0] | provenance | | +| array_flow.rb:35:10:35:10 | b : Array [element 0] | array_flow.rb:35:10:35:13 | ...[...] | provenance | | +| array_flow.rb:40:5:40:5 | a : Array [element 0] | array_flow.rb:42:9:42:9 | a : Array [element 0] | provenance | | +| array_flow.rb:40:9:40:24 | call to [] : Array [element 0] | array_flow.rb:40:5:40:5 | a : Array [element 0] | provenance | | +| array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:9:40:24 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:41:5:41:5 | b : Array [element 2] | array_flow.rb:42:13:42:13 | b : Array [element 2] | provenance | | +| array_flow.rb:41:9:41:27 | call to [] : Array [element 2] | array_flow.rb:41:5:41:5 | b : Array [element 2] | provenance | | +| array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:9:41:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:42:5:42:5 | c : [collection] [element] | array_flow.rb:43:10:43:10 | c : [collection] [element] | provenance | | +| array_flow.rb:42:5:42:5 | c : [collection] [element] | array_flow.rb:44:10:44:10 | c : [collection] [element] | provenance | | +| array_flow.rb:42:9:42:9 | a : Array [element 0] | array_flow.rb:42:9:42:13 | ... & ... : [collection] [element] | provenance | | +| array_flow.rb:42:9:42:13 | ... & ... : [collection] [element] | array_flow.rb:42:5:42:5 | c : [collection] [element] | provenance | | +| array_flow.rb:42:13:42:13 | b : Array [element 2] | array_flow.rb:42:9:42:13 | ... & ... : [collection] [element] | provenance | | +| array_flow.rb:43:10:43:10 | c : [collection] [element] | array_flow.rb:43:10:43:13 | ...[...] | provenance | | +| array_flow.rb:44:10:44:10 | c : [collection] [element] | array_flow.rb:44:10:44:13 | ...[...] | provenance | | +| array_flow.rb:48:5:48:5 | a : Array [element 0] | array_flow.rb:49:9:49:9 | a : Array [element 0] | provenance | | +| array_flow.rb:48:9:48:22 | call to [] : Array [element 0] | array_flow.rb:48:5:48:5 | a : Array [element 0] | provenance | | +| array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:9:48:22 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:49:5:49:5 | b : [collection] [element] | array_flow.rb:50:10:50:10 | b : [collection] [element] | provenance | | +| array_flow.rb:49:5:49:5 | b : [collection] [element] | array_flow.rb:51:10:51:10 | b : [collection] [element] | provenance | | +| array_flow.rb:49:9:49:9 | a : Array [element 0] | array_flow.rb:49:9:49:13 | ... * ... : [collection] [element] | provenance | | +| array_flow.rb:49:9:49:13 | ... * ... : [collection] [element] | array_flow.rb:49:5:49:5 | b : [collection] [element] | provenance | | +| array_flow.rb:50:10:50:10 | b : [collection] [element] | array_flow.rb:50:10:50:13 | ...[...] | provenance | | +| array_flow.rb:51:10:51:10 | b : [collection] [element] | array_flow.rb:51:10:51:13 | ...[...] | provenance | | +| array_flow.rb:55:5:55:5 | a : Array [element 0] | array_flow.rb:57:9:57:9 | a : Array [element 0] | provenance | | +| array_flow.rb:55:9:55:24 | call to [] : Array [element 0] | array_flow.rb:55:5:55:5 | a : Array [element 0] | provenance | | +| array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:9:55:24 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:56:5:56:5 | b : Array [element 1] | array_flow.rb:57:13:57:13 | b : Array [element 1] | provenance | | +| array_flow.rb:56:9:56:24 | call to [] : Array [element 1] | array_flow.rb:56:5:56:5 | b : Array [element 1] | provenance | | +| array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:9:56:24 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:57:5:57:5 | c : Array [element 0] | array_flow.rb:58:10:58:10 | c : Array [element 0] | provenance | | +| array_flow.rb:57:5:57:5 | c : [collection] [element] | array_flow.rb:58:10:58:10 | c : [collection] [element] | provenance | | +| array_flow.rb:57:5:57:5 | c : [collection] [element] | array_flow.rb:59:10:59:10 | c : [collection] [element] | provenance | | +| array_flow.rb:57:9:57:9 | a : Array [element 0] | array_flow.rb:57:9:57:13 | ... + ... : Array [element 0] | provenance | | +| array_flow.rb:57:9:57:13 | ... + ... : Array [element 0] | array_flow.rb:57:5:57:5 | c : Array [element 0] | provenance | | +| array_flow.rb:57:9:57:13 | ... + ... : [collection] [element] | array_flow.rb:57:5:57:5 | c : [collection] [element] | provenance | | +| array_flow.rb:57:13:57:13 | b : Array [element 1] | array_flow.rb:57:9:57:13 | ... + ... : [collection] [element] | provenance | | +| array_flow.rb:58:10:58:10 | c : Array [element 0] | array_flow.rb:58:10:58:13 | ...[...] | provenance | | +| array_flow.rb:58:10:58:10 | c : [collection] [element] | array_flow.rb:58:10:58:13 | ...[...] | provenance | | +| array_flow.rb:59:10:59:10 | c : [collection] [element] | array_flow.rb:59:10:59:13 | ...[...] | provenance | | +| array_flow.rb:63:5:63:5 | a : Array [element 0] | array_flow.rb:65:9:65:9 | a : Array [element 0] | provenance | | +| array_flow.rb:63:9:63:24 | call to [] : Array [element 0] | array_flow.rb:63:5:63:5 | a : Array [element 0] | provenance | | +| array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:9:63:24 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:65:5:65:5 | c : [collection] [element] | array_flow.rb:66:10:66:10 | c : [collection] [element] | provenance | | +| array_flow.rb:65:5:65:5 | c : [collection] [element] | array_flow.rb:67:10:67:10 | c : [collection] [element] | provenance | | +| array_flow.rb:65:9:65:9 | a : Array [element 0] | array_flow.rb:65:9:65:13 | ... - ... : [collection] [element] | provenance | | +| array_flow.rb:65:9:65:13 | ... - ... : [collection] [element] | array_flow.rb:65:5:65:5 | c : [collection] [element] | provenance | | +| array_flow.rb:66:10:66:10 | c : [collection] [element] | array_flow.rb:66:10:66:13 | ...[...] | provenance | | +| array_flow.rb:67:10:67:10 | c : [collection] [element] | array_flow.rb:67:10:67:13 | ...[...] | provenance | | +| array_flow.rb:71:5:71:5 | a : Array [element 0] | array_flow.rb:72:9:72:9 | a : Array [element 0] | provenance | | +| array_flow.rb:71:5:71:5 | a : Array [element 0] | array_flow.rb:73:10:73:10 | a : Array [element 0] | provenance | | +| array_flow.rb:71:9:71:24 | call to [] : Array [element 0] | array_flow.rb:71:5:71:5 | a : Array [element 0] | provenance | | +| array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:9:71:24 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:72:5:72:5 | b : Array [element 0] | array_flow.rb:75:10:75:10 | b : Array [element 0] | provenance | | +| array_flow.rb:72:5:72:5 | b : [collection] [element] | array_flow.rb:75:10:75:10 | b : [collection] [element] | provenance | | +| array_flow.rb:72:5:72:5 | b : [collection] [element] | array_flow.rb:76:10:76:10 | b : [collection] [element] | provenance | | +| array_flow.rb:72:9:72:9 | [post] a : [collection] [element] | array_flow.rb:73:10:73:10 | a : [collection] [element] | provenance | | +| array_flow.rb:72:9:72:9 | [post] a : [collection] [element] | array_flow.rb:74:10:74:10 | a : [collection] [element] | provenance | | +| array_flow.rb:72:9:72:9 | a : Array [element 0] | array_flow.rb:72:9:72:24 | ... << ... : Array [element 0] | provenance | | +| array_flow.rb:72:9:72:24 | ... << ... : Array [element 0] | array_flow.rb:72:5:72:5 | b : Array [element 0] | provenance | | +| array_flow.rb:72:9:72:24 | ... << ... : [collection] [element] | array_flow.rb:72:5:72:5 | b : [collection] [element] | provenance | | +| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:24 | ... << ... : [collection] [element] | provenance | | +| array_flow.rb:73:10:73:10 | a : Array [element 0] | array_flow.rb:73:10:73:13 | ...[...] | provenance | | +| array_flow.rb:73:10:73:10 | a : [collection] [element] | array_flow.rb:73:10:73:13 | ...[...] | provenance | | +| array_flow.rb:74:10:74:10 | a : [collection] [element] | array_flow.rb:74:10:74:13 | ...[...] | provenance | | +| array_flow.rb:75:10:75:10 | b : Array [element 0] | array_flow.rb:75:10:75:13 | ...[...] | provenance | | +| array_flow.rb:75:10:75:10 | b : [collection] [element] | array_flow.rb:75:10:75:13 | ...[...] | provenance | | +| array_flow.rb:76:10:76:10 | b : [collection] [element] | array_flow.rb:76:10:76:13 | ...[...] | provenance | | +| array_flow.rb:80:5:80:5 | a : Array [element 1] | array_flow.rb:81:15:81:15 | a : Array [element 1] | provenance | | +| array_flow.rb:80:9:80:25 | call to [] : Array [element 1] | array_flow.rb:80:5:80:5 | a : Array [element 1] | provenance | | +| array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:9:80:25 | call to [] : Array [element 1] | provenance | | | array_flow.rb:81:8:81:8 | c | array_flow.rb:83:10:83:10 | c | provenance | | -| array_flow.rb:81:15:81:15 | a [element 1] | array_flow.rb:81:8:81:8 | c | provenance | | -| array_flow.rb:88:5:88:5 | a [element 1] | array_flow.rb:89:9:89:9 | a [element 1] | provenance | | -| array_flow.rb:88:9:88:26 | call to [] [element 1] | array_flow.rb:88:5:88:5 | a [element 1] | provenance | | -| array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:9:88:26 | call to [] [element 1] | provenance | | -| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:91:10:91:10 | b [element 1] | provenance | | -| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:92:10:92:10 | b [element 1] | provenance | | -| array_flow.rb:89:9:89:9 | a [element 1] | array_flow.rb:89:9:89:15 | ...[...] [element 1] | provenance | | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] | array_flow.rb:89:5:89:5 | b [element 1] | provenance | | -| array_flow.rb:91:10:91:10 | b [element 1] | array_flow.rb:91:10:91:13 | ...[...] | provenance | | -| array_flow.rb:92:10:92:10 | b [element 1] | array_flow.rb:92:10:92:13 | ...[...] | provenance | | -| array_flow.rb:96:5:96:5 | a [element 1] | array_flow.rb:97:9:97:9 | a [element 1] | provenance | | -| array_flow.rb:96:9:96:26 | call to [] [element 1] | array_flow.rb:96:5:96:5 | a [element 1] | provenance | | -| array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:9:96:26 | call to [] [element 1] | provenance | | -| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:99:10:99:10 | b [element 1] | provenance | | -| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:101:10:101:10 | b [element 1] | provenance | | -| array_flow.rb:97:9:97:9 | a [element 1] | array_flow.rb:97:9:97:15 | ...[...] [element 1] | provenance | | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] | array_flow.rb:97:5:97:5 | b [element 1] | provenance | | -| array_flow.rb:99:10:99:10 | b [element 1] | array_flow.rb:99:10:99:13 | ...[...] | provenance | | -| array_flow.rb:101:10:101:10 | b [element 1] | array_flow.rb:101:10:101:13 | ...[...] | provenance | | -| array_flow.rb:103:5:103:5 | a [element 1] | array_flow.rb:104:9:104:9 | a [element 1] | provenance | | -| array_flow.rb:103:9:103:39 | call to [] [element 1] | array_flow.rb:103:5:103:5 | a [element 1] | provenance | | -| array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:9:103:39 | call to [] [element 1] | provenance | | -| array_flow.rb:104:5:104:5 | b [element 1] | array_flow.rb:106:10:106:10 | b [element 1] | provenance | | -| array_flow.rb:104:9:104:9 | a [element 1] | array_flow.rb:104:9:104:16 | ...[...] [element 1] | provenance | | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] | array_flow.rb:104:5:104:5 | b [element 1] | provenance | | -| array_flow.rb:106:10:106:10 | b [element 1] | array_flow.rb:106:10:106:13 | ...[...] | provenance | | -| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:110:9:110:9 | a [element 1] | provenance | | -| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:114:9:114:9 | a [element 1] | provenance | | -| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:110:9:110:9 | a [element 3] | provenance | | -| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:114:9:114:9 | a [element 3] | provenance | | -| array_flow.rb:109:9:109:42 | call to [] [element 1] | array_flow.rb:109:5:109:5 | a [element 1] | provenance | | -| array_flow.rb:109:9:109:42 | call to [] [element 3] | array_flow.rb:109:5:109:5 | a [element 3] | provenance | | -| array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:9:109:42 | call to [] [element 1] | provenance | | -| array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:9:109:42 | call to [] [element 3] | provenance | | -| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:111:10:111:10 | b [element] | provenance | | -| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:112:10:112:10 | b [element] | provenance | | -| array_flow.rb:110:9:110:9 | a [element 1] | array_flow.rb:110:9:110:18 | ...[...] [element] | provenance | | -| array_flow.rb:110:9:110:9 | a [element 3] | array_flow.rb:110:9:110:18 | ...[...] [element] | provenance | | -| array_flow.rb:110:9:110:18 | ...[...] [element] | array_flow.rb:110:5:110:5 | b [element] | provenance | | -| array_flow.rb:111:10:111:10 | b [element] | array_flow.rb:111:10:111:13 | ...[...] | provenance | | -| array_flow.rb:112:10:112:10 | b [element] | array_flow.rb:112:10:112:13 | ...[...] | provenance | | -| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:115:10:115:10 | b [element] | provenance | | -| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:116:10:116:10 | b [element] | provenance | | -| array_flow.rb:114:9:114:9 | a [element 1] | array_flow.rb:114:9:114:19 | ...[...] [element] | provenance | | -| array_flow.rb:114:9:114:9 | a [element 3] | array_flow.rb:114:9:114:19 | ...[...] [element] | provenance | | -| array_flow.rb:114:9:114:19 | ...[...] [element] | array_flow.rb:114:5:114:5 | b [element] | provenance | | -| array_flow.rb:115:10:115:10 | b [element] | array_flow.rb:115:10:115:13 | ...[...] | provenance | | -| array_flow.rb:116:10:116:10 | b [element] | array_flow.rb:116:10:116:13 | ...[...] | provenance | | -| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:122:10:122:10 | a [element] | provenance | | -| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:123:10:123:10 | a [element] | provenance | | -| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:124:10:124:10 | a [element] | provenance | | -| array_flow.rb:121:15:121:24 | call to source | array_flow.rb:121:5:121:5 | [post] a [element] | provenance | | -| array_flow.rb:122:10:122:10 | a [element] | array_flow.rb:122:10:122:13 | ...[...] | provenance | | -| array_flow.rb:123:10:123:10 | a [element] | array_flow.rb:123:10:123:13 | ...[...] | provenance | | -| array_flow.rb:124:10:124:10 | a [element] | array_flow.rb:124:10:124:13 | ...[...] | provenance | | -| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:130:10:130:10 | a [element] | provenance | | -| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:131:10:131:10 | a [element] | provenance | | -| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:132:10:132:10 | a [element] | provenance | | -| array_flow.rb:129:15:129:32 | call to [] [element 1] | array_flow.rb:129:5:129:5 | [post] a [element] | provenance | | -| array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:15:129:32 | call to [] [element 1] | provenance | | -| array_flow.rb:130:10:130:10 | a [element] | array_flow.rb:130:10:130:13 | ...[...] | provenance | | -| array_flow.rb:131:10:131:10 | a [element] | array_flow.rb:131:10:131:13 | ...[...] | provenance | | -| array_flow.rb:132:10:132:10 | a [element] | array_flow.rb:132:10:132:13 | ...[...] | provenance | | -| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:138:10:138:10 | a [element] | provenance | | -| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:139:10:139:10 | a [element] | provenance | | -| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:140:10:140:10 | a [element] | provenance | | -| array_flow.rb:137:15:137:24 | call to source | array_flow.rb:137:5:137:5 | [post] a [element] | provenance | | -| array_flow.rb:138:10:138:10 | a [element] | array_flow.rb:138:10:138:13 | ...[...] | provenance | | -| array_flow.rb:139:10:139:10 | a [element] | array_flow.rb:139:10:139:13 | ...[...] | provenance | | -| array_flow.rb:140:10:140:10 | a [element] | array_flow.rb:140:10:140:13 | ...[...] | provenance | | -| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:146:10:146:10 | a [element] | provenance | | -| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:147:10:147:10 | a [element] | provenance | | -| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:148:10:148:10 | a [element] | provenance | | -| array_flow.rb:145:15:145:32 | call to [] [element 1] | array_flow.rb:145:5:145:5 | [post] a [element] | provenance | | -| array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:15:145:32 | call to [] [element 1] | provenance | | -| array_flow.rb:146:10:146:10 | a [element] | array_flow.rb:146:10:146:13 | ...[...] | provenance | | -| array_flow.rb:147:10:147:10 | a [element] | array_flow.rb:147:10:147:13 | ...[...] | provenance | | -| array_flow.rb:148:10:148:10 | a [element] | array_flow.rb:148:10:148:13 | ...[...] | provenance | | -| array_flow.rb:152:5:152:5 | a [element 2] | array_flow.rb:153:5:153:5 | a [element 2] | provenance | | -| array_flow.rb:152:9:152:26 | call to [] [element 2] | array_flow.rb:152:5:152:5 | a [element 2] | provenance | | -| array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:9:152:26 | call to [] [element 2] | provenance | | -| array_flow.rb:153:5:153:5 | a [element 2] | array_flow.rb:153:16:153:16 | x | provenance | | +| array_flow.rb:81:15:81:15 | a : Array [element 1] | array_flow.rb:81:8:81:8 | c | provenance | | +| array_flow.rb:88:5:88:5 | a : Array [element 1] | array_flow.rb:89:9:89:9 | a : Array [element 1] | provenance | | +| array_flow.rb:88:9:88:26 | call to [] : Array [element 1] | array_flow.rb:88:5:88:5 | a : Array [element 1] | provenance | | +| array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:9:88:26 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:89:5:89:5 | b : [collection] [element 1] | array_flow.rb:91:10:91:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:89:5:89:5 | b : [collection] [element 1] | array_flow.rb:92:10:92:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:89:9:89:9 | a : Array [element 1] | array_flow.rb:89:9:89:15 | ...[...] : [collection] [element 1] | provenance | | +| array_flow.rb:89:9:89:15 | ...[...] : [collection] [element 1] | array_flow.rb:89:5:89:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:91:10:91:10 | b : [collection] [element 1] | array_flow.rb:91:10:91:13 | ...[...] | provenance | | +| array_flow.rb:92:10:92:10 | b : [collection] [element 1] | array_flow.rb:92:10:92:13 | ...[...] | provenance | | +| array_flow.rb:96:5:96:5 | a : Array [element 1] | array_flow.rb:97:9:97:9 | a : Array [element 1] | provenance | | +| array_flow.rb:96:9:96:26 | call to [] : Array [element 1] | array_flow.rb:96:5:96:5 | a : Array [element 1] | provenance | | +| array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:9:96:26 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:97:5:97:5 | b : [collection] [element 1] | array_flow.rb:99:10:99:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:97:5:97:5 | b : [collection] [element 1] | array_flow.rb:101:10:101:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:97:9:97:9 | a : Array [element 1] | array_flow.rb:97:9:97:15 | ...[...] : [collection] [element 1] | provenance | | +| array_flow.rb:97:9:97:15 | ...[...] : [collection] [element 1] | array_flow.rb:97:5:97:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:99:10:99:10 | b : [collection] [element 1] | array_flow.rb:99:10:99:13 | ...[...] | provenance | | +| array_flow.rb:101:10:101:10 | b : [collection] [element 1] | array_flow.rb:101:10:101:13 | ...[...] | provenance | | +| array_flow.rb:103:5:103:5 | a : Array [element 1] | array_flow.rb:104:9:104:9 | a : Array [element 1] | provenance | | +| array_flow.rb:103:9:103:39 | call to [] : Array [element 1] | array_flow.rb:103:5:103:5 | a : Array [element 1] | provenance | | +| array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:9:103:39 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:104:5:104:5 | b : [collection] [element 1] | array_flow.rb:106:10:106:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:104:9:104:9 | a : Array [element 1] | array_flow.rb:104:9:104:16 | ...[...] : [collection] [element 1] | provenance | | +| array_flow.rb:104:9:104:16 | ...[...] : [collection] [element 1] | array_flow.rb:104:5:104:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:106:10:106:10 | b : [collection] [element 1] | array_flow.rb:106:10:106:13 | ...[...] | provenance | | +| array_flow.rb:109:5:109:5 | a : Array [element 1] | array_flow.rb:110:9:110:9 | a : Array [element 1] | provenance | | +| array_flow.rb:109:5:109:5 | a : Array [element 1] | array_flow.rb:114:9:114:9 | a : Array [element 1] | provenance | | +| array_flow.rb:109:5:109:5 | a : Array [element 3] | array_flow.rb:110:9:110:9 | a : Array [element 3] | provenance | | +| array_flow.rb:109:5:109:5 | a : Array [element 3] | array_flow.rb:114:9:114:9 | a : Array [element 3] | provenance | | +| array_flow.rb:109:9:109:42 | call to [] : Array [element 1] | array_flow.rb:109:5:109:5 | a : Array [element 1] | provenance | | +| array_flow.rb:109:9:109:42 | call to [] : Array [element 3] | array_flow.rb:109:5:109:5 | a : Array [element 3] | provenance | | +| array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:9:109:42 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:9:109:42 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:110:5:110:5 | b : [collection] [element] | array_flow.rb:111:10:111:10 | b : [collection] [element] | provenance | | +| array_flow.rb:110:5:110:5 | b : [collection] [element] | array_flow.rb:112:10:112:10 | b : [collection] [element] | provenance | | +| array_flow.rb:110:9:110:9 | a : Array [element 1] | array_flow.rb:110:9:110:18 | ...[...] : [collection] [element] | provenance | | +| array_flow.rb:110:9:110:9 | a : Array [element 3] | array_flow.rb:110:9:110:18 | ...[...] : [collection] [element] | provenance | | +| array_flow.rb:110:9:110:18 | ...[...] : [collection] [element] | array_flow.rb:110:5:110:5 | b : [collection] [element] | provenance | | +| array_flow.rb:111:10:111:10 | b : [collection] [element] | array_flow.rb:111:10:111:13 | ...[...] | provenance | | +| array_flow.rb:112:10:112:10 | b : [collection] [element] | array_flow.rb:112:10:112:13 | ...[...] | provenance | | +| array_flow.rb:114:5:114:5 | b : [collection] [element] | array_flow.rb:115:10:115:10 | b : [collection] [element] | provenance | | +| array_flow.rb:114:5:114:5 | b : [collection] [element] | array_flow.rb:116:10:116:10 | b : [collection] [element] | provenance | | +| array_flow.rb:114:9:114:9 | a : Array [element 1] | array_flow.rb:114:9:114:19 | ...[...] : [collection] [element] | provenance | | +| array_flow.rb:114:9:114:9 | a : Array [element 3] | array_flow.rb:114:9:114:19 | ...[...] : [collection] [element] | provenance | | +| array_flow.rb:114:9:114:19 | ...[...] : [collection] [element] | array_flow.rb:114:5:114:5 | b : [collection] [element] | provenance | | +| array_flow.rb:115:10:115:10 | b : [collection] [element] | array_flow.rb:115:10:115:13 | ...[...] | provenance | | +| array_flow.rb:116:10:116:10 | b : [collection] [element] | array_flow.rb:116:10:116:13 | ...[...] | provenance | | +| array_flow.rb:121:5:121:5 | [post] a : [collection] [element] : [collection] | array_flow.rb:122:10:122:10 | a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:121:5:121:5 | [post] a : [collection] [element] : [collection] | array_flow.rb:123:10:123:10 | a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:121:5:121:5 | [post] a : [collection] [element] : [collection] | array_flow.rb:124:10:124:10 | a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:121:15:121:24 | call to source | array_flow.rb:121:5:121:5 | [post] a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:122:10:122:10 | a : [collection] [element] : [collection] | array_flow.rb:122:10:122:13 | ...[...] | provenance | | +| array_flow.rb:123:10:123:10 | a : [collection] [element] : [collection] | array_flow.rb:123:10:123:13 | ...[...] | provenance | | +| array_flow.rb:124:10:124:10 | a : [collection] [element] : [collection] | array_flow.rb:124:10:124:13 | ...[...] | provenance | | +| array_flow.rb:129:5:129:5 | [post] a : [collection] [element] | array_flow.rb:130:10:130:10 | a : [collection] [element] | provenance | | +| array_flow.rb:129:5:129:5 | [post] a : [collection] [element] | array_flow.rb:131:10:131:10 | a : [collection] [element] | provenance | | +| array_flow.rb:129:5:129:5 | [post] a : [collection] [element] | array_flow.rb:132:10:132:10 | a : [collection] [element] | provenance | | +| array_flow.rb:129:15:129:32 | call to [] : Array [element 1] | array_flow.rb:129:5:129:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:15:129:32 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:130:10:130:10 | a : [collection] [element] | array_flow.rb:130:10:130:13 | ...[...] | provenance | | +| array_flow.rb:131:10:131:10 | a : [collection] [element] | array_flow.rb:131:10:131:13 | ...[...] | provenance | | +| array_flow.rb:132:10:132:10 | a : [collection] [element] | array_flow.rb:132:10:132:13 | ...[...] | provenance | | +| array_flow.rb:137:5:137:5 | [post] a : [collection] [element] : [collection] | array_flow.rb:138:10:138:10 | a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:137:5:137:5 | [post] a : [collection] [element] : [collection] | array_flow.rb:139:10:139:10 | a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:137:5:137:5 | [post] a : [collection] [element] : [collection] | array_flow.rb:140:10:140:10 | a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:137:15:137:24 | call to source | array_flow.rb:137:5:137:5 | [post] a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:138:10:138:10 | a : [collection] [element] : [collection] | array_flow.rb:138:10:138:13 | ...[...] | provenance | | +| array_flow.rb:139:10:139:10 | a : [collection] [element] : [collection] | array_flow.rb:139:10:139:13 | ...[...] | provenance | | +| array_flow.rb:140:10:140:10 | a : [collection] [element] : [collection] | array_flow.rb:140:10:140:13 | ...[...] | provenance | | +| array_flow.rb:145:5:145:5 | [post] a : [collection] [element] | array_flow.rb:146:10:146:10 | a : [collection] [element] | provenance | | +| array_flow.rb:145:5:145:5 | [post] a : [collection] [element] | array_flow.rb:147:10:147:10 | a : [collection] [element] | provenance | | +| array_flow.rb:145:5:145:5 | [post] a : [collection] [element] | array_flow.rb:148:10:148:10 | a : [collection] [element] | provenance | | +| array_flow.rb:145:15:145:32 | call to [] : Array [element 1] | array_flow.rb:145:5:145:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:15:145:32 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:146:10:146:10 | a : [collection] [element] | array_flow.rb:146:10:146:13 | ...[...] | provenance | | +| array_flow.rb:147:10:147:10 | a : [collection] [element] | array_flow.rb:147:10:147:13 | ...[...] | provenance | | +| array_flow.rb:148:10:148:10 | a : [collection] [element] | array_flow.rb:148:10:148:13 | ...[...] | provenance | | +| array_flow.rb:152:5:152:5 | a : Array [element 2] | array_flow.rb:153:5:153:5 | a : Array [element 2] | provenance | | +| array_flow.rb:152:9:152:26 | call to [] : Array [element 2] | array_flow.rb:152:5:152:5 | a : Array [element 2] | provenance | | +| array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:9:152:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:153:5:153:5 | a : Array [element 2] | array_flow.rb:153:16:153:16 | x | provenance | | | array_flow.rb:153:16:153:16 | x | array_flow.rb:154:14:154:14 | x | provenance | | -| array_flow.rb:159:5:159:5 | a [element 2] | array_flow.rb:160:5:160:5 | a [element 2] | provenance | | -| array_flow.rb:159:9:159:26 | call to [] [element 2] | array_flow.rb:159:5:159:5 | a [element 2] | provenance | | -| array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:9:159:26 | call to [] [element 2] | provenance | | -| array_flow.rb:160:5:160:5 | a [element 2] | array_flow.rb:160:16:160:16 | x | provenance | | +| array_flow.rb:159:5:159:5 | a : Array [element 2] | array_flow.rb:160:5:160:5 | a : Array [element 2] | provenance | | +| array_flow.rb:159:9:159:26 | call to [] : Array [element 2] | array_flow.rb:159:5:159:5 | a : Array [element 2] | provenance | | +| array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:9:159:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:160:5:160:5 | a : Array [element 2] | array_flow.rb:160:16:160:16 | x | provenance | | | array_flow.rb:160:16:160:16 | x | array_flow.rb:161:14:161:14 | x | provenance | | -| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:167:9:167:9 | a [element 0] | provenance | | -| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:168:10:168:10 | a [element 0] | provenance | | -| array_flow.rb:166:9:166:25 | call to [] [element 0] | array_flow.rb:166:5:166:5 | a [element 0] | provenance | | -| array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:9:166:25 | call to [] [element 0] | provenance | | -| array_flow.rb:167:5:167:5 | b [element 0] | array_flow.rb:170:10:170:10 | b [element 0] | provenance | | -| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:170:10:170:10 | b [element] | provenance | | -| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:171:10:171:10 | b [element] | provenance | | -| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:168:10:168:10 | a [element] | provenance | | -| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:169:10:169:10 | a [element] | provenance | | -| array_flow.rb:167:9:167:9 | a [element 0] | array_flow.rb:167:9:167:44 | call to append [element 0] | provenance | | -| array_flow.rb:167:9:167:44 | call to append [element 0] | array_flow.rb:167:5:167:5 | b [element 0] | provenance | | -| array_flow.rb:167:9:167:44 | call to append [element] | array_flow.rb:167:5:167:5 | b [element] | provenance | | -| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | provenance | | -| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | provenance | | -| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | provenance | | -| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | provenance | | -| array_flow.rb:168:10:168:10 | a [element 0] | array_flow.rb:168:10:168:13 | ...[...] | provenance | | -| array_flow.rb:168:10:168:10 | a [element] | array_flow.rb:168:10:168:13 | ...[...] | provenance | | -| array_flow.rb:169:10:169:10 | a [element] | array_flow.rb:169:10:169:13 | ...[...] | provenance | | -| array_flow.rb:170:10:170:10 | b [element 0] | array_flow.rb:170:10:170:13 | ...[...] | provenance | | -| array_flow.rb:170:10:170:10 | b [element] | array_flow.rb:170:10:170:13 | ...[...] | provenance | | -| array_flow.rb:171:10:171:10 | b [element] | array_flow.rb:171:10:171:13 | ...[...] | provenance | | -| array_flow.rb:177:5:177:5 | c [element 1] | array_flow.rb:178:16:178:16 | c [element 1] | provenance | | -| array_flow.rb:177:9:177:25 | call to [] [element 1] | array_flow.rb:177:5:177:5 | c [element 1] | provenance | | -| array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:9:177:25 | call to [] [element 1] | provenance | | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:179:11:179:11 | d [element 2, element 1] | provenance | | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:180:11:180:11 | d [element 2, element 1] | provenance | | -| array_flow.rb:178:9:178:17 | call to [] [element 2, element 1] | array_flow.rb:178:5:178:5 | d [element 2, element 1] | provenance | | -| array_flow.rb:178:16:178:16 | c [element 1] | array_flow.rb:178:9:178:17 | call to [] [element 2, element 1] | provenance | | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] | array_flow.rb:179:11:179:22 | call to assoc [element 1] | provenance | | +| array_flow.rb:166:5:166:5 | a : Array [element 0] | array_flow.rb:167:9:167:9 | a : Array [element 0] | provenance | | +| array_flow.rb:166:5:166:5 | a : Array [element 0] | array_flow.rb:168:10:168:10 | a : Array [element 0] | provenance | | +| array_flow.rb:166:9:166:25 | call to [] : Array [element 0] | array_flow.rb:166:5:166:5 | a : Array [element 0] | provenance | | +| array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:9:166:25 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:167:5:167:5 | b : Array [element 0] | array_flow.rb:170:10:170:10 | b : Array [element 0] | provenance | | +| array_flow.rb:167:5:167:5 | b : [collection] [element] | array_flow.rb:170:10:170:10 | b : [collection] [element] | provenance | | +| array_flow.rb:167:5:167:5 | b : [collection] [element] | array_flow.rb:171:10:171:10 | b : [collection] [element] | provenance | | +| array_flow.rb:167:9:167:9 | [post] a : [collection] [element] | array_flow.rb:168:10:168:10 | a : [collection] [element] | provenance | | +| array_flow.rb:167:9:167:9 | [post] a : [collection] [element] | array_flow.rb:169:10:169:10 | a : [collection] [element] | provenance | | +| array_flow.rb:167:9:167:9 | a : Array [element 0] | array_flow.rb:167:9:167:44 | call to append : Array [element 0] | provenance | | +| array_flow.rb:167:9:167:44 | call to append : Array [element 0] | array_flow.rb:167:5:167:5 | b : Array [element 0] | provenance | | +| array_flow.rb:167:9:167:44 | call to append : [collection] [element] | array_flow.rb:167:5:167:5 | b : [collection] [element] | provenance | | +| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:44 | call to append : [collection] [element] | provenance | | +| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:44 | call to append : [collection] [element] | provenance | | +| array_flow.rb:168:10:168:10 | a : Array [element 0] | array_flow.rb:168:10:168:13 | ...[...] | provenance | | +| array_flow.rb:168:10:168:10 | a : [collection] [element] | array_flow.rb:168:10:168:13 | ...[...] | provenance | | +| array_flow.rb:169:10:169:10 | a : [collection] [element] | array_flow.rb:169:10:169:13 | ...[...] | provenance | | +| array_flow.rb:170:10:170:10 | b : Array [element 0] | array_flow.rb:170:10:170:13 | ...[...] | provenance | | +| array_flow.rb:170:10:170:10 | b : [collection] [element] | array_flow.rb:170:10:170:13 | ...[...] | provenance | | +| array_flow.rb:171:10:171:10 | b : [collection] [element] | array_flow.rb:171:10:171:13 | ...[...] | provenance | | +| array_flow.rb:177:5:177:5 | c : Array [element 1] | array_flow.rb:178:16:178:16 | c : Array [element 1] | provenance | | +| array_flow.rb:177:9:177:25 | call to [] : Array [element 1] | array_flow.rb:177:5:177:5 | c : Array [element 1] | provenance | | +| array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:9:177:25 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:178:5:178:5 | d : Array [element 2, element 1] | array_flow.rb:179:11:179:11 | d : Array [element 2, element 1] | provenance | | +| array_flow.rb:178:5:178:5 | d : Array [element 2, element 1] | array_flow.rb:180:11:180:11 | d : Array [element 2, element 1] | provenance | | +| array_flow.rb:178:9:178:17 | call to [] : Array [element 2, element 1] | array_flow.rb:178:5:178:5 | d : Array [element 2, element 1] | provenance | | +| array_flow.rb:178:16:178:16 | c : Array [element 1] | array_flow.rb:178:9:178:17 | call to [] : Array [element 2, element 1] | provenance | | +| array_flow.rb:179:11:179:11 | d : Array [element 2, element 1] | array_flow.rb:179:11:179:22 | call to assoc [element 1] | provenance | | | array_flow.rb:179:11:179:22 | call to assoc [element 1] | array_flow.rb:179:11:179:25 | ...[...] | provenance | | | array_flow.rb:179:11:179:25 | ...[...] | array_flow.rb:179:10:179:26 | ( ... ) | provenance | | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] | array_flow.rb:180:11:180:22 | call to assoc [element 1] | provenance | | +| array_flow.rb:180:11:180:11 | d : Array [element 2, element 1] | array_flow.rb:180:11:180:22 | call to assoc [element 1] | provenance | | | array_flow.rb:180:11:180:22 | call to assoc [element 1] | array_flow.rb:180:11:180:25 | ...[...] | provenance | | | array_flow.rb:180:11:180:25 | ...[...] | array_flow.rb:180:10:180:26 | ( ... ) | provenance | | -| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:186:10:186:10 | a [element 1] | provenance | | -| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:188:10:188:10 | a [element 1] | provenance | | -| array_flow.rb:184:9:184:26 | call to [] [element 1] | array_flow.rb:184:5:184:5 | a [element 1] | provenance | | -| array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:9:184:26 | call to [] [element 1] | provenance | | -| array_flow.rb:186:10:186:10 | a [element 1] | array_flow.rb:186:10:186:16 | call to at | provenance | | -| array_flow.rb:188:10:188:10 | a [element 1] | array_flow.rb:188:10:188:16 | call to at | provenance | | -| array_flow.rb:192:5:192:5 | a [element 2] | array_flow.rb:193:9:193:9 | a [element 2] | provenance | | -| array_flow.rb:192:9:192:26 | call to [] [element 2] | array_flow.rb:192:5:192:5 | a [element 2] | provenance | | -| array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:9:192:26 | call to [] [element 2] | provenance | | +| array_flow.rb:184:5:184:5 | a : Array [element 1] | array_flow.rb:186:10:186:10 | a : Array [element 1] | provenance | | +| array_flow.rb:184:5:184:5 | a : Array [element 1] | array_flow.rb:188:10:188:10 | a : Array [element 1] | provenance | | +| array_flow.rb:184:9:184:26 | call to [] : Array [element 1] | array_flow.rb:184:5:184:5 | a : Array [element 1] | provenance | | +| array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:9:184:26 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:186:10:186:10 | a : Array [element 1] | array_flow.rb:186:10:186:16 | call to at | provenance | | +| array_flow.rb:188:10:188:10 | a : Array [element 1] | array_flow.rb:188:10:188:16 | call to at | provenance | | +| array_flow.rb:192:5:192:5 | a : Array [element 2] | array_flow.rb:193:9:193:9 | a : Array [element 2] | provenance | | +| array_flow.rb:192:9:192:26 | call to [] : Array [element 2] | array_flow.rb:192:5:192:5 | a : Array [element 2] | provenance | | +| array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:9:192:26 | call to [] : Array [element 2] | provenance | | | array_flow.rb:193:5:193:5 | b | array_flow.rb:196:10:196:10 | b | provenance | | -| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:9:195:7 | call to bsearch | provenance | | -| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:23:193:23 | x | provenance | | +| array_flow.rb:193:9:193:9 | a : Array [element 2] | array_flow.rb:193:9:195:7 | call to bsearch | provenance | | +| array_flow.rb:193:9:193:9 | a : Array [element 2] | array_flow.rb:193:23:193:23 | x | provenance | | | array_flow.rb:193:9:195:7 | call to bsearch | array_flow.rb:193:5:193:5 | b | provenance | | | array_flow.rb:193:23:193:23 | x | array_flow.rb:194:14:194:14 | x | provenance | | -| array_flow.rb:200:5:200:5 | a [element 2] | array_flow.rb:201:9:201:9 | a [element 2] | provenance | | -| array_flow.rb:200:9:200:26 | call to [] [element 2] | array_flow.rb:200:5:200:5 | a [element 2] | provenance | | -| array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:9:200:26 | call to [] [element 2] | provenance | | -| array_flow.rb:201:9:201:9 | a [element 2] | array_flow.rb:201:29:201:29 | x | provenance | | +| array_flow.rb:200:5:200:5 | a : Array [element 2] | array_flow.rb:201:9:201:9 | a : Array [element 2] | provenance | | +| array_flow.rb:200:9:200:26 | call to [] : Array [element 2] | array_flow.rb:200:5:200:5 | a : Array [element 2] | provenance | | +| array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:9:200:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:201:9:201:9 | a : Array [element 2] | array_flow.rb:201:29:201:29 | x | provenance | | | array_flow.rb:201:29:201:29 | x | array_flow.rb:202:14:202:14 | x | provenance | | -| array_flow.rb:208:5:208:5 | a [element 2] | array_flow.rb:209:5:209:5 | a [element 2] | provenance | | -| array_flow.rb:208:9:208:26 | call to [] [element 2] | array_flow.rb:208:5:208:5 | a [element 2] | provenance | | -| array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:9:208:26 | call to [] [element 2] | provenance | | -| array_flow.rb:209:5:209:5 | a [element 2] | array_flow.rb:209:17:209:17 | x | provenance | | +| array_flow.rb:208:5:208:5 | a : Array [element 2] | array_flow.rb:209:5:209:5 | a : Array [element 2] | provenance | | +| array_flow.rb:208:9:208:26 | call to [] : Array [element 2] | array_flow.rb:208:5:208:5 | a : Array [element 2] | provenance | | +| array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:9:208:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:209:5:209:5 | a : Array [element 2] | array_flow.rb:209:17:209:17 | x | provenance | | | array_flow.rb:209:17:209:17 | x | array_flow.rb:210:14:210:14 | x | provenance | | -| array_flow.rb:215:5:215:5 | a [element 2] | array_flow.rb:216:9:216:9 | a [element 2] | provenance | | -| array_flow.rb:215:5:215:5 | a [element 3] | array_flow.rb:216:9:216:9 | a [element 3] | provenance | | -| array_flow.rb:215:9:215:42 | call to [] [element 2] | array_flow.rb:215:5:215:5 | a [element 2] | provenance | | -| array_flow.rb:215:9:215:42 | call to [] [element 3] | array_flow.rb:215:5:215:5 | a [element 3] | provenance | | -| array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:9:215:42 | call to [] [element 2] | provenance | | -| array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:9:215:42 | call to [] [element 3] | provenance | | -| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:27:216:27 | x | provenance | | -| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:30:216:30 | y | provenance | | -| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:27:216:27 | x | provenance | | -| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:30:216:30 | y | provenance | | +| array_flow.rb:215:5:215:5 | a : Array [element 2] | array_flow.rb:216:9:216:9 | a : Array [element 2] | provenance | | +| array_flow.rb:215:5:215:5 | a : Array [element 3] | array_flow.rb:216:9:216:9 | a : Array [element 3] | provenance | | +| array_flow.rb:215:9:215:42 | call to [] : Array [element 2] | array_flow.rb:215:5:215:5 | a : Array [element 2] | provenance | | +| array_flow.rb:215:9:215:42 | call to [] : Array [element 3] | array_flow.rb:215:5:215:5 | a : Array [element 3] | provenance | | +| array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:9:215:42 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:9:215:42 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:216:9:216:9 | a : Array [element 2] | array_flow.rb:216:27:216:27 | x | provenance | | +| array_flow.rb:216:9:216:9 | a : Array [element 2] | array_flow.rb:216:30:216:30 | y | provenance | | +| array_flow.rb:216:9:216:9 | a : Array [element 3] | array_flow.rb:216:27:216:27 | x | provenance | | +| array_flow.rb:216:9:216:9 | a : Array [element 3] | array_flow.rb:216:30:216:30 | y | provenance | | | array_flow.rb:216:27:216:27 | x | array_flow.rb:217:14:217:14 | x | provenance | | | array_flow.rb:216:30:216:30 | y | array_flow.rb:218:14:218:14 | y | provenance | | -| array_flow.rb:231:5:231:5 | a [element 2] | array_flow.rb:232:9:232:9 | a [element 2] | provenance | | -| array_flow.rb:231:9:231:28 | call to [] [element 2] | array_flow.rb:231:5:231:5 | a [element 2] | provenance | | -| array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:9:231:28 | call to [] [element 2] | provenance | | -| array_flow.rb:232:5:232:5 | b [element] | array_flow.rb:236:10:236:10 | b [element] | provenance | | -| array_flow.rb:232:9:232:9 | a [element 2] | array_flow.rb:232:23:232:23 | x | provenance | | -| array_flow.rb:232:9:235:7 | call to collect [element] | array_flow.rb:232:5:232:5 | b [element] | provenance | | +| array_flow.rb:231:5:231:5 | a : Array [element 2] | array_flow.rb:232:9:232:9 | a : Array [element 2] | provenance | | +| array_flow.rb:231:9:231:28 | call to [] : Array [element 2] | array_flow.rb:231:5:231:5 | a : Array [element 2] | provenance | | +| array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:9:231:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:232:5:232:5 | b : [collection] [element] | array_flow.rb:236:10:236:10 | b : [collection] [element] | provenance | | +| array_flow.rb:232:9:232:9 | a : Array [element 2] | array_flow.rb:232:23:232:23 | x | provenance | | +| array_flow.rb:232:9:235:7 | call to collect : [collection] [element] | array_flow.rb:232:5:232:5 | b : [collection] [element] | provenance | | | array_flow.rb:232:23:232:23 | x | array_flow.rb:233:14:233:14 | x | provenance | | -| array_flow.rb:234:9:234:19 | call to source | array_flow.rb:232:9:235:7 | call to collect [element] | provenance | | -| array_flow.rb:236:10:236:10 | b [element] | array_flow.rb:236:10:236:13 | ...[...] | provenance | | -| array_flow.rb:240:5:240:5 | a [element 2] | array_flow.rb:241:9:241:9 | a [element 2] | provenance | | -| array_flow.rb:240:9:240:28 | call to [] [element 2] | array_flow.rb:240:5:240:5 | a [element 2] | provenance | | -| array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:9:240:28 | call to [] [element 2] | provenance | | -| array_flow.rb:241:5:241:5 | b [element] | array_flow.rb:246:10:246:10 | b [element] | provenance | | -| array_flow.rb:241:9:241:9 | [post] a [element] | array_flow.rb:245:10:245:10 | a [element] | provenance | | -| array_flow.rb:241:9:241:9 | a [element 2] | array_flow.rb:241:24:241:24 | x | provenance | | -| array_flow.rb:241:9:244:7 | call to collect! [element] | array_flow.rb:241:5:241:5 | b [element] | provenance | | +| array_flow.rb:234:9:234:19 | call to source | array_flow.rb:232:9:235:7 | call to collect : [collection] [element] | provenance | | +| array_flow.rb:236:10:236:10 | b : [collection] [element] | array_flow.rb:236:10:236:13 | ...[...] | provenance | | +| array_flow.rb:240:5:240:5 | a : Array [element 2] | array_flow.rb:241:9:241:9 | a : Array [element 2] | provenance | | +| array_flow.rb:240:9:240:28 | call to [] : Array [element 2] | array_flow.rb:240:5:240:5 | a : Array [element 2] | provenance | | +| array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:9:240:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:241:5:241:5 | b : [collection] [element] | array_flow.rb:246:10:246:10 | b : [collection] [element] | provenance | | +| array_flow.rb:241:9:241:9 | [post] a : [collection] [element] | array_flow.rb:245:10:245:10 | a : [collection] [element] | provenance | | +| array_flow.rb:241:9:241:9 | a : Array [element 2] | array_flow.rb:241:24:241:24 | x | provenance | | +| array_flow.rb:241:9:244:7 | call to collect! : [collection] [element] | array_flow.rb:241:5:241:5 | b : [collection] [element] | provenance | | | array_flow.rb:241:24:241:24 | x | array_flow.rb:242:14:242:14 | x | provenance | | -| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:241:9 | [post] a [element] | provenance | | -| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:244:7 | call to collect! [element] | provenance | | -| array_flow.rb:245:10:245:10 | a [element] | array_flow.rb:245:10:245:13 | ...[...] | provenance | | -| array_flow.rb:246:10:246:10 | b [element] | array_flow.rb:246:10:246:13 | ...[...] | provenance | | -| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:251:9:251:9 | a [element 2] | provenance | | -| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:256:9:256:9 | a [element 2] | provenance | | -| array_flow.rb:250:9:250:28 | call to [] [element 2] | array_flow.rb:250:5:250:5 | a [element 2] | provenance | | -| array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:9:250:28 | call to [] [element 2] | provenance | | -| array_flow.rb:251:5:251:5 | b [element] | array_flow.rb:255:10:255:10 | b [element] | provenance | | -| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | provenance | | -| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:30:251:30 | x | provenance | | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] | array_flow.rb:251:5:251:5 | b [element] | provenance | | +| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:241:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:244:7 | call to collect! : [collection] [element] | provenance | | +| array_flow.rb:245:10:245:10 | a : [collection] [element] | array_flow.rb:245:10:245:13 | ...[...] | provenance | | +| array_flow.rb:246:10:246:10 | b : [collection] [element] | array_flow.rb:246:10:246:13 | ...[...] | provenance | | +| array_flow.rb:250:5:250:5 | a : Array [element 2] | array_flow.rb:251:9:251:9 | a : Array [element 2] | provenance | | +| array_flow.rb:250:5:250:5 | a : Array [element 2] | array_flow.rb:256:9:256:9 | a : Array [element 2] | provenance | | +| array_flow.rb:250:9:250:28 | call to [] : Array [element 2] | array_flow.rb:250:5:250:5 | a : Array [element 2] | provenance | | +| array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:9:250:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:251:5:251:5 | b : [collection] [element] | array_flow.rb:255:10:255:10 | b : [collection] [element] | provenance | | +| array_flow.rb:251:9:251:9 | a : Array [element 2] | array_flow.rb:251:9:254:7 | call to collect_concat : [collection] [element] | provenance | | +| array_flow.rb:251:9:251:9 | a : Array [element 2] | array_flow.rb:251:30:251:30 | x | provenance | | +| array_flow.rb:251:9:254:7 | call to collect_concat : [collection] [element] | array_flow.rb:251:5:251:5 | b : [collection] [element] | provenance | | | array_flow.rb:251:30:251:30 | x | array_flow.rb:252:14:252:14 | x | provenance | | | array_flow.rb:251:30:251:30 | x | array_flow.rb:253:10:253:10 | x | provenance | | -| array_flow.rb:253:9:253:25 | call to [] [element 1] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | provenance | | -| array_flow.rb:253:10:253:10 | x | array_flow.rb:253:9:253:25 | call to [] [element 0] | provenance | | -| array_flow.rb:253:13:253:24 | call to source | array_flow.rb:253:9:253:25 | call to [] [element 1] | provenance | | -| array_flow.rb:255:10:255:10 | b [element] | array_flow.rb:255:10:255:13 | ...[...] | provenance | | -| array_flow.rb:256:5:256:5 | b [element] | array_flow.rb:260:10:260:10 | b [element] | provenance | | -| array_flow.rb:256:9:256:9 | a [element 2] | array_flow.rb:256:30:256:30 | x | provenance | | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] | array_flow.rb:256:5:256:5 | b [element] | provenance | | +| array_flow.rb:253:9:253:25 | call to [] : Array [element 1] | array_flow.rb:251:9:254:7 | call to collect_concat : [collection] [element] | provenance | | +| array_flow.rb:253:10:253:10 | x | array_flow.rb:253:9:253:25 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:253:13:253:24 | call to source | array_flow.rb:253:9:253:25 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:255:10:255:10 | b : [collection] [element] | array_flow.rb:255:10:255:13 | ...[...] | provenance | | +| array_flow.rb:256:5:256:5 | b : [collection] [element] : [collection] | array_flow.rb:260:10:260:10 | b : [collection] [element] : [collection] | provenance | | +| array_flow.rb:256:9:256:9 | a : Array [element 2] | array_flow.rb:256:30:256:30 | x | provenance | | +| array_flow.rb:256:9:259:7 | call to collect_concat : [collection] [element] : [collection] | array_flow.rb:256:5:256:5 | b : [collection] [element] : [collection] | provenance | | | array_flow.rb:256:30:256:30 | x | array_flow.rb:257:14:257:14 | x | provenance | | -| array_flow.rb:258:9:258:20 | call to source | array_flow.rb:256:9:259:7 | call to collect_concat [element] | provenance | | -| array_flow.rb:260:10:260:10 | b [element] | array_flow.rb:260:10:260:13 | ...[...] | provenance | | -| array_flow.rb:264:5:264:5 | a [element 2] | array_flow.rb:265:9:265:9 | a [element 2] | provenance | | -| array_flow.rb:264:9:264:26 | call to [] [element 2] | array_flow.rb:264:5:264:5 | a [element 2] | provenance | | -| array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:9:264:26 | call to [] [element 2] | provenance | | -| array_flow.rb:265:5:265:5 | b [element 2] | array_flow.rb:269:10:269:10 | b [element 2] | provenance | | -| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:9:267:7 | call to combination [element 2] | provenance | | -| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:30:265:30 | x [element] | provenance | | -| array_flow.rb:265:9:267:7 | call to combination [element 2] | array_flow.rb:265:5:265:5 | b [element 2] | provenance | | -| array_flow.rb:265:30:265:30 | x [element] | array_flow.rb:266:14:266:14 | x [element] | provenance | | -| array_flow.rb:266:14:266:14 | x [element] | array_flow.rb:266:14:266:17 | ...[...] | provenance | | -| array_flow.rb:269:10:269:10 | b [element 2] | array_flow.rb:269:10:269:13 | ...[...] | provenance | | -| array_flow.rb:273:5:273:5 | a [element 2] | array_flow.rb:274:9:274:9 | a [element 2] | provenance | | -| array_flow.rb:273:9:273:26 | call to [] [element 2] | array_flow.rb:273:5:273:5 | a [element 2] | provenance | | -| array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:9:273:26 | call to [] [element 2] | provenance | | -| array_flow.rb:274:5:274:5 | b [element] | array_flow.rb:275:10:275:10 | b [element] | provenance | | -| array_flow.rb:274:9:274:9 | a [element 2] | array_flow.rb:274:9:274:17 | call to compact [element] | provenance | | -| array_flow.rb:274:9:274:17 | call to compact [element] | array_flow.rb:274:5:274:5 | b [element] | provenance | | -| array_flow.rb:275:10:275:10 | b [element] | array_flow.rb:275:10:275:13 | ...[...] | provenance | | -| array_flow.rb:279:5:279:5 | a [element 2] | array_flow.rb:280:9:280:9 | a [element 2] | provenance | | -| array_flow.rb:279:9:279:26 | call to [] [element 2] | array_flow.rb:279:5:279:5 | a [element 2] | provenance | | -| array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:9:279:26 | call to [] [element 2] | provenance | | -| array_flow.rb:280:5:280:5 | b [element] | array_flow.rb:282:10:282:10 | b [element] | provenance | | -| array_flow.rb:280:9:280:9 | [post] a [element] | array_flow.rb:281:10:281:10 | a [element] | provenance | | -| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:9 | [post] a [element] | provenance | | -| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:18 | call to compact! [element] | provenance | | -| array_flow.rb:280:9:280:18 | call to compact! [element] | array_flow.rb:280:5:280:5 | b [element] | provenance | | -| array_flow.rb:281:10:281:10 | a [element] | array_flow.rb:281:10:281:13 | ...[...] | provenance | | -| array_flow.rb:282:10:282:10 | b [element] | array_flow.rb:282:10:282:13 | ...[...] | provenance | | -| array_flow.rb:286:5:286:5 | a [element 2] | array_flow.rb:290:10:290:10 | a [element 2] | provenance | | -| array_flow.rb:286:9:286:28 | call to [] [element 2] | array_flow.rb:286:5:286:5 | a [element 2] | provenance | | -| array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:9:286:28 | call to [] [element 2] | provenance | | -| array_flow.rb:287:5:287:5 | b [element 2] | array_flow.rb:288:14:288:14 | b [element 2] | provenance | | -| array_flow.rb:287:9:287:28 | call to [] [element 2] | array_flow.rb:287:5:287:5 | b [element 2] | provenance | | -| array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:9:287:28 | call to [] [element 2] | provenance | | -| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:289:10:289:10 | a [element] | provenance | | -| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:290:10:290:10 | a [element] | provenance | | -| array_flow.rb:288:14:288:14 | b [element 2] | array_flow.rb:288:5:288:5 | [post] a [element] | provenance | | -| array_flow.rb:289:10:289:10 | a [element] | array_flow.rb:289:10:289:13 | ...[...] | provenance | | -| array_flow.rb:290:10:290:10 | a [element 2] | array_flow.rb:290:10:290:13 | ...[...] | provenance | | -| array_flow.rb:290:10:290:10 | a [element] | array_flow.rb:290:10:290:13 | ...[...] | provenance | | -| array_flow.rb:294:5:294:5 | a [element 2] | array_flow.rb:295:5:295:5 | a [element 2] | provenance | | -| array_flow.rb:294:9:294:26 | call to [] [element 2] | array_flow.rb:294:5:294:5 | a [element 2] | provenance | | -| array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:9:294:26 | call to [] [element 2] | provenance | | -| array_flow.rb:295:5:295:5 | a [element 2] | array_flow.rb:295:17:295:17 | x | provenance | | +| array_flow.rb:258:9:258:20 | call to source | array_flow.rb:256:9:259:7 | call to collect_concat : [collection] [element] : [collection] | provenance | | +| array_flow.rb:260:10:260:10 | b : [collection] [element] : [collection] | array_flow.rb:260:10:260:13 | ...[...] | provenance | | +| array_flow.rb:264:5:264:5 | a : Array [element 2] | array_flow.rb:265:9:265:9 | a : Array [element 2] | provenance | | +| array_flow.rb:264:9:264:26 | call to [] : Array [element 2] | array_flow.rb:264:5:264:5 | a : Array [element 2] | provenance | | +| array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:9:264:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:265:5:265:5 | b : Array [element 2] | array_flow.rb:269:10:269:10 | b : Array [element 2] | provenance | | +| array_flow.rb:265:9:265:9 | a : Array [element 2] | array_flow.rb:265:9:267:7 | call to combination : Array [element 2] | provenance | | +| array_flow.rb:265:9:265:9 | a : Array [element 2] | array_flow.rb:265:30:265:30 | x : [collection] [element] | provenance | | +| array_flow.rb:265:9:267:7 | call to combination : Array [element 2] | array_flow.rb:265:5:265:5 | b : Array [element 2] | provenance | | +| array_flow.rb:265:30:265:30 | x : [collection] [element] | array_flow.rb:266:14:266:14 | x : [collection] [element] | provenance | | +| array_flow.rb:266:14:266:14 | x : [collection] [element] | array_flow.rb:266:14:266:17 | ...[...] | provenance | | +| array_flow.rb:269:10:269:10 | b : Array [element 2] | array_flow.rb:269:10:269:13 | ...[...] | provenance | | +| array_flow.rb:273:5:273:5 | a : Array [element 2] | array_flow.rb:274:9:274:9 | a : Array [element 2] | provenance | | +| array_flow.rb:273:9:273:26 | call to [] : Array [element 2] | array_flow.rb:273:5:273:5 | a : Array [element 2] | provenance | | +| array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:9:273:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:274:5:274:5 | b : [collection] [element] | array_flow.rb:275:10:275:10 | b : [collection] [element] | provenance | | +| array_flow.rb:274:9:274:9 | a : Array [element 2] | array_flow.rb:274:9:274:17 | call to compact : [collection] [element] | provenance | | +| array_flow.rb:274:9:274:17 | call to compact : [collection] [element] | array_flow.rb:274:5:274:5 | b : [collection] [element] | provenance | | +| array_flow.rb:275:10:275:10 | b : [collection] [element] | array_flow.rb:275:10:275:13 | ...[...] | provenance | | +| array_flow.rb:279:5:279:5 | a : Array [element 2] | array_flow.rb:280:9:280:9 | a : Array [element 2] | provenance | | +| array_flow.rb:279:9:279:26 | call to [] : Array [element 2] | array_flow.rb:279:5:279:5 | a : Array [element 2] | provenance | | +| array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:9:279:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:280:5:280:5 | b : [collection] [element] | array_flow.rb:282:10:282:10 | b : [collection] [element] | provenance | | +| array_flow.rb:280:9:280:9 | [post] a : [collection] [element] | array_flow.rb:281:10:281:10 | a : [collection] [element] | provenance | | +| array_flow.rb:280:9:280:9 | a : Array [element 2] | array_flow.rb:280:9:280:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:280:9:280:9 | a : Array [element 2] | array_flow.rb:280:9:280:18 | call to compact! : [collection] [element] | provenance | | +| array_flow.rb:280:9:280:18 | call to compact! : [collection] [element] | array_flow.rb:280:5:280:5 | b : [collection] [element] | provenance | | +| array_flow.rb:281:10:281:10 | a : [collection] [element] | array_flow.rb:281:10:281:13 | ...[...] | provenance | | +| array_flow.rb:282:10:282:10 | b : [collection] [element] | array_flow.rb:282:10:282:13 | ...[...] | provenance | | +| array_flow.rb:286:5:286:5 | a : Array [element 2] | array_flow.rb:290:10:290:10 | a : Array [element 2] | provenance | | +| array_flow.rb:286:9:286:28 | call to [] : Array [element 2] | array_flow.rb:286:5:286:5 | a : Array [element 2] | provenance | | +| array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:9:286:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:287:5:287:5 | b : Array [element 2] | array_flow.rb:288:14:288:14 | b : Array [element 2] | provenance | | +| array_flow.rb:287:9:287:28 | call to [] : Array [element 2] | array_flow.rb:287:5:287:5 | b : Array [element 2] | provenance | | +| array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:9:287:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:288:5:288:5 | [post] a : [collection] [element] | array_flow.rb:289:10:289:10 | a : [collection] [element] | provenance | | +| array_flow.rb:288:5:288:5 | [post] a : [collection] [element] | array_flow.rb:290:10:290:10 | a : [collection] [element] | provenance | | +| array_flow.rb:288:14:288:14 | b : Array [element 2] | array_flow.rb:288:5:288:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:289:10:289:10 | a : [collection] [element] | array_flow.rb:289:10:289:13 | ...[...] | provenance | | +| array_flow.rb:290:10:290:10 | a : Array [element 2] | array_flow.rb:290:10:290:13 | ...[...] | provenance | | +| array_flow.rb:290:10:290:10 | a : [collection] [element] | array_flow.rb:290:10:290:13 | ...[...] | provenance | | +| array_flow.rb:294:5:294:5 | a : Array [element 2] | array_flow.rb:295:5:295:5 | a : Array [element 2] | provenance | | +| array_flow.rb:294:9:294:26 | call to [] : Array [element 2] | array_flow.rb:294:5:294:5 | a : Array [element 2] | provenance | | +| array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:9:294:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:295:5:295:5 | a : Array [element 2] | array_flow.rb:295:17:295:17 | x | provenance | | | array_flow.rb:295:17:295:17 | x | array_flow.rb:296:14:296:14 | x | provenance | | -| array_flow.rb:301:5:301:5 | a [element 2] | array_flow.rb:302:5:302:5 | a [element 2] | provenance | | -| array_flow.rb:301:9:301:26 | call to [] [element 2] | array_flow.rb:301:5:301:5 | a [element 2] | provenance | | -| array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:9:301:26 | call to [] [element 2] | provenance | | -| array_flow.rb:302:5:302:5 | a [element 2] | array_flow.rb:302:20:302:20 | x | provenance | | +| array_flow.rb:301:5:301:5 | a : Array [element 2] | array_flow.rb:302:5:302:5 | a : Array [element 2] | provenance | | +| array_flow.rb:301:9:301:26 | call to [] : Array [element 2] | array_flow.rb:301:5:301:5 | a : Array [element 2] | provenance | | +| array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:9:301:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:302:5:302:5 | a : Array [element 2] | array_flow.rb:302:20:302:20 | x | provenance | | | array_flow.rb:302:20:302:20 | x | array_flow.rb:303:14:303:14 | x | provenance | | -| array_flow.rb:308:5:308:5 | a [element 2] | array_flow.rb:309:9:309:9 | a [element 2] | provenance | | -| array_flow.rb:308:9:308:26 | call to [] [element 2] | array_flow.rb:308:5:308:5 | a [element 2] | provenance | | -| array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:9:308:26 | call to [] [element 2] | provenance | | -| array_flow.rb:309:5:309:5 | b [element 2] | array_flow.rb:312:10:312:10 | b [element 2] | provenance | | -| array_flow.rb:309:9:309:9 | a [element 2] | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | provenance | | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | array_flow.rb:309:5:309:5 | b [element 2] | provenance | | -| array_flow.rb:312:10:312:10 | b [element 2] | array_flow.rb:312:10:312:13 | ...[...] | provenance | | -| array_flow.rb:316:5:316:5 | a [element 2] | array_flow.rb:317:9:317:9 | a [element 2] | provenance | | -| array_flow.rb:316:9:316:28 | call to [] [element 2] | array_flow.rb:316:5:316:5 | a [element 2] | provenance | | -| array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:9:316:28 | call to [] [element 2] | provenance | | +| array_flow.rb:308:5:308:5 | a : Array [element 2] | array_flow.rb:309:9:309:9 | a : Array [element 2] | provenance | | +| array_flow.rb:308:9:308:26 | call to [] : Array [element 2] | array_flow.rb:308:5:308:5 | a : Array [element 2] | provenance | | +| array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:9:308:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:309:5:309:5 | b : Array [element 2] | array_flow.rb:312:10:312:10 | b : Array [element 2] | provenance | | +| array_flow.rb:309:9:309:9 | a : Array [element 2] | array_flow.rb:309:9:309:21 | call to deconstruct : Array [element 2] | provenance | | +| array_flow.rb:309:9:309:21 | call to deconstruct : Array [element 2] | array_flow.rb:309:5:309:5 | b : Array [element 2] | provenance | | +| array_flow.rb:312:10:312:10 | b : Array [element 2] | array_flow.rb:312:10:312:13 | ...[...] | provenance | | +| array_flow.rb:316:5:316:5 | a : Array [element 2] | array_flow.rb:317:9:317:9 | a : Array [element 2] | provenance | | +| array_flow.rb:316:9:316:28 | call to [] : Array [element 2] | array_flow.rb:316:5:316:5 | a : Array [element 2] | provenance | | +| array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:9:316:28 | call to [] : Array [element 2] | provenance | | | array_flow.rb:317:5:317:5 | b | array_flow.rb:318:10:318:10 | b | provenance | | -| array_flow.rb:317:9:317:9 | a [element 2] | array_flow.rb:317:9:317:36 | call to delete | provenance | | +| array_flow.rb:317:9:317:9 | a : Array [element 2] | array_flow.rb:317:9:317:36 | call to delete | provenance | | | array_flow.rb:317:9:317:36 | call to delete | array_flow.rb:317:5:317:5 | b | provenance | | | array_flow.rb:317:23:317:34 | call to source | array_flow.rb:317:9:317:36 | call to delete | provenance | | -| array_flow.rb:325:5:325:5 | a [element 2] | array_flow.rb:326:9:326:9 | a [element 2] | provenance | | -| array_flow.rb:325:5:325:5 | a [element 3] | array_flow.rb:326:9:326:9 | a [element 3] | provenance | | -| array_flow.rb:325:9:325:42 | call to [] [element 2] | array_flow.rb:325:5:325:5 | a [element 2] | provenance | | -| array_flow.rb:325:9:325:42 | call to [] [element 3] | array_flow.rb:325:5:325:5 | a [element 3] | provenance | | -| array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:9:325:42 | call to [] [element 2] | provenance | | -| array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:9:325:42 | call to [] [element 3] | provenance | | +| array_flow.rb:325:5:325:5 | a : Array [element 2] | array_flow.rb:326:9:326:9 | a : Array [element 2] | provenance | | +| array_flow.rb:325:5:325:5 | a : Array [element 3] | array_flow.rb:326:9:326:9 | a : Array [element 3] | provenance | | +| array_flow.rb:325:9:325:42 | call to [] : Array [element 2] | array_flow.rb:325:5:325:5 | a : Array [element 2] | provenance | | +| array_flow.rb:325:9:325:42 | call to [] : Array [element 3] | array_flow.rb:325:5:325:5 | a : Array [element 3] | provenance | | +| array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:9:325:42 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:9:325:42 | call to [] : Array [element 3] | provenance | | | array_flow.rb:326:5:326:5 | b | array_flow.rb:327:10:327:10 | b | provenance | | -| array_flow.rb:326:9:326:9 | [post] a [element 2] | array_flow.rb:328:10:328:10 | a [element 2] | provenance | | -| array_flow.rb:326:9:326:9 | a [element 2] | array_flow.rb:326:9:326:22 | call to delete_at | provenance | | -| array_flow.rb:326:9:326:9 | a [element 3] | array_flow.rb:326:9:326:9 | [post] a [element 2] | provenance | | +| array_flow.rb:326:9:326:9 | [post] a : [collection] [element 2] | array_flow.rb:328:10:328:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:326:9:326:9 | a : Array [element 2] | array_flow.rb:326:9:326:22 | call to delete_at | provenance | | +| array_flow.rb:326:9:326:9 | a : Array [element 3] | array_flow.rb:326:9:326:9 | [post] a : [collection] [element 2] | provenance | | | array_flow.rb:326:9:326:22 | call to delete_at | array_flow.rb:326:5:326:5 | b | provenance | | -| array_flow.rb:328:10:328:10 | a [element 2] | array_flow.rb:328:10:328:13 | ...[...] | provenance | | -| array_flow.rb:330:5:330:5 | a [element 2] | array_flow.rb:331:9:331:9 | a [element 2] | provenance | | -| array_flow.rb:330:5:330:5 | a [element 3] | array_flow.rb:331:9:331:9 | a [element 3] | provenance | | -| array_flow.rb:330:9:330:42 | call to [] [element 2] | array_flow.rb:330:5:330:5 | a [element 2] | provenance | | -| array_flow.rb:330:9:330:42 | call to [] [element 3] | array_flow.rb:330:5:330:5 | a [element 3] | provenance | | -| array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:9:330:42 | call to [] [element 2] | provenance | | -| array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:9:330:42 | call to [] [element 3] | provenance | | +| array_flow.rb:328:10:328:10 | a : [collection] [element 2] | array_flow.rb:328:10:328:13 | ...[...] | provenance | | +| array_flow.rb:330:5:330:5 | a : Array [element 2] | array_flow.rb:331:9:331:9 | a : Array [element 2] | provenance | | +| array_flow.rb:330:5:330:5 | a : Array [element 3] | array_flow.rb:331:9:331:9 | a : Array [element 3] | provenance | | +| array_flow.rb:330:9:330:42 | call to [] : Array [element 2] | array_flow.rb:330:5:330:5 | a : Array [element 2] | provenance | | +| array_flow.rb:330:9:330:42 | call to [] : Array [element 3] | array_flow.rb:330:5:330:5 | a : Array [element 3] | provenance | | +| array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:9:330:42 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:9:330:42 | call to [] : Array [element 3] | provenance | | | array_flow.rb:331:5:331:5 | b | array_flow.rb:332:10:332:10 | b | provenance | | -| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:333:10:333:10 | a [element] | provenance | | -| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:334:10:334:10 | a [element] | provenance | | -| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:9 | [post] a [element] | provenance | | -| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:22 | call to delete_at | provenance | | -| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:9 | [post] a [element] | provenance | | -| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:22 | call to delete_at | provenance | | +| array_flow.rb:331:9:331:9 | [post] a : [collection] [element] | array_flow.rb:333:10:333:10 | a : [collection] [element] | provenance | | +| array_flow.rb:331:9:331:9 | [post] a : [collection] [element] | array_flow.rb:334:10:334:10 | a : [collection] [element] | provenance | | +| array_flow.rb:331:9:331:9 | a : Array [element 2] | array_flow.rb:331:9:331:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:331:9:331:9 | a : Array [element 2] | array_flow.rb:331:9:331:22 | call to delete_at | provenance | | +| array_flow.rb:331:9:331:9 | a : Array [element 3] | array_flow.rb:331:9:331:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:331:9:331:9 | a : Array [element 3] | array_flow.rb:331:9:331:22 | call to delete_at | provenance | | | array_flow.rb:331:9:331:22 | call to delete_at | array_flow.rb:331:5:331:5 | b | provenance | | -| array_flow.rb:333:10:333:10 | a [element] | array_flow.rb:333:10:333:13 | ...[...] | provenance | | -| array_flow.rb:334:10:334:10 | a [element] | array_flow.rb:334:10:334:13 | ...[...] | provenance | | -| array_flow.rb:338:5:338:5 | a [element 2] | array_flow.rb:339:9:339:9 | a [element 2] | provenance | | -| array_flow.rb:338:9:338:26 | call to [] [element 2] | array_flow.rb:338:5:338:5 | a [element 2] | provenance | | -| array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:9:338:26 | call to [] [element 2] | provenance | | -| array_flow.rb:339:5:339:5 | b [element] | array_flow.rb:342:10:342:10 | b [element] | provenance | | -| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:343:10:343:10 | a [element] | provenance | | -| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:344:10:344:10 | a [element] | provenance | | -| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:345:10:345:10 | a [element] | provenance | | -| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:339:9 | [post] a [element] | provenance | | -| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:341:7 | call to delete_if [element] | provenance | | -| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:25:339:25 | x | provenance | | -| array_flow.rb:339:9:341:7 | call to delete_if [element] | array_flow.rb:339:5:339:5 | b [element] | provenance | | +| array_flow.rb:333:10:333:10 | a : [collection] [element] | array_flow.rb:333:10:333:13 | ...[...] | provenance | | +| array_flow.rb:334:10:334:10 | a : [collection] [element] | array_flow.rb:334:10:334:13 | ...[...] | provenance | | +| array_flow.rb:338:5:338:5 | a : Array [element 2] | array_flow.rb:339:9:339:9 | a : Array [element 2] | provenance | | +| array_flow.rb:338:9:338:26 | call to [] : Array [element 2] | array_flow.rb:338:5:338:5 | a : Array [element 2] | provenance | | +| array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:9:338:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:339:5:339:5 | b : [collection] [element] | array_flow.rb:342:10:342:10 | b : [collection] [element] | provenance | | +| array_flow.rb:339:9:339:9 | [post] a : [collection] [element] | array_flow.rb:343:10:343:10 | a : [collection] [element] | provenance | | +| array_flow.rb:339:9:339:9 | [post] a : [collection] [element] | array_flow.rb:344:10:344:10 | a : [collection] [element] | provenance | | +| array_flow.rb:339:9:339:9 | [post] a : [collection] [element] | array_flow.rb:345:10:345:10 | a : [collection] [element] | provenance | | +| array_flow.rb:339:9:339:9 | a : Array [element 2] | array_flow.rb:339:9:339:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:339:9:339:9 | a : Array [element 2] | array_flow.rb:339:9:341:7 | call to delete_if : [collection] [element] | provenance | | +| array_flow.rb:339:9:339:9 | a : Array [element 2] | array_flow.rb:339:25:339:25 | x | provenance | | +| array_flow.rb:339:9:341:7 | call to delete_if : [collection] [element] | array_flow.rb:339:5:339:5 | b : [collection] [element] | provenance | | | array_flow.rb:339:25:339:25 | x | array_flow.rb:340:14:340:14 | x | provenance | | -| array_flow.rb:342:10:342:10 | b [element] | array_flow.rb:342:10:342:13 | ...[...] | provenance | | -| array_flow.rb:343:10:343:10 | a [element] | array_flow.rb:343:10:343:13 | ...[...] | provenance | | -| array_flow.rb:344:10:344:10 | a [element] | array_flow.rb:344:10:344:13 | ...[...] | provenance | | -| array_flow.rb:345:10:345:10 | a [element] | array_flow.rb:345:10:345:13 | ...[...] | provenance | | -| array_flow.rb:349:5:349:5 | a [element 2] | array_flow.rb:350:9:350:9 | a [element 2] | provenance | | -| array_flow.rb:349:9:349:26 | call to [] [element 2] | array_flow.rb:349:5:349:5 | a [element 2] | provenance | | -| array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:9:349:26 | call to [] [element 2] | provenance | | -| array_flow.rb:350:5:350:5 | b [element] | array_flow.rb:351:10:351:10 | b [element] | provenance | | -| array_flow.rb:350:9:350:9 | a [element 2] | array_flow.rb:350:9:350:25 | call to difference [element] | provenance | | -| array_flow.rb:350:9:350:25 | call to difference [element] | array_flow.rb:350:5:350:5 | b [element] | provenance | | -| array_flow.rb:351:10:351:10 | b [element] | array_flow.rb:351:10:351:13 | ...[...] | provenance | | -| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:357:10:357:10 | a [element 2] | provenance | | -| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:358:10:358:10 | a [element 2] | provenance | | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] | array_flow.rb:360:10:360:10 | a [element 3, element 1] | provenance | | -| array_flow.rb:355:9:355:47 | call to [] [element 2] | array_flow.rb:355:5:355:5 | a [element 2] | provenance | | -| array_flow.rb:355:9:355:47 | call to [] [element 3, element 1] | array_flow.rb:355:5:355:5 | a [element 3, element 1] | provenance | | -| array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:9:355:47 | call to [] [element 2] | provenance | | -| array_flow.rb:355:30:355:46 | call to [] [element 1] | array_flow.rb:355:9:355:47 | call to [] [element 3, element 1] | provenance | | -| array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:30:355:46 | call to [] [element 1] | provenance | | -| array_flow.rb:357:10:357:10 | a [element 2] | array_flow.rb:357:10:357:17 | call to dig | provenance | | -| array_flow.rb:358:10:358:10 | a [element 2] | array_flow.rb:358:10:358:17 | call to dig | provenance | | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] | array_flow.rb:360:10:360:19 | call to dig | provenance | | -| array_flow.rb:364:5:364:5 | a [element 2] | array_flow.rb:365:9:365:9 | a [element 2] | provenance | | -| array_flow.rb:364:9:364:28 | call to [] [element 2] | array_flow.rb:364:5:364:5 | a [element 2] | provenance | | -| array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:9:364:28 | call to [] [element 2] | provenance | | +| array_flow.rb:342:10:342:10 | b : [collection] [element] | array_flow.rb:342:10:342:13 | ...[...] | provenance | | +| array_flow.rb:343:10:343:10 | a : [collection] [element] | array_flow.rb:343:10:343:13 | ...[...] | provenance | | +| array_flow.rb:344:10:344:10 | a : [collection] [element] | array_flow.rb:344:10:344:13 | ...[...] | provenance | | +| array_flow.rb:345:10:345:10 | a : [collection] [element] | array_flow.rb:345:10:345:13 | ...[...] | provenance | | +| array_flow.rb:349:5:349:5 | a : Array [element 2] | array_flow.rb:350:9:350:9 | a : Array [element 2] | provenance | | +| array_flow.rb:349:9:349:26 | call to [] : Array [element 2] | array_flow.rb:349:5:349:5 | a : Array [element 2] | provenance | | +| array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:9:349:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:350:5:350:5 | b : [collection] [element] | array_flow.rb:351:10:351:10 | b : [collection] [element] | provenance | | +| array_flow.rb:350:9:350:9 | a : Array [element 2] | array_flow.rb:350:9:350:25 | call to difference : [collection] [element] | provenance | | +| array_flow.rb:350:9:350:25 | call to difference : [collection] [element] | array_flow.rb:350:5:350:5 | b : [collection] [element] | provenance | | +| array_flow.rb:351:10:351:10 | b : [collection] [element] | array_flow.rb:351:10:351:13 | ...[...] | provenance | | +| array_flow.rb:355:5:355:5 | a : Array [element 2] | array_flow.rb:357:10:357:10 | a : Array [element 2] | provenance | | +| array_flow.rb:355:5:355:5 | a : Array [element 2] | array_flow.rb:358:10:358:10 | a : Array [element 2] | provenance | | +| array_flow.rb:355:5:355:5 | a : Array [element 3, element 1] | array_flow.rb:360:10:360:10 | a : Array [element 3, element 1] | provenance | | +| array_flow.rb:355:9:355:47 | call to [] : Array [element 2] | array_flow.rb:355:5:355:5 | a : Array [element 2] | provenance | | +| array_flow.rb:355:9:355:47 | call to [] : Array [element 3, element 1] | array_flow.rb:355:5:355:5 | a : Array [element 3, element 1] | provenance | | +| array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:9:355:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:355:30:355:46 | call to [] : Array [element 1] | array_flow.rb:355:9:355:47 | call to [] : Array [element 3, element 1] | provenance | | +| array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:30:355:46 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:357:10:357:10 | a : Array [element 2] | array_flow.rb:357:10:357:17 | call to dig | provenance | | +| array_flow.rb:358:10:358:10 | a : Array [element 2] | array_flow.rb:358:10:358:17 | call to dig | provenance | | +| array_flow.rb:360:10:360:10 | a : Array [element 3, element 1] | array_flow.rb:360:10:360:19 | call to dig | provenance | | +| array_flow.rb:364:5:364:5 | a : Array [element 2] | array_flow.rb:365:9:365:9 | a : Array [element 2] | provenance | | +| array_flow.rb:364:9:364:28 | call to [] : Array [element 2] | array_flow.rb:364:5:364:5 | a : Array [element 2] | provenance | | +| array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:9:364:28 | call to [] : Array [element 2] | provenance | | | array_flow.rb:365:5:365:5 | b | array_flow.rb:368:10:368:10 | b | provenance | | -| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:9:367:7 | call to detect | provenance | | -| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:43:365:43 | x | provenance | | +| array_flow.rb:365:9:365:9 | a : Array [element 2] | array_flow.rb:365:9:367:7 | call to detect | provenance | | +| array_flow.rb:365:9:365:9 | a : Array [element 2] | array_flow.rb:365:43:365:43 | x | provenance | | | array_flow.rb:365:9:367:7 | call to detect | array_flow.rb:365:5:365:5 | b | provenance | | | array_flow.rb:365:23:365:34 | call to source | array_flow.rb:365:9:367:7 | call to detect | provenance | | | array_flow.rb:365:43:365:43 | x | array_flow.rb:366:14:366:14 | x | provenance | | -| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:373:9:373:9 | a [element 2] | provenance | | -| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:375:9:375:9 | a [element 2] | provenance | | -| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:380:9:380:9 | a [element 2] | provenance | | -| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:373:9:373:9 | a [element 3] | provenance | | -| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:375:9:375:9 | a [element 3] | provenance | | -| array_flow.rb:372:9:372:42 | call to [] [element 2] | array_flow.rb:372:5:372:5 | a [element 2] | provenance | | -| array_flow.rb:372:9:372:42 | call to [] [element 3] | array_flow.rb:372:5:372:5 | a [element 3] | provenance | | -| array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:9:372:42 | call to [] [element 2] | provenance | | -| array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:9:372:42 | call to [] [element 3] | provenance | | -| array_flow.rb:373:5:373:5 | b [element] | array_flow.rb:374:10:374:10 | b [element] | provenance | | -| array_flow.rb:373:9:373:9 | a [element 2] | array_flow.rb:373:9:373:17 | call to drop [element] | provenance | | -| array_flow.rb:373:9:373:9 | a [element 3] | array_flow.rb:373:9:373:17 | call to drop [element] | provenance | | -| array_flow.rb:373:9:373:17 | call to drop [element] | array_flow.rb:373:5:373:5 | b [element] | provenance | | -| array_flow.rb:374:10:374:10 | b [element] | array_flow.rb:374:10:374:13 | ...[...] | provenance | | -| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:377:10:377:10 | b [element 1] | provenance | | -| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:378:10:378:10 | b [element 1] | provenance | | -| array_flow.rb:375:5:375:5 | b [element 2] | array_flow.rb:378:10:378:10 | b [element 2] | provenance | | -| array_flow.rb:375:9:375:9 | a [element 2] | array_flow.rb:375:9:375:17 | call to drop [element 1] | provenance | | -| array_flow.rb:375:9:375:9 | a [element 3] | array_flow.rb:375:9:375:17 | call to drop [element 2] | provenance | | -| array_flow.rb:375:9:375:17 | call to drop [element 1] | array_flow.rb:375:5:375:5 | b [element 1] | provenance | | -| array_flow.rb:375:9:375:17 | call to drop [element 2] | array_flow.rb:375:5:375:5 | b [element 2] | provenance | | -| array_flow.rb:377:10:377:10 | b [element 1] | array_flow.rb:377:10:377:13 | ...[...] | provenance | | -| array_flow.rb:378:10:378:10 | b [element 1] | array_flow.rb:378:10:378:13 | ...[...] | provenance | | -| array_flow.rb:378:10:378:10 | b [element 2] | array_flow.rb:378:10:378:13 | ...[...] | provenance | | -| array_flow.rb:379:5:379:5 | [post] a [element] | array_flow.rb:380:9:380:9 | a [element] | provenance | | -| array_flow.rb:379:12:379:23 | call to source | array_flow.rb:379:5:379:5 | [post] a [element] | provenance | | -| array_flow.rb:380:5:380:5 | b [element 1] | array_flow.rb:381:10:381:10 | b [element 1] | provenance | | -| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:381:10:381:10 | b [element] | provenance | | -| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:382:9:382:9 | b [element] | provenance | | -| array_flow.rb:380:9:380:9 | a [element 2] | array_flow.rb:380:9:380:17 | call to drop [element 1] | provenance | | -| array_flow.rb:380:9:380:9 | a [element] | array_flow.rb:380:9:380:17 | call to drop [element] | provenance | | -| array_flow.rb:380:9:380:17 | call to drop [element 1] | array_flow.rb:380:5:380:5 | b [element 1] | provenance | | -| array_flow.rb:380:9:380:17 | call to drop [element] | array_flow.rb:380:5:380:5 | b [element] | provenance | | -| array_flow.rb:381:10:381:10 | b [element 1] | array_flow.rb:381:10:381:13 | ...[...] | provenance | | -| array_flow.rb:381:10:381:10 | b [element] | array_flow.rb:381:10:381:13 | ...[...] | provenance | | -| array_flow.rb:382:5:382:5 | c [element] | array_flow.rb:383:10:383:10 | c [element] | provenance | | -| array_flow.rb:382:9:382:9 | b [element] | array_flow.rb:382:9:382:19 | call to drop [element] | provenance | | -| array_flow.rb:382:9:382:19 | call to drop [element] | array_flow.rb:382:5:382:5 | c [element] | provenance | | -| array_flow.rb:383:10:383:10 | c [element] | array_flow.rb:383:10:383:13 | ...[...] | provenance | | -| array_flow.rb:387:5:387:5 | a [element 2] | array_flow.rb:388:9:388:9 | a [element 2] | provenance | | -| array_flow.rb:387:5:387:5 | a [element 3] | array_flow.rb:388:9:388:9 | a [element 3] | provenance | | -| array_flow.rb:387:9:387:42 | call to [] [element 2] | array_flow.rb:387:5:387:5 | a [element 2] | provenance | | -| array_flow.rb:387:9:387:42 | call to [] [element 3] | array_flow.rb:387:5:387:5 | a [element 3] | provenance | | -| array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:9:387:42 | call to [] [element 2] | provenance | | -| array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:9:387:42 | call to [] [element 3] | provenance | | -| array_flow.rb:388:5:388:5 | b [element] | array_flow.rb:391:10:391:10 | b [element] | provenance | | -| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:9:390:7 | call to drop_while [element] | provenance | | -| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:26:388:26 | x | provenance | | -| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:9:390:7 | call to drop_while [element] | provenance | | -| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:26:388:26 | x | provenance | | -| array_flow.rb:388:9:390:7 | call to drop_while [element] | array_flow.rb:388:5:388:5 | b [element] | provenance | | +| array_flow.rb:372:5:372:5 | a : Array [element 2] | array_flow.rb:373:9:373:9 | a : Array [element 2] | provenance | | +| array_flow.rb:372:5:372:5 | a : Array [element 2] | array_flow.rb:375:9:375:9 | a : Array [element 2] | provenance | | +| array_flow.rb:372:5:372:5 | a : Array [element 2] | array_flow.rb:380:9:380:9 | a : Array [element 2] | provenance | | +| array_flow.rb:372:5:372:5 | a : Array [element 3] | array_flow.rb:373:9:373:9 | a : Array [element 3] | provenance | | +| array_flow.rb:372:5:372:5 | a : Array [element 3] | array_flow.rb:375:9:375:9 | a : Array [element 3] | provenance | | +| array_flow.rb:372:9:372:42 | call to [] : Array [element 2] | array_flow.rb:372:5:372:5 | a : Array [element 2] | provenance | | +| array_flow.rb:372:9:372:42 | call to [] : Array [element 3] | array_flow.rb:372:5:372:5 | a : Array [element 3] | provenance | | +| array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:9:372:42 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:9:372:42 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:373:5:373:5 | b : [collection] [element] | array_flow.rb:374:10:374:10 | b : [collection] [element] | provenance | | +| array_flow.rb:373:9:373:9 | a : Array [element 2] | array_flow.rb:373:9:373:17 | call to drop : [collection] [element] | provenance | | +| array_flow.rb:373:9:373:9 | a : Array [element 3] | array_flow.rb:373:9:373:17 | call to drop : [collection] [element] | provenance | | +| array_flow.rb:373:9:373:17 | call to drop : [collection] [element] | array_flow.rb:373:5:373:5 | b : [collection] [element] | provenance | | +| array_flow.rb:374:10:374:10 | b : [collection] [element] | array_flow.rb:374:10:374:13 | ...[...] | provenance | | +| array_flow.rb:375:5:375:5 | b : [collection] [element 1] | array_flow.rb:377:10:377:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:375:5:375:5 | b : [collection] [element 1] | array_flow.rb:378:10:378:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:375:5:375:5 | b : [collection] [element 2] | array_flow.rb:378:10:378:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:375:9:375:9 | a : Array [element 2] | array_flow.rb:375:9:375:17 | call to drop : [collection] [element 1] | provenance | | +| array_flow.rb:375:9:375:9 | a : Array [element 3] | array_flow.rb:375:9:375:17 | call to drop : [collection] [element 2] | provenance | | +| array_flow.rb:375:9:375:17 | call to drop : [collection] [element 1] | array_flow.rb:375:5:375:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:375:9:375:17 | call to drop : [collection] [element 2] | array_flow.rb:375:5:375:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:377:10:377:10 | b : [collection] [element 1] | array_flow.rb:377:10:377:13 | ...[...] | provenance | | +| array_flow.rb:378:10:378:10 | b : [collection] [element 1] | array_flow.rb:378:10:378:13 | ...[...] | provenance | | +| array_flow.rb:378:10:378:10 | b : [collection] [element 2] | array_flow.rb:378:10:378:13 | ...[...] | provenance | | +| array_flow.rb:379:5:379:5 | [post] a : [collection] [element] | array_flow.rb:380:9:380:9 | a : [collection] [element] | provenance | | +| array_flow.rb:379:12:379:23 | call to source | array_flow.rb:379:5:379:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:380:5:380:5 | b : [collection] [element 1] | array_flow.rb:381:10:381:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:380:5:380:5 | b : [collection] [element] | array_flow.rb:381:10:381:10 | b : [collection] [element] | provenance | | +| array_flow.rb:380:5:380:5 | b : [collection] [element] | array_flow.rb:382:9:382:9 | b : [collection] [element] | provenance | | +| array_flow.rb:380:9:380:9 | a : Array [element 2] | array_flow.rb:380:9:380:17 | call to drop : [collection] [element 1] | provenance | | +| array_flow.rb:380:9:380:9 | a : [collection] [element] | array_flow.rb:380:9:380:17 | call to drop : [collection] [element] | provenance | | +| array_flow.rb:380:9:380:17 | call to drop : [collection] [element 1] | array_flow.rb:380:5:380:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:380:9:380:17 | call to drop : [collection] [element] | array_flow.rb:380:5:380:5 | b : [collection] [element] | provenance | | +| array_flow.rb:381:10:381:10 | b : [collection] [element 1] | array_flow.rb:381:10:381:13 | ...[...] | provenance | | +| array_flow.rb:381:10:381:10 | b : [collection] [element] | array_flow.rb:381:10:381:13 | ...[...] | provenance | | +| array_flow.rb:382:5:382:5 | c : [collection] [element] | array_flow.rb:383:10:383:10 | c : [collection] [element] | provenance | | +| array_flow.rb:382:9:382:9 | b : [collection] [element] | array_flow.rb:382:9:382:19 | call to drop : [collection] [element] | provenance | | +| array_flow.rb:382:9:382:19 | call to drop : [collection] [element] | array_flow.rb:382:5:382:5 | c : [collection] [element] | provenance | | +| array_flow.rb:383:10:383:10 | c : [collection] [element] | array_flow.rb:383:10:383:13 | ...[...] | provenance | | +| array_flow.rb:387:5:387:5 | a : Array [element 2] | array_flow.rb:388:9:388:9 | a : Array [element 2] | provenance | | +| array_flow.rb:387:5:387:5 | a : Array [element 3] | array_flow.rb:388:9:388:9 | a : Array [element 3] | provenance | | +| array_flow.rb:387:9:387:42 | call to [] : Array [element 2] | array_flow.rb:387:5:387:5 | a : Array [element 2] | provenance | | +| array_flow.rb:387:9:387:42 | call to [] : Array [element 3] | array_flow.rb:387:5:387:5 | a : Array [element 3] | provenance | | +| array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:9:387:42 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:9:387:42 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:388:5:388:5 | b : [collection] [element] | array_flow.rb:391:10:391:10 | b : [collection] [element] | provenance | | +| array_flow.rb:388:9:388:9 | a : Array [element 2] | array_flow.rb:388:9:390:7 | call to drop_while : [collection] [element] | provenance | | +| array_flow.rb:388:9:388:9 | a : Array [element 2] | array_flow.rb:388:26:388:26 | x | provenance | | +| array_flow.rb:388:9:388:9 | a : Array [element 3] | array_flow.rb:388:9:390:7 | call to drop_while : [collection] [element] | provenance | | +| array_flow.rb:388:9:388:9 | a : Array [element 3] | array_flow.rb:388:26:388:26 | x | provenance | | +| array_flow.rb:388:9:390:7 | call to drop_while : [collection] [element] | array_flow.rb:388:5:388:5 | b : [collection] [element] | provenance | | | array_flow.rb:388:26:388:26 | x | array_flow.rb:389:14:389:14 | x | provenance | | -| array_flow.rb:391:10:391:10 | b [element] | array_flow.rb:391:10:391:13 | ...[...] | provenance | | -| array_flow.rb:395:5:395:5 | a [element 2] | array_flow.rb:396:9:396:9 | a [element 2] | provenance | | -| array_flow.rb:395:9:395:26 | call to [] [element 2] | array_flow.rb:395:5:395:5 | a [element 2] | provenance | | -| array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:9:395:26 | call to [] [element 2] | provenance | | -| array_flow.rb:396:5:396:5 | b [element 2] | array_flow.rb:399:10:399:10 | b [element 2] | provenance | | -| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:9:398:7 | call to each [element 2] | provenance | | -| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:20:396:20 | x | provenance | | -| array_flow.rb:396:9:398:7 | call to each [element 2] | array_flow.rb:396:5:396:5 | b [element 2] | provenance | | +| array_flow.rb:391:10:391:10 | b : [collection] [element] | array_flow.rb:391:10:391:13 | ...[...] | provenance | | +| array_flow.rb:395:5:395:5 | a : Array [element 2] | array_flow.rb:396:9:396:9 | a : Array [element 2] | provenance | | +| array_flow.rb:395:9:395:26 | call to [] : Array [element 2] | array_flow.rb:395:5:395:5 | a : Array [element 2] | provenance | | +| array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:9:395:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:396:5:396:5 | b : Array [element 2] | array_flow.rb:399:10:399:10 | b : Array [element 2] | provenance | | +| array_flow.rb:396:9:396:9 | a : Array [element 2] | array_flow.rb:396:9:398:7 | call to each : Array [element 2] | provenance | | +| array_flow.rb:396:9:396:9 | a : Array [element 2] | array_flow.rb:396:20:396:20 | x | provenance | | +| array_flow.rb:396:9:398:7 | call to each : Array [element 2] | array_flow.rb:396:5:396:5 | b : Array [element 2] | provenance | | | array_flow.rb:396:20:396:20 | x | array_flow.rb:397:14:397:14 | x | provenance | | -| array_flow.rb:399:10:399:10 | b [element 2] | array_flow.rb:399:10:399:13 | ...[...] | provenance | | -| array_flow.rb:403:5:403:5 | a [element 2] | array_flow.rb:404:18:404:18 | a [element 2] | provenance | | -| array_flow.rb:403:9:403:26 | call to [] [element 2] | array_flow.rb:403:5:403:5 | a [element 2] | provenance | | -| array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:9:403:26 | call to [] [element 2] | provenance | | -| array_flow.rb:404:5:404:5 | b [element 2] | array_flow.rb:408:10:408:10 | b [element 2] | provenance | | -| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:5:404:5 | b [element 2] | provenance | | -| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:405:14:405:14 | x | provenance | | -| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:407:10:407:10 | x | provenance | | -| array_flow.rb:408:10:408:10 | b [element 2] | array_flow.rb:408:10:408:13 | ...[...] | provenance | | -| array_flow.rb:412:5:412:5 | a [element 2] | array_flow.rb:413:5:413:5 | a [element 2] | provenance | | -| array_flow.rb:412:9:412:26 | call to [] [element 2] | array_flow.rb:412:5:412:5 | a [element 2] | provenance | | -| array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:9:412:26 | call to [] [element 2] | provenance | | -| array_flow.rb:413:5:413:5 | a [element 2] | array_flow.rb:413:24:413:24 | x [element] | provenance | | -| array_flow.rb:413:24:413:24 | x [element] | array_flow.rb:414:15:414:15 | x [element] | provenance | | -| array_flow.rb:414:15:414:15 | x [element] | array_flow.rb:414:15:414:18 | ...[...] | provenance | | +| array_flow.rb:399:10:399:10 | b : Array [element 2] | array_flow.rb:399:10:399:13 | ...[...] | provenance | | +| array_flow.rb:403:5:403:5 | a : Array [element 2] | array_flow.rb:404:18:404:18 | a : Array [element 2] | provenance | | +| array_flow.rb:403:9:403:26 | call to [] : Array [element 2] | array_flow.rb:403:5:403:5 | a : Array [element 2] | provenance | | +| array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:9:403:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:404:5:404:5 | b : Array [element 2] | array_flow.rb:408:10:408:10 | b : Array [element 2] | provenance | | +| array_flow.rb:404:18:404:18 | a : Array [element 2] | array_flow.rb:404:5:404:5 | b : Array [element 2] | provenance | | +| array_flow.rb:404:18:404:18 | a : Array [element 2] | array_flow.rb:405:14:405:14 | x | provenance | | +| array_flow.rb:404:18:404:18 | a : Array [element 2] | array_flow.rb:407:10:407:10 | x | provenance | | +| array_flow.rb:408:10:408:10 | b : Array [element 2] | array_flow.rb:408:10:408:13 | ...[...] | provenance | | +| array_flow.rb:412:5:412:5 | a : Array [element 2] | array_flow.rb:413:5:413:5 | a : Array [element 2] | provenance | | +| array_flow.rb:412:9:412:26 | call to [] : Array [element 2] | array_flow.rb:412:5:412:5 | a : Array [element 2] | provenance | | +| array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:9:412:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:413:5:413:5 | a : Array [element 2] | array_flow.rb:413:24:413:24 | x : [collection] [element] | provenance | | +| array_flow.rb:413:24:413:24 | x : [collection] [element] | array_flow.rb:414:15:414:15 | x : [collection] [element] | provenance | | +| array_flow.rb:414:15:414:15 | x : [collection] [element] | array_flow.rb:414:15:414:18 | ...[...] | provenance | | | array_flow.rb:414:15:414:18 | ...[...] | array_flow.rb:414:14:414:19 | ( ... ) | provenance | | -| array_flow.rb:419:5:419:5 | a [element 2] | array_flow.rb:420:9:420:9 | a [element 2] | provenance | | -| array_flow.rb:419:9:419:26 | call to [] [element 2] | array_flow.rb:419:5:419:5 | a [element 2] | provenance | | -| array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:9:419:26 | call to [] [element 2] | provenance | | -| array_flow.rb:420:5:420:5 | b [element 2] | array_flow.rb:423:10:423:10 | b [element 2] | provenance | | -| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | provenance | | -| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:26:420:26 | x | provenance | | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | array_flow.rb:420:5:420:5 | b [element 2] | provenance | | +| array_flow.rb:419:5:419:5 | a : Array [element 2] | array_flow.rb:420:9:420:9 | a : Array [element 2] | provenance | | +| array_flow.rb:419:9:419:26 | call to [] : Array [element 2] | array_flow.rb:419:5:419:5 | a : Array [element 2] | provenance | | +| array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:9:419:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:420:5:420:5 | b : Array [element 2] | array_flow.rb:423:10:423:10 | b : Array [element 2] | provenance | | +| array_flow.rb:420:9:420:9 | a : Array [element 2] | array_flow.rb:420:9:422:7 | call to each_entry : Array [element 2] | provenance | | +| array_flow.rb:420:9:420:9 | a : Array [element 2] | array_flow.rb:420:26:420:26 | x | provenance | | +| array_flow.rb:420:9:422:7 | call to each_entry : Array [element 2] | array_flow.rb:420:5:420:5 | b : Array [element 2] | provenance | | | array_flow.rb:420:26:420:26 | x | array_flow.rb:421:14:421:14 | x | provenance | | -| array_flow.rb:423:10:423:10 | b [element 2] | array_flow.rb:423:10:423:13 | ...[...] | provenance | | -| array_flow.rb:427:5:427:5 | a [element 2] | array_flow.rb:428:9:428:9 | a [element 2] | provenance | | -| array_flow.rb:427:9:427:26 | call to [] [element 2] | array_flow.rb:427:5:427:5 | a [element 2] | provenance | | -| array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:9:427:26 | call to [] [element 2] | provenance | | -| array_flow.rb:428:5:428:5 | b [element 2] | array_flow.rb:431:10:431:10 | b [element 2] | provenance | | -| array_flow.rb:428:9:428:9 | a [element 2] | array_flow.rb:428:9:430:7 | call to each_index [element 2] | provenance | | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] | array_flow.rb:428:5:428:5 | b [element 2] | provenance | | -| array_flow.rb:431:10:431:10 | b [element 2] | array_flow.rb:431:10:431:13 | ...[...] | provenance | | -| array_flow.rb:435:5:435:5 | a [element 3] | array_flow.rb:436:5:436:5 | a [element 3] | provenance | | -| array_flow.rb:435:9:435:29 | call to [] [element 3] | array_flow.rb:435:5:435:5 | a [element 3] | provenance | | -| array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:9:435:29 | call to [] [element 3] | provenance | | -| array_flow.rb:436:5:436:5 | a [element 3] | array_flow.rb:436:25:436:25 | x [element] | provenance | | -| array_flow.rb:436:25:436:25 | x [element] | array_flow.rb:437:14:437:14 | x [element] | provenance | | -| array_flow.rb:437:14:437:14 | x [element] | array_flow.rb:437:14:437:17 | ...[...] | provenance | | -| array_flow.rb:442:5:442:5 | a [element 3] | array_flow.rb:443:9:443:9 | a [element 3] | provenance | | -| array_flow.rb:442:9:442:29 | call to [] [element 3] | array_flow.rb:442:5:442:5 | a [element 3] | provenance | | -| array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:9:442:29 | call to [] [element 3] | provenance | | -| array_flow.rb:443:5:443:5 | b [element 3] | array_flow.rb:447:10:447:10 | b [element 3] | provenance | | -| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | provenance | | -| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:31:443:31 | x | provenance | | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | array_flow.rb:443:5:443:5 | b [element 3] | provenance | | +| array_flow.rb:423:10:423:10 | b : Array [element 2] | array_flow.rb:423:10:423:13 | ...[...] | provenance | | +| array_flow.rb:427:5:427:5 | a : Array [element 2] | array_flow.rb:428:9:428:9 | a : Array [element 2] | provenance | | +| array_flow.rb:427:9:427:26 | call to [] : Array [element 2] | array_flow.rb:427:5:427:5 | a : Array [element 2] | provenance | | +| array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:9:427:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:428:5:428:5 | b : Array [element 2] | array_flow.rb:431:10:431:10 | b : Array [element 2] | provenance | | +| array_flow.rb:428:9:428:9 | a : Array [element 2] | array_flow.rb:428:9:430:7 | call to each_index : Array [element 2] | provenance | | +| array_flow.rb:428:9:430:7 | call to each_index : Array [element 2] | array_flow.rb:428:5:428:5 | b : Array [element 2] | provenance | | +| array_flow.rb:431:10:431:10 | b : Array [element 2] | array_flow.rb:431:10:431:13 | ...[...] | provenance | | +| array_flow.rb:435:5:435:5 | a : Array [element 3] | array_flow.rb:436:5:436:5 | a : Array [element 3] | provenance | | +| array_flow.rb:435:9:435:29 | call to [] : Array [element 3] | array_flow.rb:435:5:435:5 | a : Array [element 3] | provenance | | +| array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:9:435:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:436:5:436:5 | a : Array [element 3] | array_flow.rb:436:25:436:25 | x : [collection] [element] | provenance | | +| array_flow.rb:436:25:436:25 | x : [collection] [element] | array_flow.rb:437:14:437:14 | x : [collection] [element] | provenance | | +| array_flow.rb:437:14:437:14 | x : [collection] [element] | array_flow.rb:437:14:437:17 | ...[...] | provenance | | +| array_flow.rb:442:5:442:5 | a : Array [element 3] | array_flow.rb:443:9:443:9 | a : Array [element 3] | provenance | | +| array_flow.rb:442:9:442:29 | call to [] : Array [element 3] | array_flow.rb:442:5:442:5 | a : Array [element 3] | provenance | | +| array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:9:442:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:443:5:443:5 | b : Array [element 3] | array_flow.rb:447:10:447:10 | b : Array [element 3] | provenance | | +| array_flow.rb:443:9:443:9 | a : Array [element 3] | array_flow.rb:443:9:446:7 | call to each_with_index : Array [element 3] | provenance | | +| array_flow.rb:443:9:443:9 | a : Array [element 3] | array_flow.rb:443:31:443:31 | x | provenance | | +| array_flow.rb:443:9:446:7 | call to each_with_index : Array [element 3] | array_flow.rb:443:5:443:5 | b : Array [element 3] | provenance | | | array_flow.rb:443:31:443:31 | x | array_flow.rb:444:14:444:14 | x | provenance | | -| array_flow.rb:447:10:447:10 | b [element 3] | array_flow.rb:447:10:447:13 | ...[...] | provenance | | -| array_flow.rb:451:5:451:5 | a [element 3] | array_flow.rb:452:9:452:9 | a [element 3] | provenance | | -| array_flow.rb:451:9:451:31 | call to [] [element 3] | array_flow.rb:451:5:451:5 | a [element 3] | provenance | | -| array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:9:451:31 | call to [] [element 3] | provenance | | +| array_flow.rb:447:10:447:10 | b : Array [element 3] | array_flow.rb:447:10:447:13 | ...[...] | provenance | | +| array_flow.rb:451:5:451:5 | a : Array [element 3] | array_flow.rb:452:9:452:9 | a : Array [element 3] | provenance | | +| array_flow.rb:451:9:451:31 | call to [] : Array [element 3] | array_flow.rb:451:5:451:5 | a : Array [element 3] | provenance | | +| array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:9:451:31 | call to [] : Array [element 3] | provenance | | | array_flow.rb:452:5:452:5 | b | array_flow.rb:456:10:456:10 | b | provenance | | -| array_flow.rb:452:9:452:9 | a [element 3] | array_flow.rb:452:46:452:46 | x | provenance | | +| array_flow.rb:452:9:452:9 | a : Array [element 3] | array_flow.rb:452:46:452:46 | x | provenance | | | array_flow.rb:452:9:455:7 | call to each_with_object | array_flow.rb:452:5:452:5 | b | provenance | | | array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:9:455:7 | call to each_with_object | provenance | | | array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:48:452:48 | a | provenance | | | array_flow.rb:452:46:452:46 | x | array_flow.rb:453:14:453:14 | x | provenance | | | array_flow.rb:452:48:452:48 | a | array_flow.rb:454:14:454:14 | a | provenance | | -| array_flow.rb:460:5:460:5 | a [element 3] | array_flow.rb:461:9:461:9 | a [element 3] | provenance | | -| array_flow.rb:460:9:460:29 | call to [] [element 3] | array_flow.rb:460:5:460:5 | a [element 3] | provenance | | -| array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:9:460:29 | call to [] [element 3] | provenance | | -| array_flow.rb:461:5:461:5 | b [element 3] | array_flow.rb:462:10:462:10 | b [element 3] | provenance | | -| array_flow.rb:461:9:461:9 | a [element 3] | array_flow.rb:461:9:461:17 | call to entries [element 3] | provenance | | -| array_flow.rb:461:9:461:17 | call to entries [element 3] | array_flow.rb:461:5:461:5 | b [element 3] | provenance | | -| array_flow.rb:462:10:462:10 | b [element 3] | array_flow.rb:462:10:462:13 | ...[...] | provenance | | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:467:9:467:9 | a [element 3] | provenance | | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:471:9:471:9 | a [element 3] | provenance | | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:473:9:473:9 | a [element 3] | provenance | | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:477:9:477:9 | a [element 3] | provenance | | -| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:467:9:467:9 | a [element 4] | provenance | | -| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:477:9:477:9 | a [element 4] | provenance | | -| array_flow.rb:466:9:466:45 | call to [] [element 3] | array_flow.rb:466:5:466:5 | a [element 3] | provenance | | -| array_flow.rb:466:9:466:45 | call to [] [element 4] | array_flow.rb:466:5:466:5 | a [element 4] | provenance | | -| array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:9:466:45 | call to [] [element 3] | provenance | | -| array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:9:466:45 | call to [] [element 4] | provenance | | +| array_flow.rb:460:5:460:5 | a : Array [element 3] | array_flow.rb:461:9:461:9 | a : Array [element 3] | provenance | | +| array_flow.rb:460:9:460:29 | call to [] : Array [element 3] | array_flow.rb:460:5:460:5 | a : Array [element 3] | provenance | | +| array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:9:460:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:461:5:461:5 | b : Array [element 3] | array_flow.rb:462:10:462:10 | b : Array [element 3] | provenance | | +| array_flow.rb:461:9:461:9 | a : Array [element 3] | array_flow.rb:461:9:461:17 | call to entries : Array [element 3] | provenance | | +| array_flow.rb:461:9:461:17 | call to entries : Array [element 3] | array_flow.rb:461:5:461:5 | b : Array [element 3] | provenance | | +| array_flow.rb:462:10:462:10 | b : Array [element 3] | array_flow.rb:462:10:462:13 | ...[...] | provenance | | +| array_flow.rb:466:5:466:5 | a : Array [element 3] | array_flow.rb:467:9:467:9 | a : Array [element 3] | provenance | | +| array_flow.rb:466:5:466:5 | a : Array [element 3] | array_flow.rb:471:9:471:9 | a : Array [element 3] | provenance | | +| array_flow.rb:466:5:466:5 | a : Array [element 3] | array_flow.rb:473:9:473:9 | a : Array [element 3] | provenance | | +| array_flow.rb:466:5:466:5 | a : Array [element 3] | array_flow.rb:477:9:477:9 | a : Array [element 3] | provenance | | +| array_flow.rb:466:5:466:5 | a : Array [element 4] | array_flow.rb:467:9:467:9 | a : Array [element 4] | provenance | | +| array_flow.rb:466:5:466:5 | a : Array [element 4] | array_flow.rb:477:9:477:9 | a : Array [element 4] | provenance | | +| array_flow.rb:466:9:466:45 | call to [] : Array [element 3] | array_flow.rb:466:5:466:5 | a : Array [element 3] | provenance | | +| array_flow.rb:466:9:466:45 | call to [] : Array [element 4] | array_flow.rb:466:5:466:5 | a : Array [element 4] | provenance | | +| array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:9:466:45 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:9:466:45 | call to [] : Array [element 4] | provenance | | | array_flow.rb:467:5:467:5 | b | array_flow.rb:470:10:470:10 | b | provenance | | -| array_flow.rb:467:9:467:9 | a [element 3] | array_flow.rb:467:9:469:7 | call to fetch | provenance | | -| array_flow.rb:467:9:467:9 | a [element 4] | array_flow.rb:467:9:469:7 | call to fetch | provenance | | +| array_flow.rb:467:9:467:9 | a : Array [element 3] | array_flow.rb:467:9:469:7 | call to fetch | provenance | | +| array_flow.rb:467:9:467:9 | a : Array [element 4] | array_flow.rb:467:9:469:7 | call to fetch | provenance | | | array_flow.rb:467:9:469:7 | call to fetch | array_flow.rb:467:5:467:5 | b | provenance | | | array_flow.rb:467:17:467:28 | call to source | array_flow.rb:467:35:467:35 | x | provenance | | | array_flow.rb:467:35:467:35 | x | array_flow.rb:468:14:468:14 | x | provenance | | | array_flow.rb:471:5:471:5 | b | array_flow.rb:472:10:472:10 | b | provenance | | -| array_flow.rb:471:9:471:9 | a [element 3] | array_flow.rb:471:9:471:18 | call to fetch | provenance | | +| array_flow.rb:471:9:471:9 | a : Array [element 3] | array_flow.rb:471:9:471:18 | call to fetch | provenance | | | array_flow.rb:471:9:471:18 | call to fetch | array_flow.rb:471:5:471:5 | b | provenance | | | array_flow.rb:473:5:473:5 | b | array_flow.rb:474:10:474:10 | b | provenance | | -| array_flow.rb:473:9:473:9 | a [element 3] | array_flow.rb:473:9:473:32 | call to fetch | provenance | | +| array_flow.rb:473:9:473:9 | a : Array [element 3] | array_flow.rb:473:9:473:32 | call to fetch | provenance | | | array_flow.rb:473:9:473:32 | call to fetch | array_flow.rb:473:5:473:5 | b | provenance | | | array_flow.rb:473:20:473:31 | call to source | array_flow.rb:473:9:473:32 | call to fetch | provenance | | | array_flow.rb:475:5:475:5 | b | array_flow.rb:476:10:476:10 | b | provenance | | | array_flow.rb:475:9:475:34 | call to fetch | array_flow.rb:475:5:475:5 | b | provenance | | | array_flow.rb:475:22:475:33 | call to source | array_flow.rb:475:9:475:34 | call to fetch | provenance | | | array_flow.rb:477:5:477:5 | b | array_flow.rb:478:10:478:10 | b | provenance | | -| array_flow.rb:477:9:477:9 | a [element 3] | array_flow.rb:477:9:477:32 | call to fetch | provenance | | -| array_flow.rb:477:9:477:9 | a [element 4] | array_flow.rb:477:9:477:32 | call to fetch | provenance | | +| array_flow.rb:477:9:477:9 | a : Array [element 3] | array_flow.rb:477:9:477:32 | call to fetch | provenance | | +| array_flow.rb:477:9:477:9 | a : Array [element 4] | array_flow.rb:477:9:477:32 | call to fetch | provenance | | | array_flow.rb:477:9:477:32 | call to fetch | array_flow.rb:477:5:477:5 | b | provenance | | | array_flow.rb:477:20:477:31 | call to source | array_flow.rb:477:9:477:32 | call to fetch | provenance | | -| array_flow.rb:482:5:482:5 | a [element 3] | array_flow.rb:484:10:484:10 | a [element 3] | provenance | | -| array_flow.rb:482:9:482:31 | call to [] [element 3] | array_flow.rb:482:5:482:5 | a [element 3] | provenance | | -| array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:9:482:31 | call to [] [element 3] | provenance | | -| array_flow.rb:483:5:483:5 | [post] a [element] | array_flow.rb:484:10:484:10 | a [element] | provenance | | -| array_flow.rb:483:12:483:23 | call to source | array_flow.rb:483:5:483:5 | [post] a [element] | provenance | | -| array_flow.rb:484:10:484:10 | a [element 3] | array_flow.rb:484:10:484:13 | ...[...] | provenance | | -| array_flow.rb:484:10:484:10 | a [element] | array_flow.rb:484:10:484:13 | ...[...] | provenance | | -| array_flow.rb:485:5:485:5 | [post] a [element] | array_flow.rb:486:10:486:10 | a [element] | provenance | | -| array_flow.rb:485:12:485:23 | call to source | array_flow.rb:485:5:485:5 | [post] a [element] | provenance | | -| array_flow.rb:486:10:486:10 | a [element] | array_flow.rb:486:10:486:13 | ...[...] | provenance | | -| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:490:10:490:10 | a [element] | provenance | | -| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | provenance | | -| array_flow.rb:488:9:488:20 | call to source | array_flow.rb:487:5:487:5 | [post] a [element] | provenance | | -| array_flow.rb:490:10:490:10 | a [element] | array_flow.rb:490:10:490:13 | ...[...] | provenance | | -| array_flow.rb:491:5:491:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | provenance | | -| array_flow.rb:492:9:492:20 | call to source | array_flow.rb:491:5:491:5 | [post] a [element] | provenance | | -| array_flow.rb:494:10:494:10 | a [element] | array_flow.rb:494:10:494:13 | ...[...] | provenance | | -| array_flow.rb:498:5:498:5 | a [element 3] | array_flow.rb:499:9:499:9 | a [element 3] | provenance | | -| array_flow.rb:498:9:498:29 | call to [] [element 3] | array_flow.rb:498:5:498:5 | a [element 3] | provenance | | -| array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:9:498:29 | call to [] [element 3] | provenance | | -| array_flow.rb:499:5:499:5 | b [element] | array_flow.rb:502:10:502:10 | b [element] | provenance | | -| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:9:501:7 | call to filter [element] | provenance | | -| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:22:499:22 | x | provenance | | -| array_flow.rb:499:9:501:7 | call to filter [element] | array_flow.rb:499:5:499:5 | b [element] | provenance | | +| array_flow.rb:482:5:482:5 | a : Array [element 3] | array_flow.rb:484:10:484:10 | a : Array [element 3] | provenance | | +| array_flow.rb:482:9:482:31 | call to [] : Array [element 3] | array_flow.rb:482:5:482:5 | a : Array [element 3] | provenance | | +| array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:9:482:31 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:483:5:483:5 | [post] a : [collection] [element] | array_flow.rb:484:10:484:10 | a : [collection] [element] | provenance | | +| array_flow.rb:483:12:483:23 | call to source | array_flow.rb:483:5:483:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:484:10:484:10 | a : Array [element 3] | array_flow.rb:484:10:484:13 | ...[...] | provenance | | +| array_flow.rb:484:10:484:10 | a : [collection] [element] | array_flow.rb:484:10:484:13 | ...[...] | provenance | | +| array_flow.rb:485:5:485:5 | [post] a : [collection] [element] | array_flow.rb:486:10:486:10 | a : [collection] [element] | provenance | | +| array_flow.rb:485:12:485:23 | call to source | array_flow.rb:485:5:485:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:486:10:486:10 | a : [collection] [element] | array_flow.rb:486:10:486:13 | ...[...] | provenance | | +| array_flow.rb:487:5:487:5 | [post] a : [collection] [element] | array_flow.rb:490:10:490:10 | a : [collection] [element] | provenance | | +| array_flow.rb:487:5:487:5 | [post] a : [collection] [element] | array_flow.rb:494:10:494:10 | a : [collection] [element] | provenance | | +| array_flow.rb:488:9:488:20 | call to source | array_flow.rb:487:5:487:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:490:10:490:10 | a : [collection] [element] | array_flow.rb:490:10:490:13 | ...[...] | provenance | | +| array_flow.rb:491:5:491:5 | [post] a : [collection] [element] | array_flow.rb:494:10:494:10 | a : [collection] [element] | provenance | | +| array_flow.rb:492:9:492:20 | call to source | array_flow.rb:491:5:491:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:494:10:494:10 | a : [collection] [element] | array_flow.rb:494:10:494:13 | ...[...] | provenance | | +| array_flow.rb:498:5:498:5 | a : Array [element 3] | array_flow.rb:499:9:499:9 | a : Array [element 3] | provenance | | +| array_flow.rb:498:9:498:29 | call to [] : Array [element 3] | array_flow.rb:498:5:498:5 | a : Array [element 3] | provenance | | +| array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:9:498:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:499:5:499:5 | b : [collection] [element] | array_flow.rb:502:10:502:10 | b : [collection] [element] | provenance | | +| array_flow.rb:499:9:499:9 | a : Array [element 3] | array_flow.rb:499:9:501:7 | call to filter : [collection] [element] | provenance | | +| array_flow.rb:499:9:499:9 | a : Array [element 3] | array_flow.rb:499:22:499:22 | x | provenance | | +| array_flow.rb:499:9:501:7 | call to filter : [collection] [element] | array_flow.rb:499:5:499:5 | b : [collection] [element] | provenance | | | array_flow.rb:499:22:499:22 | x | array_flow.rb:500:14:500:14 | x | provenance | | -| array_flow.rb:502:10:502:10 | b [element] | array_flow.rb:502:10:502:13 | ...[...] | provenance | | -| array_flow.rb:506:5:506:5 | a [element 3] | array_flow.rb:507:9:507:9 | a [element 3] | provenance | | -| array_flow.rb:506:9:506:29 | call to [] [element 3] | array_flow.rb:506:5:506:5 | a [element 3] | provenance | | -| array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:9:506:29 | call to [] [element 3] | provenance | | -| array_flow.rb:507:5:507:5 | b [element] | array_flow.rb:511:10:511:10 | b [element] | provenance | | -| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:9:510:7 | call to filter_map [element] | provenance | | -| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:26:507:26 | x | provenance | | -| array_flow.rb:507:9:510:7 | call to filter_map [element] | array_flow.rb:507:5:507:5 | b [element] | provenance | | +| array_flow.rb:502:10:502:10 | b : [collection] [element] | array_flow.rb:502:10:502:13 | ...[...] | provenance | | +| array_flow.rb:506:5:506:5 | a : Array [element 3] | array_flow.rb:507:9:507:9 | a : Array [element 3] | provenance | | +| array_flow.rb:506:9:506:29 | call to [] : Array [element 3] | array_flow.rb:506:5:506:5 | a : Array [element 3] | provenance | | +| array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:9:506:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:507:5:507:5 | b : [collection] [element] | array_flow.rb:511:10:511:10 | b : [collection] [element] | provenance | | +| array_flow.rb:507:9:507:9 | a : Array [element 3] | array_flow.rb:507:9:510:7 | call to filter_map : [collection] [element] | provenance | | +| array_flow.rb:507:9:507:9 | a : Array [element 3] | array_flow.rb:507:26:507:26 | x | provenance | | +| array_flow.rb:507:9:510:7 | call to filter_map : [collection] [element] | array_flow.rb:507:5:507:5 | b : [collection] [element] | provenance | | | array_flow.rb:507:26:507:26 | x | array_flow.rb:508:14:508:14 | x | provenance | | | array_flow.rb:507:26:507:26 | x | array_flow.rb:509:9:509:9 | x | provenance | | -| array_flow.rb:511:10:511:10 | b [element] | array_flow.rb:511:10:511:13 | ...[...] | provenance | | -| array_flow.rb:518:5:518:5 | d [element] | array_flow.rb:521:10:521:10 | d [element] | provenance | | -| array_flow.rb:518:9:520:7 | call to filter_map [element] | array_flow.rb:518:5:518:5 | d [element] | provenance | | -| array_flow.rb:519:9:519:20 | call to source | array_flow.rb:518:9:520:7 | call to filter_map [element] | provenance | | -| array_flow.rb:521:10:521:10 | d [element] | array_flow.rb:521:10:521:13 | ...[...] | provenance | | -| array_flow.rb:525:5:525:5 | a [element 3] | array_flow.rb:526:9:526:9 | a [element 3] | provenance | | -| array_flow.rb:525:9:525:29 | call to [] [element 3] | array_flow.rb:525:5:525:5 | a [element 3] | provenance | | -| array_flow.rb:525:19:525:28 | call to source | array_flow.rb:525:9:525:29 | call to [] [element 3] | provenance | | -| array_flow.rb:526:5:526:5 | b [element] | array_flow.rb:531:10:531:10 | b [element] | provenance | | -| array_flow.rb:526:9:526:9 | [post] a [element] | array_flow.rb:530:10:530:10 | a [element] | provenance | | -| array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:9:526:9 | [post] a [element] | provenance | | -| array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:9:529:7 | call to filter! [element] | provenance | | -| array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:23:526:23 | x | provenance | | -| array_flow.rb:526:9:529:7 | call to filter! [element] | array_flow.rb:526:5:526:5 | b [element] | provenance | | +| array_flow.rb:511:10:511:10 | b : [collection] [element] | array_flow.rb:511:10:511:13 | ...[...] | provenance | | +| array_flow.rb:518:5:518:5 | d : [collection] [element] | array_flow.rb:521:10:521:10 | d : [collection] [element] | provenance | | +| array_flow.rb:518:9:520:7 | call to filter_map : [collection] [element] | array_flow.rb:518:5:518:5 | d : [collection] [element] | provenance | | +| array_flow.rb:519:9:519:20 | call to source | array_flow.rb:518:9:520:7 | call to filter_map : [collection] [element] | provenance | | +| array_flow.rb:521:10:521:10 | d : [collection] [element] | array_flow.rb:521:10:521:13 | ...[...] | provenance | | +| array_flow.rb:525:5:525:5 | a : Array [element 3] | array_flow.rb:526:9:526:9 | a : Array [element 3] | provenance | | +| array_flow.rb:525:9:525:29 | call to [] : Array [element 3] | array_flow.rb:525:5:525:5 | a : Array [element 3] | provenance | | +| array_flow.rb:525:19:525:28 | call to source | array_flow.rb:525:9:525:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:526:5:526:5 | b : [collection] [element] | array_flow.rb:531:10:531:10 | b : [collection] [element] | provenance | | +| array_flow.rb:526:9:526:9 | [post] a : [collection] [element] | array_flow.rb:530:10:530:10 | a : [collection] [element] | provenance | | +| array_flow.rb:526:9:526:9 | a : Array [element 3] | array_flow.rb:526:9:526:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:526:9:526:9 | a : Array [element 3] | array_flow.rb:526:9:529:7 | call to filter! : [collection] [element] | provenance | | +| array_flow.rb:526:9:526:9 | a : Array [element 3] | array_flow.rb:526:23:526:23 | x | provenance | | +| array_flow.rb:526:9:529:7 | call to filter! : [collection] [element] | array_flow.rb:526:5:526:5 | b : [collection] [element] | provenance | | | array_flow.rb:526:23:526:23 | x | array_flow.rb:527:14:527:14 | x | provenance | | -| array_flow.rb:530:10:530:10 | a [element] | array_flow.rb:530:10:530:13 | ...[...] | provenance | | -| array_flow.rb:531:10:531:10 | b [element] | array_flow.rb:531:10:531:13 | ...[...] | provenance | | -| array_flow.rb:535:5:535:5 | a [element 3] | array_flow.rb:536:9:536:9 | a [element 3] | provenance | | -| array_flow.rb:535:9:535:31 | call to [] [element 3] | array_flow.rb:535:5:535:5 | a [element 3] | provenance | | -| array_flow.rb:535:19:535:30 | call to source | array_flow.rb:535:9:535:31 | call to [] [element 3] | provenance | | +| array_flow.rb:530:10:530:10 | a : [collection] [element] | array_flow.rb:530:10:530:13 | ...[...] | provenance | | +| array_flow.rb:531:10:531:10 | b : [collection] [element] | array_flow.rb:531:10:531:13 | ...[...] | provenance | | +| array_flow.rb:535:5:535:5 | a : Array [element 3] | array_flow.rb:536:9:536:9 | a : Array [element 3] | provenance | | +| array_flow.rb:535:9:535:31 | call to [] : Array [element 3] | array_flow.rb:535:5:535:5 | a : Array [element 3] | provenance | | +| array_flow.rb:535:19:535:30 | call to source | array_flow.rb:535:9:535:31 | call to [] : Array [element 3] | provenance | | | array_flow.rb:536:5:536:5 | b | array_flow.rb:539:10:539:10 | b | provenance | | -| array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:9:538:7 | call to find | provenance | | -| array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:41:536:41 | x | provenance | | +| array_flow.rb:536:9:536:9 | a : Array [element 3] | array_flow.rb:536:9:538:7 | call to find | provenance | | +| array_flow.rb:536:9:536:9 | a : Array [element 3] | array_flow.rb:536:41:536:41 | x | provenance | | | array_flow.rb:536:9:538:7 | call to find | array_flow.rb:536:5:536:5 | b | provenance | | | array_flow.rb:536:21:536:32 | call to source | array_flow.rb:536:9:538:7 | call to find | provenance | | | array_flow.rb:536:41:536:41 | x | array_flow.rb:537:14:537:14 | x | provenance | | -| array_flow.rb:543:5:543:5 | a [element 3] | array_flow.rb:544:9:544:9 | a [element 3] | provenance | | -| array_flow.rb:543:9:543:29 | call to [] [element 3] | array_flow.rb:543:5:543:5 | a [element 3] | provenance | | -| array_flow.rb:543:19:543:28 | call to source | array_flow.rb:543:9:543:29 | call to [] [element 3] | provenance | | -| array_flow.rb:544:5:544:5 | b [element] | array_flow.rb:547:10:547:10 | b [element] | provenance | | -| array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:9:546:7 | call to find_all [element] | provenance | | -| array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:24:544:24 | x | provenance | | -| array_flow.rb:544:9:546:7 | call to find_all [element] | array_flow.rb:544:5:544:5 | b [element] | provenance | | +| array_flow.rb:543:5:543:5 | a : Array [element 3] | array_flow.rb:544:9:544:9 | a : Array [element 3] | provenance | | +| array_flow.rb:543:9:543:29 | call to [] : Array [element 3] | array_flow.rb:543:5:543:5 | a : Array [element 3] | provenance | | +| array_flow.rb:543:19:543:28 | call to source | array_flow.rb:543:9:543:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:544:5:544:5 | b : [collection] [element] | array_flow.rb:547:10:547:10 | b : [collection] [element] | provenance | | +| array_flow.rb:544:9:544:9 | a : Array [element 3] | array_flow.rb:544:9:546:7 | call to find_all : [collection] [element] | provenance | | +| array_flow.rb:544:9:544:9 | a : Array [element 3] | array_flow.rb:544:24:544:24 | x | provenance | | +| array_flow.rb:544:9:546:7 | call to find_all : [collection] [element] | array_flow.rb:544:5:544:5 | b : [collection] [element] | provenance | | | array_flow.rb:544:24:544:24 | x | array_flow.rb:545:14:545:14 | x | provenance | | -| array_flow.rb:547:10:547:10 | b [element] | array_flow.rb:547:10:547:13 | ...[...] | provenance | | -| array_flow.rb:551:5:551:5 | a [element 3] | array_flow.rb:552:5:552:5 | a [element 3] | provenance | | -| array_flow.rb:551:9:551:29 | call to [] [element 3] | array_flow.rb:551:5:551:5 | a [element 3] | provenance | | -| array_flow.rb:551:19:551:28 | call to source | array_flow.rb:551:9:551:29 | call to [] [element 3] | provenance | | -| array_flow.rb:552:5:552:5 | a [element 3] | array_flow.rb:552:22:552:22 | x | provenance | | +| array_flow.rb:547:10:547:10 | b : [collection] [element] | array_flow.rb:547:10:547:13 | ...[...] | provenance | | +| array_flow.rb:551:5:551:5 | a : Array [element 3] | array_flow.rb:552:5:552:5 | a : Array [element 3] | provenance | | +| array_flow.rb:551:9:551:29 | call to [] : Array [element 3] | array_flow.rb:551:5:551:5 | a : Array [element 3] | provenance | | +| array_flow.rb:551:19:551:28 | call to source | array_flow.rb:551:9:551:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:552:5:552:5 | a : Array [element 3] | array_flow.rb:552:22:552:22 | x | provenance | | | array_flow.rb:552:22:552:22 | x | array_flow.rb:553:14:553:14 | x | provenance | | -| array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:560:10:560:10 | a [element 0] | provenance | | -| array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:561:9:561:9 | a [element 0] | provenance | | -| array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:564:9:564:9 | a [element 0] | provenance | | -| array_flow.rb:558:5:558:5 | a [element 3] | array_flow.rb:564:9:564:9 | a [element 3] | provenance | | -| array_flow.rb:558:9:558:42 | call to [] [element 0] | array_flow.rb:558:5:558:5 | a [element 0] | provenance | | -| array_flow.rb:558:9:558:42 | call to [] [element 3] | array_flow.rb:558:5:558:5 | a [element 3] | provenance | | -| array_flow.rb:558:10:558:21 | call to source | array_flow.rb:558:9:558:42 | call to [] [element 0] | provenance | | -| array_flow.rb:558:30:558:41 | call to source | array_flow.rb:558:9:558:42 | call to [] [element 3] | provenance | | -| array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:560:10:560:10 | a [element] | provenance | | -| array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:561:9:561:9 | a [element] | provenance | | -| array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:564:9:564:9 | a [element] | provenance | | -| array_flow.rb:559:12:559:23 | call to source | array_flow.rb:559:5:559:5 | [post] a [element] | provenance | | -| array_flow.rb:560:10:560:10 | a [element 0] | array_flow.rb:560:10:560:16 | call to first | provenance | | -| array_flow.rb:560:10:560:10 | a [element] | array_flow.rb:560:10:560:16 | call to first | provenance | | -| array_flow.rb:561:5:561:5 | b [element 0] | array_flow.rb:562:10:562:10 | b [element 0] | provenance | | -| array_flow.rb:561:5:561:5 | b [element] | array_flow.rb:562:10:562:10 | b [element] | provenance | | -| array_flow.rb:561:5:561:5 | b [element] | array_flow.rb:563:10:563:10 | b [element] | provenance | | -| array_flow.rb:561:9:561:9 | a [element 0] | array_flow.rb:561:9:561:18 | call to first [element 0] | provenance | | -| array_flow.rb:561:9:561:9 | a [element] | array_flow.rb:561:9:561:18 | call to first [element] | provenance | | -| array_flow.rb:561:9:561:18 | call to first [element 0] | array_flow.rb:561:5:561:5 | b [element 0] | provenance | | -| array_flow.rb:561:9:561:18 | call to first [element] | array_flow.rb:561:5:561:5 | b [element] | provenance | | -| array_flow.rb:562:10:562:10 | b [element 0] | array_flow.rb:562:10:562:13 | ...[...] | provenance | | -| array_flow.rb:562:10:562:10 | b [element] | array_flow.rb:562:10:562:13 | ...[...] | provenance | | -| array_flow.rb:563:10:563:10 | b [element] | array_flow.rb:563:10:563:13 | ...[...] | provenance | | -| array_flow.rb:564:5:564:5 | c [element 0] | array_flow.rb:565:10:565:10 | c [element 0] | provenance | | -| array_flow.rb:564:5:564:5 | c [element 3] | array_flow.rb:566:10:566:10 | c [element 3] | provenance | | -| array_flow.rb:564:5:564:5 | c [element] | array_flow.rb:565:10:565:10 | c [element] | provenance | | -| array_flow.rb:564:5:564:5 | c [element] | array_flow.rb:566:10:566:10 | c [element] | provenance | | -| array_flow.rb:564:9:564:9 | a [element 0] | array_flow.rb:564:9:564:18 | call to first [element 0] | provenance | | -| array_flow.rb:564:9:564:9 | a [element 3] | array_flow.rb:564:9:564:18 | call to first [element 3] | provenance | | -| array_flow.rb:564:9:564:9 | a [element] | array_flow.rb:564:9:564:18 | call to first [element] | provenance | | -| array_flow.rb:564:9:564:18 | call to first [element 0] | array_flow.rb:564:5:564:5 | c [element 0] | provenance | | -| array_flow.rb:564:9:564:18 | call to first [element 3] | array_flow.rb:564:5:564:5 | c [element 3] | provenance | | -| array_flow.rb:564:9:564:18 | call to first [element] | array_flow.rb:564:5:564:5 | c [element] | provenance | | -| array_flow.rb:565:10:565:10 | c [element 0] | array_flow.rb:565:10:565:13 | ...[...] | provenance | | -| array_flow.rb:565:10:565:10 | c [element] | array_flow.rb:565:10:565:13 | ...[...] | provenance | | -| array_flow.rb:566:10:566:10 | c [element 3] | array_flow.rb:566:10:566:13 | ...[...] | provenance | | -| array_flow.rb:566:10:566:10 | c [element] | array_flow.rb:566:10:566:13 | ...[...] | provenance | | -| array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:571:9:571:9 | a [element 2] | provenance | | -| array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:576:9:576:9 | a [element 2] | provenance | | -| array_flow.rb:570:9:570:28 | call to [] [element 2] | array_flow.rb:570:5:570:5 | a [element 2] | provenance | | -| array_flow.rb:570:16:570:27 | call to source | array_flow.rb:570:9:570:28 | call to [] [element 2] | provenance | | -| array_flow.rb:571:5:571:5 | b [element] | array_flow.rb:575:10:575:10 | b [element] | provenance | | -| array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:9:574:7 | call to flat_map [element] | provenance | | -| array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:24:571:24 | x | provenance | | -| array_flow.rb:571:9:574:7 | call to flat_map [element] | array_flow.rb:571:5:571:5 | b [element] | provenance | | +| array_flow.rb:558:5:558:5 | a : Array [element 0] | array_flow.rb:560:10:560:10 | a : Array [element 0] | provenance | | +| array_flow.rb:558:5:558:5 | a : Array [element 0] | array_flow.rb:561:9:561:9 | a : Array [element 0] | provenance | | +| array_flow.rb:558:5:558:5 | a : Array [element 0] | array_flow.rb:564:9:564:9 | a : Array [element 0] | provenance | | +| array_flow.rb:558:5:558:5 | a : Array [element 3] | array_flow.rb:564:9:564:9 | a : Array [element 3] | provenance | | +| array_flow.rb:558:9:558:42 | call to [] : Array [element 0] | array_flow.rb:558:5:558:5 | a : Array [element 0] | provenance | | +| array_flow.rb:558:9:558:42 | call to [] : Array [element 3] | array_flow.rb:558:5:558:5 | a : Array [element 3] | provenance | | +| array_flow.rb:558:10:558:21 | call to source | array_flow.rb:558:9:558:42 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:558:30:558:41 | call to source | array_flow.rb:558:9:558:42 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:559:5:559:5 | [post] a : [collection] [element] | array_flow.rb:560:10:560:10 | a : [collection] [element] | provenance | | +| array_flow.rb:559:5:559:5 | [post] a : [collection] [element] | array_flow.rb:561:9:561:9 | a : [collection] [element] | provenance | | +| array_flow.rb:559:5:559:5 | [post] a : [collection] [element] | array_flow.rb:564:9:564:9 | a : [collection] [element] | provenance | | +| array_flow.rb:559:12:559:23 | call to source | array_flow.rb:559:5:559:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:560:10:560:10 | a : Array [element 0] | array_flow.rb:560:10:560:16 | call to first | provenance | | +| array_flow.rb:560:10:560:10 | a : [collection] [element] | array_flow.rb:560:10:560:16 | call to first | provenance | | +| array_flow.rb:561:5:561:5 | b : Array [element 0] | array_flow.rb:562:10:562:10 | b : Array [element 0] | provenance | | +| array_flow.rb:561:5:561:5 | b : [collection] [element] | array_flow.rb:562:10:562:10 | b : [collection] [element] | provenance | | +| array_flow.rb:561:5:561:5 | b : [collection] [element] | array_flow.rb:563:10:563:10 | b : [collection] [element] | provenance | | +| array_flow.rb:561:9:561:9 | a : Array [element 0] | array_flow.rb:561:9:561:18 | call to first : Array [element 0] | provenance | | +| array_flow.rb:561:9:561:9 | a : [collection] [element] | array_flow.rb:561:9:561:18 | call to first : [collection] [element] | provenance | | +| array_flow.rb:561:9:561:18 | call to first : Array [element 0] | array_flow.rb:561:5:561:5 | b : Array [element 0] | provenance | | +| array_flow.rb:561:9:561:18 | call to first : [collection] [element] | array_flow.rb:561:5:561:5 | b : [collection] [element] | provenance | | +| array_flow.rb:562:10:562:10 | b : Array [element 0] | array_flow.rb:562:10:562:13 | ...[...] | provenance | | +| array_flow.rb:562:10:562:10 | b : [collection] [element] | array_flow.rb:562:10:562:13 | ...[...] | provenance | | +| array_flow.rb:563:10:563:10 | b : [collection] [element] | array_flow.rb:563:10:563:13 | ...[...] | provenance | | +| array_flow.rb:564:5:564:5 | c : Array [element 0] | array_flow.rb:565:10:565:10 | c : Array [element 0] | provenance | | +| array_flow.rb:564:5:564:5 | c : Array [element 3] | array_flow.rb:566:10:566:10 | c : Array [element 3] | provenance | | +| array_flow.rb:564:5:564:5 | c : [collection] [element] | array_flow.rb:565:10:565:10 | c : [collection] [element] | provenance | | +| array_flow.rb:564:5:564:5 | c : [collection] [element] | array_flow.rb:566:10:566:10 | c : [collection] [element] | provenance | | +| array_flow.rb:564:9:564:9 | a : Array [element 0] | array_flow.rb:564:9:564:18 | call to first : Array [element 0] | provenance | | +| array_flow.rb:564:9:564:9 | a : Array [element 3] | array_flow.rb:564:9:564:18 | call to first : Array [element 3] | provenance | | +| array_flow.rb:564:9:564:9 | a : [collection] [element] | array_flow.rb:564:9:564:18 | call to first : [collection] [element] | provenance | | +| array_flow.rb:564:9:564:18 | call to first : Array [element 0] | array_flow.rb:564:5:564:5 | c : Array [element 0] | provenance | | +| array_flow.rb:564:9:564:18 | call to first : Array [element 3] | array_flow.rb:564:5:564:5 | c : Array [element 3] | provenance | | +| array_flow.rb:564:9:564:18 | call to first : [collection] [element] | array_flow.rb:564:5:564:5 | c : [collection] [element] | provenance | | +| array_flow.rb:565:10:565:10 | c : Array [element 0] | array_flow.rb:565:10:565:13 | ...[...] | provenance | | +| array_flow.rb:565:10:565:10 | c : [collection] [element] | array_flow.rb:565:10:565:13 | ...[...] | provenance | | +| array_flow.rb:566:10:566:10 | c : Array [element 3] | array_flow.rb:566:10:566:13 | ...[...] | provenance | | +| array_flow.rb:566:10:566:10 | c : [collection] [element] | array_flow.rb:566:10:566:13 | ...[...] | provenance | | +| array_flow.rb:570:5:570:5 | a : Array [element 2] | array_flow.rb:571:9:571:9 | a : Array [element 2] | provenance | | +| array_flow.rb:570:5:570:5 | a : Array [element 2] | array_flow.rb:576:9:576:9 | a : Array [element 2] | provenance | | +| array_flow.rb:570:9:570:28 | call to [] : Array [element 2] | array_flow.rb:570:5:570:5 | a : Array [element 2] | provenance | | +| array_flow.rb:570:16:570:27 | call to source | array_flow.rb:570:9:570:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:571:5:571:5 | b : [collection] [element] | array_flow.rb:575:10:575:10 | b : [collection] [element] | provenance | | +| array_flow.rb:571:9:571:9 | a : Array [element 2] | array_flow.rb:571:9:574:7 | call to flat_map : [collection] [element] | provenance | | +| array_flow.rb:571:9:571:9 | a : Array [element 2] | array_flow.rb:571:24:571:24 | x | provenance | | +| array_flow.rb:571:9:574:7 | call to flat_map : [collection] [element] | array_flow.rb:571:5:571:5 | b : [collection] [element] | provenance | | | array_flow.rb:571:24:571:24 | x | array_flow.rb:572:14:572:14 | x | provenance | | | array_flow.rb:571:24:571:24 | x | array_flow.rb:573:10:573:10 | x | provenance | | -| array_flow.rb:573:9:573:25 | call to [] [element 1] | array_flow.rb:571:9:574:7 | call to flat_map [element] | provenance | | -| array_flow.rb:573:10:573:10 | x | array_flow.rb:573:9:573:25 | call to [] [element 0] | provenance | | -| array_flow.rb:573:13:573:24 | call to source | array_flow.rb:573:9:573:25 | call to [] [element 1] | provenance | | -| array_flow.rb:575:10:575:10 | b [element] | array_flow.rb:575:10:575:13 | ...[...] | provenance | | -| array_flow.rb:576:5:576:5 | b [element] | array_flow.rb:580:10:580:10 | b [element] | provenance | | -| array_flow.rb:576:9:576:9 | a [element 2] | array_flow.rb:576:24:576:24 | x | provenance | | -| array_flow.rb:576:9:579:7 | call to flat_map [element] | array_flow.rb:576:5:576:5 | b [element] | provenance | | +| array_flow.rb:573:9:573:25 | call to [] : Array [element 1] | array_flow.rb:571:9:574:7 | call to flat_map : [collection] [element] | provenance | | +| array_flow.rb:573:10:573:10 | x | array_flow.rb:573:9:573:25 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:573:13:573:24 | call to source | array_flow.rb:573:9:573:25 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:575:10:575:10 | b : [collection] [element] | array_flow.rb:575:10:575:13 | ...[...] | provenance | | +| array_flow.rb:576:5:576:5 | b : [collection] [element] : [collection] | array_flow.rb:580:10:580:10 | b : [collection] [element] : [collection] | provenance | | +| array_flow.rb:576:9:576:9 | a : Array [element 2] | array_flow.rb:576:24:576:24 | x | provenance | | +| array_flow.rb:576:9:579:7 | call to flat_map : [collection] [element] : [collection] | array_flow.rb:576:5:576:5 | b : [collection] [element] : [collection] | provenance | | | array_flow.rb:576:24:576:24 | x | array_flow.rb:577:14:577:14 | x | provenance | | -| array_flow.rb:578:9:578:20 | call to source | array_flow.rb:576:9:579:7 | call to flat_map [element] | provenance | | -| array_flow.rb:580:10:580:10 | b [element] | array_flow.rb:580:10:580:13 | ...[...] | provenance | | -| array_flow.rb:584:5:584:5 | a [element 2, element 1] | array_flow.rb:585:9:585:9 | a [element 2, element 1] | provenance | | -| array_flow.rb:584:9:584:31 | call to [] [element 2, element 1] | array_flow.rb:584:5:584:5 | a [element 2, element 1] | provenance | | -| array_flow.rb:584:16:584:30 | call to [] [element 1] | array_flow.rb:584:9:584:31 | call to [] [element 2, element 1] | provenance | | -| array_flow.rb:584:20:584:29 | call to source | array_flow.rb:584:16:584:30 | call to [] [element 1] | provenance | | -| array_flow.rb:585:5:585:5 | b [element] | array_flow.rb:586:10:586:10 | b [element] | provenance | | -| array_flow.rb:585:9:585:9 | a [element 2, element 1] | array_flow.rb:585:9:585:17 | call to flatten [element] | provenance | | -| array_flow.rb:585:9:585:17 | call to flatten [element] | array_flow.rb:585:5:585:5 | b [element] | provenance | | -| array_flow.rb:586:10:586:10 | b [element] | array_flow.rb:586:10:586:13 | ...[...] | provenance | | -| array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:591:10:591:10 | a [element 2, element 1] | provenance | | -| array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | a [element 2, element 1] | provenance | | -| array_flow.rb:590:9:590:31 | call to [] [element 2, element 1] | array_flow.rb:590:5:590:5 | a [element 2, element 1] | provenance | | -| array_flow.rb:590:16:590:30 | call to [] [element 1] | array_flow.rb:590:9:590:31 | call to [] [element 2, element 1] | provenance | | -| array_flow.rb:590:20:590:29 | call to source | array_flow.rb:590:16:590:30 | call to [] [element 1] | provenance | | -| array_flow.rb:591:10:591:10 | a [element 2, element 1] | array_flow.rb:591:10:591:13 | ...[...] [element 1] | provenance | | +| array_flow.rb:578:9:578:20 | call to source | array_flow.rb:576:9:579:7 | call to flat_map : [collection] [element] : [collection] | provenance | | +| array_flow.rb:580:10:580:10 | b : [collection] [element] : [collection] | array_flow.rb:580:10:580:13 | ...[...] | provenance | | +| array_flow.rb:584:5:584:5 | a : Array [element 2, element 1] | array_flow.rb:585:9:585:9 | a : Array [element 2, element 1] | provenance | | +| array_flow.rb:584:9:584:31 | call to [] : Array [element 2, element 1] | array_flow.rb:584:5:584:5 | a : Array [element 2, element 1] | provenance | | +| array_flow.rb:584:16:584:30 | call to [] : Array [element 1] | array_flow.rb:584:9:584:31 | call to [] : Array [element 2, element 1] | provenance | | +| array_flow.rb:584:20:584:29 | call to source | array_flow.rb:584:16:584:30 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:585:5:585:5 | b : [collection] [element] : [collection] | array_flow.rb:586:10:586:10 | b : [collection] [element] : [collection] | provenance | | +| array_flow.rb:585:9:585:9 | a : Array [element 2, element 1] | array_flow.rb:585:9:585:17 | call to flatten : [collection] [element] : [collection] | provenance | | +| array_flow.rb:585:9:585:17 | call to flatten : [collection] [element] : [collection] | array_flow.rb:585:5:585:5 | b : [collection] [element] : [collection] | provenance | | +| array_flow.rb:586:10:586:10 | b : [collection] [element] : [collection] | array_flow.rb:586:10:586:13 | ...[...] | provenance | | +| array_flow.rb:590:5:590:5 | a : Array [element 2, element 1] | array_flow.rb:591:10:591:10 | a : Array [element 2, element 1] | provenance | | +| array_flow.rb:590:5:590:5 | a : Array [element 2, element 1] | array_flow.rb:592:9:592:9 | a : Array [element 2, element 1] | provenance | | +| array_flow.rb:590:9:590:31 | call to [] : Array [element 2, element 1] | array_flow.rb:590:5:590:5 | a : Array [element 2, element 1] | provenance | | +| array_flow.rb:590:16:590:30 | call to [] : Array [element 1] | array_flow.rb:590:9:590:31 | call to [] : Array [element 2, element 1] | provenance | | +| array_flow.rb:590:20:590:29 | call to source | array_flow.rb:590:16:590:30 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:591:10:591:10 | a : Array [element 2, element 1] | array_flow.rb:591:10:591:13 | ...[...] [element 1] | provenance | | | array_flow.rb:591:10:591:13 | ...[...] [element 1] | array_flow.rb:591:10:591:16 | ...[...] | provenance | | -| array_flow.rb:592:5:592:5 | b [element, element 1] | array_flow.rb:596:10:596:10 | b [element, element 1] | provenance | | -| array_flow.rb:592:5:592:5 | b [element] | array_flow.rb:595:10:595:10 | b [element] | provenance | | -| array_flow.rb:592:9:592:9 | [post] a [element, element 1] | array_flow.rb:594:10:594:10 | a [element, element 1] | provenance | | -| array_flow.rb:592:9:592:9 | [post] a [element] | array_flow.rb:593:10:593:10 | a [element] | provenance | | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a [element, element 1] | provenance | | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a [element] | provenance | | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | provenance | | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! [element] | provenance | | -| array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | array_flow.rb:592:5:592:5 | b [element, element 1] | provenance | | -| array_flow.rb:592:9:592:18 | call to flatten! [element] | array_flow.rb:592:5:592:5 | b [element] | provenance | | -| array_flow.rb:593:10:593:10 | a [element] | array_flow.rb:593:10:593:13 | ...[...] | provenance | | -| array_flow.rb:594:10:594:10 | a [element, element 1] | array_flow.rb:594:10:594:13 | ...[...] [element 1] | provenance | | +| array_flow.rb:592:5:592:5 | b : [collection] [element, element 1] | array_flow.rb:596:10:596:10 | b : [collection] [element, element 1] | provenance | | +| array_flow.rb:592:5:592:5 | b : [collection] [element] : [collection] | array_flow.rb:595:10:595:10 | b : [collection] [element] : [collection] | provenance | | +| array_flow.rb:592:9:592:9 | [post] a : [collection] [element, element 1] | array_flow.rb:594:10:594:10 | a : [collection] [element, element 1] | provenance | | +| array_flow.rb:592:9:592:9 | [post] a : [collection] [element] : [collection] | array_flow.rb:593:10:593:10 | a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:592:9:592:9 | a : Array [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a : [collection] [element, element 1] | provenance | | +| array_flow.rb:592:9:592:9 | a : Array [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a : [collection] [element] : [collection] | provenance | | +| array_flow.rb:592:9:592:9 | a : Array [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! : [collection] [element, element 1] | provenance | | +| array_flow.rb:592:9:592:9 | a : Array [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! : [collection] [element] : [collection] | provenance | | +| array_flow.rb:592:9:592:18 | call to flatten! : [collection] [element, element 1] | array_flow.rb:592:5:592:5 | b : [collection] [element, element 1] | provenance | | +| array_flow.rb:592:9:592:18 | call to flatten! : [collection] [element] : [collection] | array_flow.rb:592:5:592:5 | b : [collection] [element] : [collection] | provenance | | +| array_flow.rb:593:10:593:10 | a : [collection] [element] : [collection] | array_flow.rb:593:10:593:13 | ...[...] | provenance | | +| array_flow.rb:594:10:594:10 | a : [collection] [element, element 1] | array_flow.rb:594:10:594:13 | ...[...] [element 1] | provenance | | | array_flow.rb:594:10:594:13 | ...[...] [element 1] | array_flow.rb:594:10:594:16 | ...[...] | provenance | | -| array_flow.rb:595:10:595:10 | b [element] | array_flow.rb:595:10:595:13 | ...[...] | provenance | | -| array_flow.rb:596:10:596:10 | b [element, element 1] | array_flow.rb:596:10:596:13 | ...[...] [element 1] | provenance | | +| array_flow.rb:595:10:595:10 | b : [collection] [element] : [collection] | array_flow.rb:595:10:595:13 | ...[...] | provenance | | +| array_flow.rb:596:10:596:10 | b : [collection] [element, element 1] | array_flow.rb:596:10:596:13 | ...[...] [element 1] | provenance | | | array_flow.rb:596:10:596:13 | ...[...] [element 1] | array_flow.rb:596:10:596:16 | ...[...] | provenance | | -| array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:601:9:601:9 | a [element 3] | provenance | | -| array_flow.rb:600:5:600:5 | a [element 3] | array_flow.rb:603:9:603:9 | a [element 3] | provenance | | -| array_flow.rb:600:9:600:31 | call to [] [element 3] | array_flow.rb:600:5:600:5 | a [element 3] | provenance | | -| array_flow.rb:600:19:600:30 | call to source | array_flow.rb:600:9:600:31 | call to [] [element 3] | provenance | | -| array_flow.rb:601:5:601:5 | b [element] | array_flow.rb:602:10:602:10 | b [element] | provenance | | -| array_flow.rb:601:9:601:9 | a [element 3] | array_flow.rb:601:9:601:20 | call to grep [element] | provenance | | -| array_flow.rb:601:9:601:20 | call to grep [element] | array_flow.rb:601:5:601:5 | b [element] | provenance | | -| array_flow.rb:602:10:602:10 | b [element] | array_flow.rb:602:10:602:13 | ...[...] | provenance | | -| array_flow.rb:603:5:603:5 | b [element] | array_flow.rb:607:10:607:10 | b [element] | provenance | | -| array_flow.rb:603:9:603:9 | a [element 3] | array_flow.rb:603:26:603:26 | x | provenance | | -| array_flow.rb:603:9:606:7 | call to grep [element] | array_flow.rb:603:5:603:5 | b [element] | provenance | | +| array_flow.rb:600:5:600:5 | a : Array [element 3] | array_flow.rb:601:9:601:9 | a : Array [element 3] | provenance | | +| array_flow.rb:600:5:600:5 | a : Array [element 3] | array_flow.rb:603:9:603:9 | a : Array [element 3] | provenance | | +| array_flow.rb:600:9:600:31 | call to [] : Array [element 3] | array_flow.rb:600:5:600:5 | a : Array [element 3] | provenance | | +| array_flow.rb:600:19:600:30 | call to source | array_flow.rb:600:9:600:31 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:601:5:601:5 | b : [collection] [element] | array_flow.rb:602:10:602:10 | b : [collection] [element] | provenance | | +| array_flow.rb:601:9:601:9 | a : Array [element 3] | array_flow.rb:601:9:601:20 | call to grep : [collection] [element] | provenance | | +| array_flow.rb:601:9:601:20 | call to grep : [collection] [element] | array_flow.rb:601:5:601:5 | b : [collection] [element] | provenance | | +| array_flow.rb:602:10:602:10 | b : [collection] [element] | array_flow.rb:602:10:602:13 | ...[...] | provenance | | +| array_flow.rb:603:5:603:5 | b : [collection] [element] | array_flow.rb:607:10:607:10 | b : [collection] [element] | provenance | | +| array_flow.rb:603:9:603:9 | a : Array [element 3] | array_flow.rb:603:26:603:26 | x | provenance | | +| array_flow.rb:603:9:606:7 | call to grep : [collection] [element] | array_flow.rb:603:5:603:5 | b : [collection] [element] | provenance | | | array_flow.rb:603:26:603:26 | x | array_flow.rb:604:14:604:14 | x | provenance | | -| array_flow.rb:605:9:605:20 | call to source | array_flow.rb:603:9:606:7 | call to grep [element] | provenance | | -| array_flow.rb:607:10:607:10 | b [element] | array_flow.rb:607:10:607:13 | ...[...] | provenance | | -| array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:612:9:612:9 | a [element 3] | provenance | | -| array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:614:9:614:9 | a [element 3] | provenance | | -| array_flow.rb:611:9:611:31 | call to [] [element 3] | array_flow.rb:611:5:611:5 | a [element 3] | provenance | | -| array_flow.rb:611:19:611:30 | call to source | array_flow.rb:611:9:611:31 | call to [] [element 3] | provenance | | -| array_flow.rb:612:5:612:5 | b [element] | array_flow.rb:613:10:613:10 | b [element] | provenance | | -| array_flow.rb:612:9:612:9 | a [element 3] | array_flow.rb:612:9:612:21 | call to grep_v [element] | provenance | | -| array_flow.rb:612:9:612:21 | call to grep_v [element] | array_flow.rb:612:5:612:5 | b [element] | provenance | | -| array_flow.rb:613:10:613:10 | b [element] | array_flow.rb:613:10:613:13 | ...[...] | provenance | | -| array_flow.rb:614:5:614:5 | b [element] | array_flow.rb:618:10:618:10 | b [element] | provenance | | -| array_flow.rb:614:9:614:9 | a [element 3] | array_flow.rb:614:27:614:27 | x | provenance | | -| array_flow.rb:614:9:617:7 | call to grep_v [element] | array_flow.rb:614:5:614:5 | b [element] | provenance | | +| array_flow.rb:605:9:605:20 | call to source | array_flow.rb:603:9:606:7 | call to grep : [collection] [element] | provenance | | +| array_flow.rb:607:10:607:10 | b : [collection] [element] | array_flow.rb:607:10:607:13 | ...[...] | provenance | | +| array_flow.rb:611:5:611:5 | a : Array [element 3] | array_flow.rb:612:9:612:9 | a : Array [element 3] | provenance | | +| array_flow.rb:611:5:611:5 | a : Array [element 3] | array_flow.rb:614:9:614:9 | a : Array [element 3] | provenance | | +| array_flow.rb:611:9:611:31 | call to [] : Array [element 3] | array_flow.rb:611:5:611:5 | a : Array [element 3] | provenance | | +| array_flow.rb:611:19:611:30 | call to source | array_flow.rb:611:9:611:31 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:612:5:612:5 | b : [collection] [element] | array_flow.rb:613:10:613:10 | b : [collection] [element] | provenance | | +| array_flow.rb:612:9:612:9 | a : Array [element 3] | array_flow.rb:612:9:612:21 | call to grep_v : [collection] [element] | provenance | | +| array_flow.rb:612:9:612:21 | call to grep_v : [collection] [element] | array_flow.rb:612:5:612:5 | b : [collection] [element] | provenance | | +| array_flow.rb:613:10:613:10 | b : [collection] [element] | array_flow.rb:613:10:613:13 | ...[...] | provenance | | +| array_flow.rb:614:5:614:5 | b : [collection] [element] | array_flow.rb:618:10:618:10 | b : [collection] [element] | provenance | | +| array_flow.rb:614:9:614:9 | a : Array [element 3] | array_flow.rb:614:27:614:27 | x | provenance | | +| array_flow.rb:614:9:617:7 | call to grep_v : [collection] [element] | array_flow.rb:614:5:614:5 | b : [collection] [element] | provenance | | | array_flow.rb:614:27:614:27 | x | array_flow.rb:615:14:615:14 | x | provenance | | -| array_flow.rb:616:9:616:20 | call to source | array_flow.rb:614:9:617:7 | call to grep_v [element] | provenance | | -| array_flow.rb:618:10:618:10 | b [element] | array_flow.rb:618:10:618:13 | ...[...] | provenance | | -| array_flow.rb:622:5:622:5 | a [element 3] | array_flow.rb:623:9:623:9 | a [element 3] | provenance | | -| array_flow.rb:622:9:622:31 | call to [] [element 3] | array_flow.rb:622:5:622:5 | a [element 3] | provenance | | -| array_flow.rb:622:19:622:30 | call to source | array_flow.rb:622:9:622:31 | call to [] [element 3] | provenance | | -| array_flow.rb:623:9:623:9 | a [element 3] | array_flow.rb:623:24:623:24 | x | provenance | | +| array_flow.rb:616:9:616:20 | call to source | array_flow.rb:614:9:617:7 | call to grep_v : [collection] [element] | provenance | | +| array_flow.rb:618:10:618:10 | b : [collection] [element] | array_flow.rb:618:10:618:13 | ...[...] | provenance | | +| array_flow.rb:622:5:622:5 | a : Array [element 3] | array_flow.rb:623:9:623:9 | a : Array [element 3] | provenance | | +| array_flow.rb:622:9:622:31 | call to [] : Array [element 3] | array_flow.rb:622:5:622:5 | a : Array [element 3] | provenance | | +| array_flow.rb:622:19:622:30 | call to source | array_flow.rb:622:9:622:31 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:623:9:623:9 | a : Array [element 3] | array_flow.rb:623:24:623:24 | x | provenance | | | array_flow.rb:623:24:623:24 | x | array_flow.rb:624:14:624:14 | x | provenance | | -| array_flow.rb:631:5:631:5 | a [element 3] | array_flow.rb:632:5:632:5 | a [element 3] | provenance | | -| array_flow.rb:631:9:631:29 | call to [] [element 3] | array_flow.rb:631:5:631:5 | a [element 3] | provenance | | -| array_flow.rb:631:19:631:28 | call to source | array_flow.rb:631:9:631:29 | call to [] [element 3] | provenance | | -| array_flow.rb:632:5:632:5 | a [element 3] | array_flow.rb:632:17:632:17 | x | provenance | | +| array_flow.rb:631:5:631:5 | a : Array [element 3] | array_flow.rb:632:5:632:5 | a : Array [element 3] | provenance | | +| array_flow.rb:631:9:631:29 | call to [] : Array [element 3] | array_flow.rb:631:5:631:5 | a : Array [element 3] | provenance | | +| array_flow.rb:631:19:631:28 | call to source | array_flow.rb:631:9:631:29 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:632:5:632:5 | a : Array [element 3] | array_flow.rb:632:17:632:17 | x | provenance | | | array_flow.rb:632:17:632:17 | x | array_flow.rb:633:14:633:14 | x | provenance | | -| array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:639:9:639:9 | a [element 0] | provenance | | -| array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:645:9:645:9 | a [element 0] | provenance | | -| array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:639:9:639:9 | a [element 2] | provenance | | -| array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:645:9:645:9 | a [element 2] | provenance | | -| array_flow.rb:638:9:638:39 | call to [] [element 0] | array_flow.rb:638:5:638:5 | a [element 0] | provenance | | -| array_flow.rb:638:9:638:39 | call to [] [element 2] | array_flow.rb:638:5:638:5 | a [element 2] | provenance | | -| array_flow.rb:638:10:638:21 | call to source | array_flow.rb:638:9:638:39 | call to [] [element 0] | provenance | | -| array_flow.rb:638:27:638:38 | call to source | array_flow.rb:638:9:638:39 | call to [] [element 2] | provenance | | +| array_flow.rb:638:5:638:5 | a : Array [element 0] | array_flow.rb:639:9:639:9 | a : Array [element 0] | provenance | | +| array_flow.rb:638:5:638:5 | a : Array [element 0] | array_flow.rb:645:9:645:9 | a : Array [element 0] | provenance | | +| array_flow.rb:638:5:638:5 | a : Array [element 2] | array_flow.rb:639:9:639:9 | a : Array [element 2] | provenance | | +| array_flow.rb:638:5:638:5 | a : Array [element 2] | array_flow.rb:645:9:645:9 | a : Array [element 2] | provenance | | +| array_flow.rb:638:9:638:39 | call to [] : Array [element 0] | array_flow.rb:638:5:638:5 | a : Array [element 0] | provenance | | +| array_flow.rb:638:9:638:39 | call to [] : Array [element 2] | array_flow.rb:638:5:638:5 | a : Array [element 2] | provenance | | +| array_flow.rb:638:10:638:21 | call to source | array_flow.rb:638:9:638:39 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:638:27:638:38 | call to source | array_flow.rb:638:9:638:39 | call to [] : Array [element 2] | provenance | | | array_flow.rb:639:5:639:5 | b | array_flow.rb:644:10:644:10 | b | provenance | | -| array_flow.rb:639:9:639:9 | a [element 0] | array_flow.rb:639:22:639:22 | x | provenance | | -| array_flow.rb:639:9:639:9 | a [element 2] | array_flow.rb:639:25:639:25 | y | provenance | | +| array_flow.rb:639:9:639:9 | a : Array [element 0] | array_flow.rb:639:22:639:22 | x | provenance | | +| array_flow.rb:639:9:639:9 | a : Array [element 2] | array_flow.rb:639:25:639:25 | y | provenance | | | array_flow.rb:639:9:643:7 | call to inject | array_flow.rb:639:5:639:5 | b | provenance | | | array_flow.rb:639:22:639:22 | x | array_flow.rb:640:14:640:14 | x | provenance | | | array_flow.rb:639:25:639:25 | y | array_flow.rb:641:14:641:14 | y | provenance | | | array_flow.rb:642:9:642:19 | call to source | array_flow.rb:639:9:643:7 | call to inject | provenance | | | array_flow.rb:645:5:645:5 | c | array_flow.rb:650:10:650:10 | c | provenance | | -| array_flow.rb:645:9:645:9 | a [element 0] | array_flow.rb:645:28:645:28 | y | provenance | | -| array_flow.rb:645:9:645:9 | a [element 2] | array_flow.rb:645:28:645:28 | y | provenance | | +| array_flow.rb:645:9:645:9 | a : Array [element 0] | array_flow.rb:645:28:645:28 | y | provenance | | +| array_flow.rb:645:9:645:9 | a : Array [element 2] | array_flow.rb:645:28:645:28 | y | provenance | | | array_flow.rb:645:9:649:7 | call to inject | array_flow.rb:645:5:645:5 | c | provenance | | | array_flow.rb:645:28:645:28 | y | array_flow.rb:647:14:647:14 | y | provenance | | | array_flow.rb:648:9:648:19 | call to source | array_flow.rb:645:9:649:7 | call to inject | provenance | | -| array_flow.rb:655:5:655:5 | a [element 2] | array_flow.rb:656:9:656:9 | a [element 2] | provenance | | -| array_flow.rb:655:9:655:28 | call to [] [element 2] | array_flow.rb:655:5:655:5 | a [element 2] | provenance | | -| array_flow.rb:655:16:655:27 | call to source | array_flow.rb:655:9:655:28 | call to [] [element 2] | provenance | | -| array_flow.rb:656:5:656:5 | b [element 1] | array_flow.rb:663:10:663:10 | b [element 1] | provenance | | -| array_flow.rb:656:5:656:5 | b [element 2] | array_flow.rb:664:10:664:10 | b [element 2] | provenance | | -| array_flow.rb:656:5:656:5 | b [element 4] | array_flow.rb:666:10:666:10 | b [element 4] | provenance | | -| array_flow.rb:656:9:656:9 | [post] a [element 1] | array_flow.rb:658:10:658:10 | a [element 1] | provenance | | -| array_flow.rb:656:9:656:9 | [post] a [element 2] | array_flow.rb:659:10:659:10 | a [element 2] | provenance | | -| array_flow.rb:656:9:656:9 | [post] a [element 4] | array_flow.rb:661:10:661:10 | a [element 4] | provenance | | -| array_flow.rb:656:9:656:9 | a [element 2] | array_flow.rb:656:9:656:9 | [post] a [element 4] | provenance | | -| array_flow.rb:656:9:656:9 | a [element 2] | array_flow.rb:656:9:656:47 | call to insert [element 4] | provenance | | -| array_flow.rb:656:9:656:47 | call to insert [element 1] | array_flow.rb:656:5:656:5 | b [element 1] | provenance | | -| array_flow.rb:656:9:656:47 | call to insert [element 2] | array_flow.rb:656:5:656:5 | b [element 2] | provenance | | -| array_flow.rb:656:9:656:47 | call to insert [element 4] | array_flow.rb:656:5:656:5 | b [element 4] | provenance | | -| array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:9 | [post] a [element 1] | provenance | | -| array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:47 | call to insert [element 1] | provenance | | -| array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:9 | [post] a [element 2] | provenance | | -| array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:47 | call to insert [element 2] | provenance | | -| array_flow.rb:658:10:658:10 | a [element 1] | array_flow.rb:658:10:658:13 | ...[...] | provenance | | -| array_flow.rb:659:10:659:10 | a [element 2] | array_flow.rb:659:10:659:13 | ...[...] | provenance | | -| array_flow.rb:661:10:661:10 | a [element 4] | array_flow.rb:661:10:661:13 | ...[...] | provenance | | -| array_flow.rb:663:10:663:10 | b [element 1] | array_flow.rb:663:10:663:13 | ...[...] | provenance | | -| array_flow.rb:664:10:664:10 | b [element 2] | array_flow.rb:664:10:664:13 | ...[...] | provenance | | -| array_flow.rb:666:10:666:10 | b [element 4] | array_flow.rb:666:10:666:13 | ...[...] | provenance | | -| array_flow.rb:669:5:669:5 | c [element 2] | array_flow.rb:670:9:670:9 | c [element 2] | provenance | | -| array_flow.rb:669:9:669:28 | call to [] [element 2] | array_flow.rb:669:5:669:5 | c [element 2] | provenance | | -| array_flow.rb:669:16:669:27 | call to source | array_flow.rb:669:9:669:28 | call to [] [element 2] | provenance | | -| array_flow.rb:670:5:670:5 | d [element] | array_flow.rb:672:10:672:10 | d [element] | provenance | | -| array_flow.rb:670:9:670:9 | [post] c [element] | array_flow.rb:671:10:671:10 | c [element] | provenance | | -| array_flow.rb:670:9:670:9 | c [element 2] | array_flow.rb:670:9:670:9 | [post] c [element] | provenance | | -| array_flow.rb:670:9:670:9 | c [element 2] | array_flow.rb:670:9:670:47 | call to insert [element] | provenance | | -| array_flow.rb:670:9:670:47 | call to insert [element] | array_flow.rb:670:5:670:5 | d [element] | provenance | | -| array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:9 | [post] c [element] | provenance | | -| array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:47 | call to insert [element] | provenance | | -| array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:9 | [post] c [element] | provenance | | -| array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:47 | call to insert [element] | provenance | | -| array_flow.rb:671:10:671:10 | c [element] | array_flow.rb:671:10:671:13 | ...[...] | provenance | | -| array_flow.rb:672:10:672:10 | d [element] | array_flow.rb:672:10:672:13 | ...[...] | provenance | | -| array_flow.rb:683:5:683:5 | a [element 2] | array_flow.rb:684:9:684:9 | a [element 2] | provenance | | -| array_flow.rb:683:9:683:28 | call to [] [element 2] | array_flow.rb:683:5:683:5 | a [element 2] | provenance | | -| array_flow.rb:683:16:683:27 | call to source | array_flow.rb:683:9:683:28 | call to [] [element 2] | provenance | | -| array_flow.rb:684:5:684:5 | b [element] | array_flow.rb:685:10:685:10 | b [element] | provenance | | -| array_flow.rb:684:9:684:9 | a [element 2] | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | -| array_flow.rb:684:9:684:60 | call to intersection [element] | array_flow.rb:684:5:684:5 | b [element] | provenance | | -| array_flow.rb:684:24:684:43 | call to [] [element 2] | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | -| array_flow.rb:684:31:684:42 | call to source | array_flow.rb:684:24:684:43 | call to [] [element 2] | provenance | | -| array_flow.rb:684:46:684:59 | call to [] [element 0] | array_flow.rb:684:9:684:60 | call to intersection [element] | provenance | | -| array_flow.rb:684:47:684:58 | call to source | array_flow.rb:684:46:684:59 | call to [] [element 0] | provenance | | -| array_flow.rb:685:10:685:10 | b [element] | array_flow.rb:685:10:685:13 | ...[...] | provenance | | -| array_flow.rb:689:5:689:5 | a [element 2] | array_flow.rb:690:9:690:9 | a [element 2] | provenance | | -| array_flow.rb:689:9:689:26 | call to [] [element 2] | array_flow.rb:689:5:689:5 | a [element 2] | provenance | | -| array_flow.rb:689:16:689:25 | call to source | array_flow.rb:689:9:689:26 | call to [] [element 2] | provenance | | -| array_flow.rb:690:5:690:5 | b [element] | array_flow.rb:695:10:695:10 | b [element] | provenance | | -| array_flow.rb:690:9:690:9 | [post] a [element] | array_flow.rb:694:10:694:10 | a [element] | provenance | | -| array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:9:690:9 | [post] a [element] | provenance | | -| array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:9:693:7 | call to keep_if [element] | provenance | | -| array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:23:690:23 | x | provenance | | -| array_flow.rb:690:9:693:7 | call to keep_if [element] | array_flow.rb:690:5:690:5 | b [element] | provenance | | +| array_flow.rb:655:5:655:5 | a : Array [element 2] | array_flow.rb:656:9:656:9 | a : Array [element 2] | provenance | | +| array_flow.rb:655:9:655:28 | call to [] : Array [element 2] | array_flow.rb:655:5:655:5 | a : Array [element 2] | provenance | | +| array_flow.rb:655:16:655:27 | call to source | array_flow.rb:655:9:655:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:656:5:656:5 | b : [collection] [element 1] | array_flow.rb:663:10:663:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:656:5:656:5 | b : [collection] [element 2] | array_flow.rb:664:10:664:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:656:5:656:5 | b : [collection] [element 4] | array_flow.rb:666:10:666:10 | b : [collection] [element 4] | provenance | | +| array_flow.rb:656:9:656:9 | [post] a : [collection] [element 1] | array_flow.rb:658:10:658:10 | a : [collection] [element 1] | provenance | | +| array_flow.rb:656:9:656:9 | [post] a : [collection] [element 2] | array_flow.rb:659:10:659:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:656:9:656:9 | [post] a : [collection] [element 4] | array_flow.rb:661:10:661:10 | a : [collection] [element 4] | provenance | | +| array_flow.rb:656:9:656:9 | a : Array [element 2] | array_flow.rb:656:9:656:9 | [post] a : [collection] [element 4] | provenance | | +| array_flow.rb:656:9:656:9 | a : Array [element 2] | array_flow.rb:656:9:656:47 | call to insert : [collection] [element 4] | provenance | | +| array_flow.rb:656:9:656:47 | call to insert : [collection] [element 1] | array_flow.rb:656:5:656:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:656:9:656:47 | call to insert : [collection] [element 2] | array_flow.rb:656:5:656:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:656:9:656:47 | call to insert : [collection] [element 4] | array_flow.rb:656:5:656:5 | b : [collection] [element 4] | provenance | | +| array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:9 | [post] a : [collection] [element 1] | provenance | | +| array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:47 | call to insert : [collection] [element 1] | provenance | | +| array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:9 | [post] a : [collection] [element 2] | provenance | | +| array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:47 | call to insert : [collection] [element 2] | provenance | | +| array_flow.rb:658:10:658:10 | a : [collection] [element 1] | array_flow.rb:658:10:658:13 | ...[...] | provenance | | +| array_flow.rb:659:10:659:10 | a : [collection] [element 2] | array_flow.rb:659:10:659:13 | ...[...] | provenance | | +| array_flow.rb:661:10:661:10 | a : [collection] [element 4] | array_flow.rb:661:10:661:13 | ...[...] | provenance | | +| array_flow.rb:663:10:663:10 | b : [collection] [element 1] | array_flow.rb:663:10:663:13 | ...[...] | provenance | | +| array_flow.rb:664:10:664:10 | b : [collection] [element 2] | array_flow.rb:664:10:664:13 | ...[...] | provenance | | +| array_flow.rb:666:10:666:10 | b : [collection] [element 4] | array_flow.rb:666:10:666:13 | ...[...] | provenance | | +| array_flow.rb:669:5:669:5 | c : Array [element 2] | array_flow.rb:670:9:670:9 | c : Array [element 2] | provenance | | +| array_flow.rb:669:9:669:28 | call to [] : Array [element 2] | array_flow.rb:669:5:669:5 | c : Array [element 2] | provenance | | +| array_flow.rb:669:16:669:27 | call to source | array_flow.rb:669:9:669:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:670:5:670:5 | d : [collection] [element] | array_flow.rb:672:10:672:10 | d : [collection] [element] | provenance | | +| array_flow.rb:670:9:670:9 | [post] c : [collection] [element] | array_flow.rb:671:10:671:10 | c : [collection] [element] | provenance | | +| array_flow.rb:670:9:670:9 | c : Array [element 2] | array_flow.rb:670:9:670:9 | [post] c : [collection] [element] | provenance | | +| array_flow.rb:670:9:670:9 | c : Array [element 2] | array_flow.rb:670:9:670:47 | call to insert : [collection] [element] | provenance | | +| array_flow.rb:670:9:670:47 | call to insert : [collection] [element] | array_flow.rb:670:5:670:5 | d : [collection] [element] | provenance | | +| array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:9 | [post] c : [collection] [element] | provenance | | +| array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:47 | call to insert : [collection] [element] | provenance | | +| array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:9 | [post] c : [collection] [element] | provenance | | +| array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:47 | call to insert : [collection] [element] | provenance | | +| array_flow.rb:671:10:671:10 | c : [collection] [element] | array_flow.rb:671:10:671:13 | ...[...] | provenance | | +| array_flow.rb:672:10:672:10 | d : [collection] [element] | array_flow.rb:672:10:672:13 | ...[...] | provenance | | +| array_flow.rb:683:5:683:5 | a : Array [element 2] | array_flow.rb:684:9:684:9 | a : Array [element 2] | provenance | | +| array_flow.rb:683:9:683:28 | call to [] : Array [element 2] | array_flow.rb:683:5:683:5 | a : Array [element 2] | provenance | | +| array_flow.rb:683:16:683:27 | call to source | array_flow.rb:683:9:683:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:684:5:684:5 | b : [collection] [element] | array_flow.rb:685:10:685:10 | b : [collection] [element] | provenance | | +| array_flow.rb:684:9:684:9 | a : Array [element 2] | array_flow.rb:684:9:684:60 | call to intersection : [collection] [element] | provenance | | +| array_flow.rb:684:9:684:60 | call to intersection : [collection] [element] | array_flow.rb:684:5:684:5 | b : [collection] [element] | provenance | | +| array_flow.rb:684:24:684:43 | call to [] : Array [element 2] | array_flow.rb:684:9:684:60 | call to intersection : [collection] [element] | provenance | | +| array_flow.rb:684:31:684:42 | call to source | array_flow.rb:684:24:684:43 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:684:46:684:59 | call to [] : Array [element 0] | array_flow.rb:684:9:684:60 | call to intersection : [collection] [element] | provenance | | +| array_flow.rb:684:47:684:58 | call to source | array_flow.rb:684:46:684:59 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:685:10:685:10 | b : [collection] [element] | array_flow.rb:685:10:685:13 | ...[...] | provenance | | +| array_flow.rb:689:5:689:5 | a : Array [element 2] | array_flow.rb:690:9:690:9 | a : Array [element 2] | provenance | | +| array_flow.rb:689:9:689:26 | call to [] : Array [element 2] | array_flow.rb:689:5:689:5 | a : Array [element 2] | provenance | | +| array_flow.rb:689:16:689:25 | call to source | array_flow.rb:689:9:689:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:690:5:690:5 | b : [collection] [element] | array_flow.rb:695:10:695:10 | b : [collection] [element] | provenance | | +| array_flow.rb:690:9:690:9 | [post] a : [collection] [element] | array_flow.rb:694:10:694:10 | a : [collection] [element] | provenance | | +| array_flow.rb:690:9:690:9 | a : Array [element 2] | array_flow.rb:690:9:690:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:690:9:690:9 | a : Array [element 2] | array_flow.rb:690:9:693:7 | call to keep_if : [collection] [element] | provenance | | +| array_flow.rb:690:9:690:9 | a : Array [element 2] | array_flow.rb:690:23:690:23 | x | provenance | | +| array_flow.rb:690:9:693:7 | call to keep_if : [collection] [element] | array_flow.rb:690:5:690:5 | b : [collection] [element] | provenance | | | array_flow.rb:690:23:690:23 | x | array_flow.rb:691:14:691:14 | x | provenance | | -| array_flow.rb:694:10:694:10 | a [element] | array_flow.rb:694:10:694:13 | ...[...] | provenance | | -| array_flow.rb:695:10:695:10 | b [element] | array_flow.rb:695:10:695:13 | ...[...] | provenance | | -| array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:701:10:701:10 | a [element 2] | provenance | | -| array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:702:9:702:9 | a [element 2] | provenance | | -| array_flow.rb:699:9:699:28 | call to [] [element 2] | array_flow.rb:699:5:699:5 | a [element 2] | provenance | | -| array_flow.rb:699:16:699:27 | call to source | array_flow.rb:699:9:699:28 | call to [] [element 2] | provenance | | -| array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:701:10:701:10 | a [element] | provenance | | -| array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:702:9:702:9 | a [element] | provenance | | -| array_flow.rb:700:12:700:23 | call to source | array_flow.rb:700:5:700:5 | [post] a [element] | provenance | | -| array_flow.rb:701:10:701:10 | a [element 2] | array_flow.rb:701:10:701:15 | call to last | provenance | | -| array_flow.rb:701:10:701:10 | a [element] | array_flow.rb:701:10:701:15 | call to last | provenance | | -| array_flow.rb:702:5:702:5 | b [element] | array_flow.rb:703:10:703:10 | b [element] | provenance | | -| array_flow.rb:702:5:702:5 | b [element] | array_flow.rb:704:10:704:10 | b [element] | provenance | | -| array_flow.rb:702:9:702:9 | a [element 2] | array_flow.rb:702:9:702:17 | call to last [element] | provenance | | -| array_flow.rb:702:9:702:9 | a [element] | array_flow.rb:702:9:702:17 | call to last [element] | provenance | | -| array_flow.rb:702:9:702:17 | call to last [element] | array_flow.rb:702:5:702:5 | b [element] | provenance | | -| array_flow.rb:703:10:703:10 | b [element] | array_flow.rb:703:10:703:13 | ...[...] | provenance | | -| array_flow.rb:704:10:704:10 | b [element] | array_flow.rb:704:10:704:13 | ...[...] | provenance | | -| array_flow.rb:708:5:708:5 | a [element 2] | array_flow.rb:709:9:709:9 | a [element 2] | provenance | | -| array_flow.rb:708:9:708:28 | call to [] [element 2] | array_flow.rb:708:5:708:5 | a [element 2] | provenance | | -| array_flow.rb:708:16:708:27 | call to source | array_flow.rb:708:9:708:28 | call to [] [element 2] | provenance | | -| array_flow.rb:709:5:709:5 | b [element] | array_flow.rb:713:10:713:10 | b [element] | provenance | | -| array_flow.rb:709:9:709:9 | a [element 2] | array_flow.rb:709:19:709:19 | x | provenance | | -| array_flow.rb:709:9:712:7 | call to map [element] | array_flow.rb:709:5:709:5 | b [element] | provenance | | +| array_flow.rb:694:10:694:10 | a : [collection] [element] | array_flow.rb:694:10:694:13 | ...[...] | provenance | | +| array_flow.rb:695:10:695:10 | b : [collection] [element] | array_flow.rb:695:10:695:13 | ...[...] | provenance | | +| array_flow.rb:699:5:699:5 | a : Array [element 2] | array_flow.rb:701:10:701:10 | a : Array [element 2] | provenance | | +| array_flow.rb:699:5:699:5 | a : Array [element 2] | array_flow.rb:702:9:702:9 | a : Array [element 2] | provenance | | +| array_flow.rb:699:9:699:28 | call to [] : Array [element 2] | array_flow.rb:699:5:699:5 | a : Array [element 2] | provenance | | +| array_flow.rb:699:16:699:27 | call to source | array_flow.rb:699:9:699:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:700:5:700:5 | [post] a : [collection] [element] | array_flow.rb:701:10:701:10 | a : [collection] [element] | provenance | | +| array_flow.rb:700:5:700:5 | [post] a : [collection] [element] | array_flow.rb:702:9:702:9 | a : [collection] [element] | provenance | | +| array_flow.rb:700:12:700:23 | call to source | array_flow.rb:700:5:700:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:701:10:701:10 | a : Array [element 2] | array_flow.rb:701:10:701:15 | call to last | provenance | | +| array_flow.rb:701:10:701:10 | a : [collection] [element] | array_flow.rb:701:10:701:15 | call to last | provenance | | +| array_flow.rb:702:5:702:5 | b : [collection] [element] | array_flow.rb:703:10:703:10 | b : [collection] [element] | provenance | | +| array_flow.rb:702:5:702:5 | b : [collection] [element] | array_flow.rb:704:10:704:10 | b : [collection] [element] | provenance | | +| array_flow.rb:702:9:702:9 | a : Array [element 2] | array_flow.rb:702:9:702:17 | call to last : [collection] [element] | provenance | | +| array_flow.rb:702:9:702:9 | a : [collection] [element] | array_flow.rb:702:9:702:17 | call to last : [collection] [element] | provenance | | +| array_flow.rb:702:9:702:17 | call to last : [collection] [element] | array_flow.rb:702:5:702:5 | b : [collection] [element] | provenance | | +| array_flow.rb:703:10:703:10 | b : [collection] [element] | array_flow.rb:703:10:703:13 | ...[...] | provenance | | +| array_flow.rb:704:10:704:10 | b : [collection] [element] | array_flow.rb:704:10:704:13 | ...[...] | provenance | | +| array_flow.rb:708:5:708:5 | a : Array [element 2] | array_flow.rb:709:9:709:9 | a : Array [element 2] | provenance | | +| array_flow.rb:708:9:708:28 | call to [] : Array [element 2] | array_flow.rb:708:5:708:5 | a : Array [element 2] | provenance | | +| array_flow.rb:708:16:708:27 | call to source | array_flow.rb:708:9:708:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:709:5:709:5 | b : [collection] [element] | array_flow.rb:713:10:713:10 | b : [collection] [element] | provenance | | +| array_flow.rb:709:9:709:9 | a : Array [element 2] | array_flow.rb:709:19:709:19 | x | provenance | | +| array_flow.rb:709:9:712:7 | call to map : [collection] [element] | array_flow.rb:709:5:709:5 | b : [collection] [element] | provenance | | | array_flow.rb:709:19:709:19 | x | array_flow.rb:710:14:710:14 | x | provenance | | -| array_flow.rb:711:9:711:19 | call to source | array_flow.rb:709:9:712:7 | call to map [element] | provenance | | -| array_flow.rb:713:10:713:10 | b [element] | array_flow.rb:713:10:713:13 | ...[...] | provenance | | -| array_flow.rb:717:5:717:5 | a [element 2] | array_flow.rb:718:9:718:9 | a [element 2] | provenance | | -| array_flow.rb:717:9:717:28 | call to [] [element 2] | array_flow.rb:717:5:717:5 | a [element 2] | provenance | | -| array_flow.rb:717:16:717:27 | call to source | array_flow.rb:717:9:717:28 | call to [] [element 2] | provenance | | -| array_flow.rb:718:5:718:5 | b [element] | array_flow.rb:722:10:722:10 | b [element] | provenance | | -| array_flow.rb:718:9:718:9 | a [element 2] | array_flow.rb:718:20:718:20 | x | provenance | | -| array_flow.rb:718:9:721:7 | call to map! [element] | array_flow.rb:718:5:718:5 | b [element] | provenance | | +| array_flow.rb:711:9:711:19 | call to source | array_flow.rb:709:9:712:7 | call to map : [collection] [element] | provenance | | +| array_flow.rb:713:10:713:10 | b : [collection] [element] | array_flow.rb:713:10:713:13 | ...[...] | provenance | | +| array_flow.rb:717:5:717:5 | a : Array [element 2] | array_flow.rb:718:9:718:9 | a : Array [element 2] | provenance | | +| array_flow.rb:717:9:717:28 | call to [] : Array [element 2] | array_flow.rb:717:5:717:5 | a : Array [element 2] | provenance | | +| array_flow.rb:717:16:717:27 | call to source | array_flow.rb:717:9:717:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:718:5:718:5 | b : [collection] [element] | array_flow.rb:722:10:722:10 | b : [collection] [element] | provenance | | +| array_flow.rb:718:9:718:9 | a : Array [element 2] | array_flow.rb:718:20:718:20 | x | provenance | | +| array_flow.rb:718:9:721:7 | call to map! : [collection] [element] | array_flow.rb:718:5:718:5 | b : [collection] [element] | provenance | | | array_flow.rb:718:20:718:20 | x | array_flow.rb:719:14:719:14 | x | provenance | | -| array_flow.rb:720:9:720:19 | call to source | array_flow.rb:718:9:721:7 | call to map! [element] | provenance | | -| array_flow.rb:722:10:722:10 | b [element] | array_flow.rb:722:10:722:13 | ...[...] | provenance | | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:729:9:729:9 | a [element 2] | provenance | | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:733:9:733:9 | a [element 2] | provenance | | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:737:9:737:9 | a [element 2] | provenance | | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:745:9:745:9 | a [element 2] | provenance | | -| array_flow.rb:726:9:726:26 | call to [] [element 2] | array_flow.rb:726:5:726:5 | a [element 2] | provenance | | -| array_flow.rb:726:16:726:25 | call to source | array_flow.rb:726:9:726:26 | call to [] [element 2] | provenance | | +| array_flow.rb:720:9:720:19 | call to source | array_flow.rb:718:9:721:7 | call to map! : [collection] [element] | provenance | | +| array_flow.rb:722:10:722:10 | b : [collection] [element] | array_flow.rb:722:10:722:13 | ...[...] | provenance | | +| array_flow.rb:726:5:726:5 | a : Array [element 2] | array_flow.rb:729:9:729:9 | a : Array [element 2] | provenance | | +| array_flow.rb:726:5:726:5 | a : Array [element 2] | array_flow.rb:733:9:733:9 | a : Array [element 2] | provenance | | +| array_flow.rb:726:5:726:5 | a : Array [element 2] | array_flow.rb:737:9:737:9 | a : Array [element 2] | provenance | | +| array_flow.rb:726:5:726:5 | a : Array [element 2] | array_flow.rb:745:9:745:9 | a : Array [element 2] | provenance | | +| array_flow.rb:726:9:726:26 | call to [] : Array [element 2] | array_flow.rb:726:5:726:5 | a : Array [element 2] | provenance | | +| array_flow.rb:726:16:726:25 | call to source | array_flow.rb:726:9:726:26 | call to [] : Array [element 2] | provenance | | | array_flow.rb:729:5:729:5 | b | array_flow.rb:730:10:730:10 | b | provenance | | -| array_flow.rb:729:9:729:9 | a [element 2] | array_flow.rb:729:9:729:13 | call to max | provenance | | +| array_flow.rb:729:9:729:9 | a : Array [element 2] | array_flow.rb:729:9:729:13 | call to max | provenance | | | array_flow.rb:729:9:729:13 | call to max | array_flow.rb:729:5:729:5 | b | provenance | | -| array_flow.rb:733:5:733:5 | c [element] | array_flow.rb:734:10:734:10 | c [element] | provenance | | -| array_flow.rb:733:9:733:9 | a [element 2] | array_flow.rb:733:9:733:16 | call to max [element] | provenance | | -| array_flow.rb:733:9:733:16 | call to max [element] | array_flow.rb:733:5:733:5 | c [element] | provenance | | -| array_flow.rb:734:10:734:10 | c [element] | array_flow.rb:734:10:734:13 | ...[...] | provenance | | +| array_flow.rb:733:5:733:5 | c : [collection] [element] | array_flow.rb:734:10:734:10 | c : [collection] [element] | provenance | | +| array_flow.rb:733:9:733:9 | a : Array [element 2] | array_flow.rb:733:9:733:16 | call to max : [collection] [element] | provenance | | +| array_flow.rb:733:9:733:16 | call to max : [collection] [element] | array_flow.rb:733:5:733:5 | c : [collection] [element] | provenance | | +| array_flow.rb:734:10:734:10 | c : [collection] [element] | array_flow.rb:734:10:734:13 | ...[...] | provenance | | | array_flow.rb:737:5:737:5 | d | array_flow.rb:742:10:742:10 | d | provenance | | -| array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:9:741:7 | call to max | provenance | | -| array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:19:737:19 | x | provenance | | -| array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:22:737:22 | y | provenance | | +| array_flow.rb:737:9:737:9 | a : Array [element 2] | array_flow.rb:737:9:741:7 | call to max | provenance | | +| array_flow.rb:737:9:737:9 | a : Array [element 2] | array_flow.rb:737:19:737:19 | x | provenance | | +| array_flow.rb:737:9:737:9 | a : Array [element 2] | array_flow.rb:737:22:737:22 | y | provenance | | | array_flow.rb:737:9:741:7 | call to max | array_flow.rb:737:5:737:5 | d | provenance | | | array_flow.rb:737:19:737:19 | x | array_flow.rb:738:14:738:14 | x | provenance | | | array_flow.rb:737:22:737:22 | y | array_flow.rb:739:14:739:14 | y | provenance | | -| array_flow.rb:745:5:745:5 | e [element] | array_flow.rb:750:10:750:10 | e [element] | provenance | | -| array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:9:749:7 | call to max [element] | provenance | | -| array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:22:745:22 | x | provenance | | -| array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:25:745:25 | y | provenance | | -| array_flow.rb:745:9:749:7 | call to max [element] | array_flow.rb:745:5:745:5 | e [element] | provenance | | +| array_flow.rb:745:5:745:5 | e : [collection] [element] | array_flow.rb:750:10:750:10 | e : [collection] [element] | provenance | | +| array_flow.rb:745:9:745:9 | a : Array [element 2] | array_flow.rb:745:9:749:7 | call to max : [collection] [element] | provenance | | +| array_flow.rb:745:9:745:9 | a : Array [element 2] | array_flow.rb:745:22:745:22 | x | provenance | | +| array_flow.rb:745:9:745:9 | a : Array [element 2] | array_flow.rb:745:25:745:25 | y | provenance | | +| array_flow.rb:745:9:749:7 | call to max : [collection] [element] | array_flow.rb:745:5:745:5 | e : [collection] [element] | provenance | | | array_flow.rb:745:22:745:22 | x | array_flow.rb:746:14:746:14 | x | provenance | | | array_flow.rb:745:25:745:25 | y | array_flow.rb:747:14:747:14 | y | provenance | | -| array_flow.rb:750:10:750:10 | e [element] | array_flow.rb:750:10:750:13 | ...[...] | provenance | | -| array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:757:9:757:9 | a [element 2] | provenance | | -| array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:764:9:764:9 | a [element 2] | provenance | | -| array_flow.rb:754:9:754:26 | call to [] [element 2] | array_flow.rb:754:5:754:5 | a [element 2] | provenance | | -| array_flow.rb:754:16:754:25 | call to source | array_flow.rb:754:9:754:26 | call to [] [element 2] | provenance | | +| array_flow.rb:750:10:750:10 | e : [collection] [element] | array_flow.rb:750:10:750:13 | ...[...] | provenance | | +| array_flow.rb:754:5:754:5 | a : Array [element 2] | array_flow.rb:757:9:757:9 | a : Array [element 2] | provenance | | +| array_flow.rb:754:5:754:5 | a : Array [element 2] | array_flow.rb:764:9:764:9 | a : Array [element 2] | provenance | | +| array_flow.rb:754:9:754:26 | call to [] : Array [element 2] | array_flow.rb:754:5:754:5 | a : Array [element 2] | provenance | | +| array_flow.rb:754:16:754:25 | call to source | array_flow.rb:754:9:754:26 | call to [] : Array [element 2] | provenance | | | array_flow.rb:757:5:757:5 | b | array_flow.rb:761:10:761:10 | b | provenance | | -| array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:9:760:7 | call to max_by | provenance | | -| array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:22:757:22 | x | provenance | | +| array_flow.rb:757:9:757:9 | a : Array [element 2] | array_flow.rb:757:9:760:7 | call to max_by | provenance | | +| array_flow.rb:757:9:757:9 | a : Array [element 2] | array_flow.rb:757:22:757:22 | x | provenance | | | array_flow.rb:757:9:760:7 | call to max_by | array_flow.rb:757:5:757:5 | b | provenance | | | array_flow.rb:757:22:757:22 | x | array_flow.rb:758:14:758:14 | x | provenance | | -| array_flow.rb:764:5:764:5 | c [element] | array_flow.rb:768:10:768:10 | c [element] | provenance | | -| array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:9:767:7 | call to max_by [element] | provenance | | -| array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:25:764:25 | x | provenance | | -| array_flow.rb:764:9:767:7 | call to max_by [element] | array_flow.rb:764:5:764:5 | c [element] | provenance | | +| array_flow.rb:764:5:764:5 | c : [collection] [element] | array_flow.rb:768:10:768:10 | c : [collection] [element] | provenance | | +| array_flow.rb:764:9:764:9 | a : Array [element 2] | array_flow.rb:764:9:767:7 | call to max_by : [collection] [element] | provenance | | +| array_flow.rb:764:9:764:9 | a : Array [element 2] | array_flow.rb:764:25:764:25 | x | provenance | | +| array_flow.rb:764:9:767:7 | call to max_by : [collection] [element] | array_flow.rb:764:5:764:5 | c : [collection] [element] | provenance | | | array_flow.rb:764:25:764:25 | x | array_flow.rb:765:14:765:14 | x | provenance | | -| array_flow.rb:768:10:768:10 | c [element] | array_flow.rb:768:10:768:13 | ...[...] | provenance | | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:775:9:775:9 | a [element 2] | provenance | | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:779:9:779:9 | a [element 2] | provenance | | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:783:9:783:9 | a [element 2] | provenance | | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:791:9:791:9 | a [element 2] | provenance | | -| array_flow.rb:772:9:772:26 | call to [] [element 2] | array_flow.rb:772:5:772:5 | a [element 2] | provenance | | -| array_flow.rb:772:16:772:25 | call to source | array_flow.rb:772:9:772:26 | call to [] [element 2] | provenance | | +| array_flow.rb:768:10:768:10 | c : [collection] [element] | array_flow.rb:768:10:768:13 | ...[...] | provenance | | +| array_flow.rb:772:5:772:5 | a : Array [element 2] | array_flow.rb:775:9:775:9 | a : Array [element 2] | provenance | | +| array_flow.rb:772:5:772:5 | a : Array [element 2] | array_flow.rb:779:9:779:9 | a : Array [element 2] | provenance | | +| array_flow.rb:772:5:772:5 | a : Array [element 2] | array_flow.rb:783:9:783:9 | a : Array [element 2] | provenance | | +| array_flow.rb:772:5:772:5 | a : Array [element 2] | array_flow.rb:791:9:791:9 | a : Array [element 2] | provenance | | +| array_flow.rb:772:9:772:26 | call to [] : Array [element 2] | array_flow.rb:772:5:772:5 | a : Array [element 2] | provenance | | +| array_flow.rb:772:16:772:25 | call to source | array_flow.rb:772:9:772:26 | call to [] : Array [element 2] | provenance | | | array_flow.rb:775:5:775:5 | b | array_flow.rb:776:10:776:10 | b | provenance | | -| array_flow.rb:775:9:775:9 | a [element 2] | array_flow.rb:775:9:775:13 | call to min | provenance | | +| array_flow.rb:775:9:775:9 | a : Array [element 2] | array_flow.rb:775:9:775:13 | call to min | provenance | | | array_flow.rb:775:9:775:13 | call to min | array_flow.rb:775:5:775:5 | b | provenance | | -| array_flow.rb:779:5:779:5 | c [element] | array_flow.rb:780:10:780:10 | c [element] | provenance | | -| array_flow.rb:779:9:779:9 | a [element 2] | array_flow.rb:779:9:779:16 | call to min [element] | provenance | | -| array_flow.rb:779:9:779:16 | call to min [element] | array_flow.rb:779:5:779:5 | c [element] | provenance | | -| array_flow.rb:780:10:780:10 | c [element] | array_flow.rb:780:10:780:13 | ...[...] | provenance | | +| array_flow.rb:779:5:779:5 | c : [collection] [element] | array_flow.rb:780:10:780:10 | c : [collection] [element] | provenance | | +| array_flow.rb:779:9:779:9 | a : Array [element 2] | array_flow.rb:779:9:779:16 | call to min : [collection] [element] | provenance | | +| array_flow.rb:779:9:779:16 | call to min : [collection] [element] | array_flow.rb:779:5:779:5 | c : [collection] [element] | provenance | | +| array_flow.rb:780:10:780:10 | c : [collection] [element] | array_flow.rb:780:10:780:13 | ...[...] | provenance | | | array_flow.rb:783:5:783:5 | d | array_flow.rb:788:10:788:10 | d | provenance | | -| array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:9:787:7 | call to min | provenance | | -| array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:19:783:19 | x | provenance | | -| array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:22:783:22 | y | provenance | | +| array_flow.rb:783:9:783:9 | a : Array [element 2] | array_flow.rb:783:9:787:7 | call to min | provenance | | +| array_flow.rb:783:9:783:9 | a : Array [element 2] | array_flow.rb:783:19:783:19 | x | provenance | | +| array_flow.rb:783:9:783:9 | a : Array [element 2] | array_flow.rb:783:22:783:22 | y | provenance | | | array_flow.rb:783:9:787:7 | call to min | array_flow.rb:783:5:783:5 | d | provenance | | | array_flow.rb:783:19:783:19 | x | array_flow.rb:784:14:784:14 | x | provenance | | | array_flow.rb:783:22:783:22 | y | array_flow.rb:785:14:785:14 | y | provenance | | -| array_flow.rb:791:5:791:5 | e [element] | array_flow.rb:796:10:796:10 | e [element] | provenance | | -| array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:9:795:7 | call to min [element] | provenance | | -| array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:22:791:22 | x | provenance | | -| array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:25:791:25 | y | provenance | | -| array_flow.rb:791:9:795:7 | call to min [element] | array_flow.rb:791:5:791:5 | e [element] | provenance | | +| array_flow.rb:791:5:791:5 | e : [collection] [element] | array_flow.rb:796:10:796:10 | e : [collection] [element] | provenance | | +| array_flow.rb:791:9:791:9 | a : Array [element 2] | array_flow.rb:791:9:795:7 | call to min : [collection] [element] | provenance | | +| array_flow.rb:791:9:791:9 | a : Array [element 2] | array_flow.rb:791:22:791:22 | x | provenance | | +| array_flow.rb:791:9:791:9 | a : Array [element 2] | array_flow.rb:791:25:791:25 | y | provenance | | +| array_flow.rb:791:9:795:7 | call to min : [collection] [element] | array_flow.rb:791:5:791:5 | e : [collection] [element] | provenance | | | array_flow.rb:791:22:791:22 | x | array_flow.rb:792:14:792:14 | x | provenance | | | array_flow.rb:791:25:791:25 | y | array_flow.rb:793:14:793:14 | y | provenance | | -| array_flow.rb:796:10:796:10 | e [element] | array_flow.rb:796:10:796:13 | ...[...] | provenance | | -| array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:803:9:803:9 | a [element 2] | provenance | | -| array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:810:9:810:9 | a [element 2] | provenance | | -| array_flow.rb:800:9:800:26 | call to [] [element 2] | array_flow.rb:800:5:800:5 | a [element 2] | provenance | | -| array_flow.rb:800:16:800:25 | call to source | array_flow.rb:800:9:800:26 | call to [] [element 2] | provenance | | +| array_flow.rb:796:10:796:10 | e : [collection] [element] | array_flow.rb:796:10:796:13 | ...[...] | provenance | | +| array_flow.rb:800:5:800:5 | a : Array [element 2] | array_flow.rb:803:9:803:9 | a : Array [element 2] | provenance | | +| array_flow.rb:800:5:800:5 | a : Array [element 2] | array_flow.rb:810:9:810:9 | a : Array [element 2] | provenance | | +| array_flow.rb:800:9:800:26 | call to [] : Array [element 2] | array_flow.rb:800:5:800:5 | a : Array [element 2] | provenance | | +| array_flow.rb:800:16:800:25 | call to source | array_flow.rb:800:9:800:26 | call to [] : Array [element 2] | provenance | | | array_flow.rb:803:5:803:5 | b | array_flow.rb:807:10:807:10 | b | provenance | | -| array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:9:806:7 | call to min_by | provenance | | -| array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:22:803:22 | x | provenance | | +| array_flow.rb:803:9:803:9 | a : Array [element 2] | array_flow.rb:803:9:806:7 | call to min_by | provenance | | +| array_flow.rb:803:9:803:9 | a : Array [element 2] | array_flow.rb:803:22:803:22 | x | provenance | | | array_flow.rb:803:9:806:7 | call to min_by | array_flow.rb:803:5:803:5 | b | provenance | | | array_flow.rb:803:22:803:22 | x | array_flow.rb:804:14:804:14 | x | provenance | | -| array_flow.rb:810:5:810:5 | c [element] | array_flow.rb:814:10:814:10 | c [element] | provenance | | -| array_flow.rb:810:9:810:9 | a [element 2] | array_flow.rb:810:9:813:7 | call to min_by [element] | provenance | | -| array_flow.rb:810:9:810:9 | a [element 2] | array_flow.rb:810:25:810:25 | x | provenance | | -| array_flow.rb:810:9:813:7 | call to min_by [element] | array_flow.rb:810:5:810:5 | c [element] | provenance | | +| array_flow.rb:810:5:810:5 | c : [collection] [element] | array_flow.rb:814:10:814:10 | c : [collection] [element] | provenance | | +| array_flow.rb:810:9:810:9 | a : Array [element 2] | array_flow.rb:810:9:813:7 | call to min_by : [collection] [element] | provenance | | +| array_flow.rb:810:9:810:9 | a : Array [element 2] | array_flow.rb:810:25:810:25 | x | provenance | | +| array_flow.rb:810:9:813:7 | call to min_by : [collection] [element] | array_flow.rb:810:5:810:5 | c : [collection] [element] | provenance | | | array_flow.rb:810:25:810:25 | x | array_flow.rb:811:14:811:14 | x | provenance | | -| array_flow.rb:814:10:814:10 | c [element] | array_flow.rb:814:10:814:13 | ...[...] | provenance | | -| array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:820:9:820:9 | a [element 2] | provenance | | -| array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:824:9:824:9 | a [element 2] | provenance | | -| array_flow.rb:818:9:818:26 | call to [] [element 2] | array_flow.rb:818:5:818:5 | a [element 2] | provenance | | -| array_flow.rb:818:16:818:25 | call to source | array_flow.rb:818:9:818:26 | call to [] [element 2] | provenance | | -| array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:821:10:821:10 | b [element] | provenance | | -| array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:822:10:822:10 | b [element] | provenance | | -| array_flow.rb:820:9:820:9 | a [element 2] | array_flow.rb:820:9:820:16 | call to minmax [element] | provenance | | -| array_flow.rb:820:9:820:16 | call to minmax [element] | array_flow.rb:820:5:820:5 | b [element] | provenance | | -| array_flow.rb:821:10:821:10 | b [element] | array_flow.rb:821:10:821:13 | ...[...] | provenance | | -| array_flow.rb:822:10:822:10 | b [element] | array_flow.rb:822:10:822:13 | ...[...] | provenance | | -| array_flow.rb:824:5:824:5 | c [element] | array_flow.rb:829:10:829:10 | c [element] | provenance | | -| array_flow.rb:824:5:824:5 | c [element] | array_flow.rb:830:10:830:10 | c [element] | provenance | | -| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:9:828:7 | call to minmax [element] | provenance | | -| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:22:824:22 | x | provenance | | -| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:25:824:25 | y | provenance | | -| array_flow.rb:824:9:828:7 | call to minmax [element] | array_flow.rb:824:5:824:5 | c [element] | provenance | | +| array_flow.rb:814:10:814:10 | c : [collection] [element] | array_flow.rb:814:10:814:13 | ...[...] | provenance | | +| array_flow.rb:818:5:818:5 | a : Array [element 2] | array_flow.rb:820:9:820:9 | a : Array [element 2] | provenance | | +| array_flow.rb:818:5:818:5 | a : Array [element 2] | array_flow.rb:824:9:824:9 | a : Array [element 2] | provenance | | +| array_flow.rb:818:9:818:26 | call to [] : Array [element 2] | array_flow.rb:818:5:818:5 | a : Array [element 2] | provenance | | +| array_flow.rb:818:16:818:25 | call to source | array_flow.rb:818:9:818:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:820:5:820:5 | b : [collection] [element] | array_flow.rb:821:10:821:10 | b : [collection] [element] | provenance | | +| array_flow.rb:820:5:820:5 | b : [collection] [element] | array_flow.rb:822:10:822:10 | b : [collection] [element] | provenance | | +| array_flow.rb:820:9:820:9 | a : Array [element 2] | array_flow.rb:820:9:820:16 | call to minmax : [collection] [element] | provenance | | +| array_flow.rb:820:9:820:16 | call to minmax : [collection] [element] | array_flow.rb:820:5:820:5 | b : [collection] [element] | provenance | | +| array_flow.rb:821:10:821:10 | b : [collection] [element] | array_flow.rb:821:10:821:13 | ...[...] | provenance | | +| array_flow.rb:822:10:822:10 | b : [collection] [element] | array_flow.rb:822:10:822:13 | ...[...] | provenance | | +| array_flow.rb:824:5:824:5 | c : [collection] [element] | array_flow.rb:829:10:829:10 | c : [collection] [element] | provenance | | +| array_flow.rb:824:5:824:5 | c : [collection] [element] | array_flow.rb:830:10:830:10 | c : [collection] [element] | provenance | | +| array_flow.rb:824:9:824:9 | a : Array [element 2] | array_flow.rb:824:9:828:7 | call to minmax : [collection] [element] | provenance | | +| array_flow.rb:824:9:824:9 | a : Array [element 2] | array_flow.rb:824:22:824:22 | x | provenance | | +| array_flow.rb:824:9:824:9 | a : Array [element 2] | array_flow.rb:824:25:824:25 | y | provenance | | +| array_flow.rb:824:9:828:7 | call to minmax : [collection] [element] | array_flow.rb:824:5:824:5 | c : [collection] [element] | provenance | | | array_flow.rb:824:22:824:22 | x | array_flow.rb:825:14:825:14 | x | provenance | | | array_flow.rb:824:25:824:25 | y | array_flow.rb:826:14:826:14 | y | provenance | | -| array_flow.rb:829:10:829:10 | c [element] | array_flow.rb:829:10:829:13 | ...[...] | provenance | | -| array_flow.rb:830:10:830:10 | c [element] | array_flow.rb:830:10:830:13 | ...[...] | provenance | | -| array_flow.rb:834:5:834:5 | a [element 2] | array_flow.rb:835:9:835:9 | a [element 2] | provenance | | -| array_flow.rb:834:9:834:26 | call to [] [element 2] | array_flow.rb:834:5:834:5 | a [element 2] | provenance | | -| array_flow.rb:834:16:834:25 | call to source | array_flow.rb:834:9:834:26 | call to [] [element 2] | provenance | | -| array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:839:10:839:10 | b [element] | provenance | | -| array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:840:10:840:10 | b [element] | provenance | | -| array_flow.rb:835:9:835:9 | a [element 2] | array_flow.rb:835:9:838:7 | call to minmax_by [element] | provenance | | -| array_flow.rb:835:9:835:9 | a [element 2] | array_flow.rb:835:25:835:25 | x | provenance | | -| array_flow.rb:835:9:838:7 | call to minmax_by [element] | array_flow.rb:835:5:835:5 | b [element] | provenance | | +| array_flow.rb:829:10:829:10 | c : [collection] [element] | array_flow.rb:829:10:829:13 | ...[...] | provenance | | +| array_flow.rb:830:10:830:10 | c : [collection] [element] | array_flow.rb:830:10:830:13 | ...[...] | provenance | | +| array_flow.rb:834:5:834:5 | a : Array [element 2] | array_flow.rb:835:9:835:9 | a : Array [element 2] | provenance | | +| array_flow.rb:834:9:834:26 | call to [] : Array [element 2] | array_flow.rb:834:5:834:5 | a : Array [element 2] | provenance | | +| array_flow.rb:834:16:834:25 | call to source | array_flow.rb:834:9:834:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:835:5:835:5 | b : [collection] [element] | array_flow.rb:839:10:839:10 | b : [collection] [element] | provenance | | +| array_flow.rb:835:5:835:5 | b : [collection] [element] | array_flow.rb:840:10:840:10 | b : [collection] [element] | provenance | | +| array_flow.rb:835:9:835:9 | a : Array [element 2] | array_flow.rb:835:9:838:7 | call to minmax_by : [collection] [element] | provenance | | +| array_flow.rb:835:9:835:9 | a : Array [element 2] | array_flow.rb:835:25:835:25 | x | provenance | | +| array_flow.rb:835:9:838:7 | call to minmax_by : [collection] [element] | array_flow.rb:835:5:835:5 | b : [collection] [element] | provenance | | | array_flow.rb:835:25:835:25 | x | array_flow.rb:836:14:836:14 | x | provenance | | -| array_flow.rb:839:10:839:10 | b [element] | array_flow.rb:839:10:839:13 | ...[...] | provenance | | -| array_flow.rb:840:10:840:10 | b [element] | array_flow.rb:840:10:840:13 | ...[...] | provenance | | -| array_flow.rb:844:5:844:5 | a [element 2] | array_flow.rb:845:5:845:5 | a [element 2] | provenance | | -| array_flow.rb:844:9:844:26 | call to [] [element 2] | array_flow.rb:844:5:844:5 | a [element 2] | provenance | | -| array_flow.rb:844:16:844:25 | call to source | array_flow.rb:844:9:844:26 | call to [] [element 2] | provenance | | -| array_flow.rb:845:5:845:5 | a [element 2] | array_flow.rb:845:17:845:17 | x | provenance | | +| array_flow.rb:839:10:839:10 | b : [collection] [element] | array_flow.rb:839:10:839:13 | ...[...] | provenance | | +| array_flow.rb:840:10:840:10 | b : [collection] [element] | array_flow.rb:840:10:840:13 | ...[...] | provenance | | +| array_flow.rb:844:5:844:5 | a : Array [element 2] | array_flow.rb:845:5:845:5 | a : Array [element 2] | provenance | | +| array_flow.rb:844:9:844:26 | call to [] : Array [element 2] | array_flow.rb:844:5:844:5 | a : Array [element 2] | provenance | | +| array_flow.rb:844:16:844:25 | call to source | array_flow.rb:844:9:844:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:845:5:845:5 | a : Array [element 2] | array_flow.rb:845:17:845:17 | x | provenance | | | array_flow.rb:845:17:845:17 | x | array_flow.rb:846:14:846:14 | x | provenance | | -| array_flow.rb:853:5:853:5 | a [element 2] | array_flow.rb:854:5:854:5 | a [element 2] | provenance | | -| array_flow.rb:853:9:853:26 | call to [] [element 2] | array_flow.rb:853:5:853:5 | a [element 2] | provenance | | -| array_flow.rb:853:16:853:25 | call to source | array_flow.rb:853:9:853:26 | call to [] [element 2] | provenance | | -| array_flow.rb:854:5:854:5 | a [element 2] | array_flow.rb:854:16:854:16 | x | provenance | | +| array_flow.rb:853:5:853:5 | a : Array [element 2] | array_flow.rb:854:5:854:5 | a : Array [element 2] | provenance | | +| array_flow.rb:853:9:853:26 | call to [] : Array [element 2] | array_flow.rb:853:5:853:5 | a : Array [element 2] | provenance | | +| array_flow.rb:853:16:853:25 | call to source | array_flow.rb:853:9:853:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:854:5:854:5 | a : Array [element 2] | array_flow.rb:854:16:854:16 | x | provenance | | | array_flow.rb:854:16:854:16 | x | array_flow.rb:855:14:855:14 | x | provenance | | -| array_flow.rb:866:5:866:5 | a [element 2] | array_flow.rb:867:9:867:9 | a [element 2] | provenance | | -| array_flow.rb:866:9:866:26 | call to [] [element 2] | array_flow.rb:866:5:866:5 | a [element 2] | provenance | | -| array_flow.rb:866:16:866:25 | call to source | array_flow.rb:866:9:866:26 | call to [] [element 2] | provenance | | -| array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:871:10:871:10 | b [element, element] | provenance | | -| array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:872:10:872:10 | b [element, element] | provenance | | -| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:9:870:7 | call to partition [element, element] | provenance | | -| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:25:867:25 | x | provenance | | -| array_flow.rb:867:9:870:7 | call to partition [element, element] | array_flow.rb:867:5:867:5 | b [element, element] | provenance | | +| array_flow.rb:866:5:866:5 | a : Array [element 2] | array_flow.rb:867:9:867:9 | a : Array [element 2] | provenance | | +| array_flow.rb:866:9:866:26 | call to [] : Array [element 2] | array_flow.rb:866:5:866:5 | a : Array [element 2] | provenance | | +| array_flow.rb:866:16:866:25 | call to source | array_flow.rb:866:9:866:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:867:5:867:5 | b : [collection] [element, element] | array_flow.rb:871:10:871:10 | b : [collection] [element, element] | provenance | | +| array_flow.rb:867:5:867:5 | b : [collection] [element, element] | array_flow.rb:872:10:872:10 | b : [collection] [element, element] | provenance | | +| array_flow.rb:867:9:867:9 | a : Array [element 2] | array_flow.rb:867:9:870:7 | call to partition : [collection] [element, element] | provenance | | +| array_flow.rb:867:9:867:9 | a : Array [element 2] | array_flow.rb:867:25:867:25 | x | provenance | | +| array_flow.rb:867:9:870:7 | call to partition : [collection] [element, element] | array_flow.rb:867:5:867:5 | b : [collection] [element, element] | provenance | | | array_flow.rb:867:25:867:25 | x | array_flow.rb:868:14:868:14 | x | provenance | | -| array_flow.rb:871:10:871:10 | b [element, element] | array_flow.rb:871:10:871:13 | ...[...] [element] | provenance | | +| array_flow.rb:871:10:871:10 | b : [collection] [element, element] | array_flow.rb:871:10:871:13 | ...[...] [element] | provenance | | | array_flow.rb:871:10:871:13 | ...[...] [element] | array_flow.rb:871:10:871:16 | ...[...] | provenance | | -| array_flow.rb:872:10:872:10 | b [element, element] | array_flow.rb:872:10:872:13 | ...[...] [element] | provenance | | +| array_flow.rb:872:10:872:10 | b : [collection] [element, element] | array_flow.rb:872:10:872:13 | ...[...] [element] | provenance | | | array_flow.rb:872:10:872:13 | ...[...] [element] | array_flow.rb:872:10:872:16 | ...[...] | provenance | | -| array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:878:9:878:9 | a [element 2] | provenance | | -| array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:886:9:886:9 | a [element 2] | provenance | | -| array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:893:9:893:9 | a [element 2] | provenance | | -| array_flow.rb:876:9:876:26 | call to [] [element 2] | array_flow.rb:876:5:876:5 | a [element 2] | provenance | | -| array_flow.rb:876:16:876:25 | call to source | array_flow.rb:876:9:876:26 | call to [] [element 2] | provenance | | -| array_flow.rb:878:5:878:5 | b [element 2] | array_flow.rb:884:10:884:10 | b [element 2] | provenance | | -| array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:9:882:7 | call to permutation [element 2] | provenance | | -| array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:27:878:27 | x [element] | provenance | | -| array_flow.rb:878:9:882:7 | call to permutation [element 2] | array_flow.rb:878:5:878:5 | b [element 2] | provenance | | -| array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:879:14:879:14 | x [element] | provenance | | -| array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:880:14:880:14 | x [element] | provenance | | -| array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:881:14:881:14 | x [element] | provenance | | -| array_flow.rb:879:14:879:14 | x [element] | array_flow.rb:879:14:879:17 | ...[...] | provenance | | -| array_flow.rb:880:14:880:14 | x [element] | array_flow.rb:880:14:880:17 | ...[...] | provenance | | -| array_flow.rb:881:14:881:14 | x [element] | array_flow.rb:881:14:881:17 | ...[...] | provenance | | -| array_flow.rb:884:10:884:10 | b [element 2] | array_flow.rb:884:10:884:13 | ...[...] | provenance | | -| array_flow.rb:886:5:886:5 | c [element 2] | array_flow.rb:891:10:891:10 | c [element 2] | provenance | | -| array_flow.rb:886:5:886:5 | c [element 2] | array_flow.rb:898:10:898:10 | c [element 2] | provenance | | -| array_flow.rb:886:9:886:9 | a [element 2] | array_flow.rb:886:9:889:7 | call to permutation [element 2] | provenance | | -| array_flow.rb:886:9:886:9 | a [element 2] | array_flow.rb:886:30:886:30 | x [element] | provenance | | -| array_flow.rb:886:9:889:7 | call to permutation [element 2] | array_flow.rb:886:5:886:5 | c [element 2] | provenance | | -| array_flow.rb:886:30:886:30 | x [element] | array_flow.rb:887:14:887:14 | x [element] | provenance | | -| array_flow.rb:886:30:886:30 | x [element] | array_flow.rb:888:14:888:14 | x [element] | provenance | | -| array_flow.rb:887:14:887:14 | x [element] | array_flow.rb:887:14:887:17 | ...[...] | provenance | | -| array_flow.rb:888:14:888:14 | x [element] | array_flow.rb:888:14:888:17 | ...[...] | provenance | | -| array_flow.rb:891:10:891:10 | c [element 2] | array_flow.rb:891:10:891:13 | ...[...] | provenance | | -| array_flow.rb:893:9:893:9 | a [element 2] | array_flow.rb:893:30:893:30 | x [element] | provenance | | -| array_flow.rb:893:30:893:30 | x [element] | array_flow.rb:894:14:894:14 | x [element] | provenance | | -| array_flow.rb:893:30:893:30 | x [element] | array_flow.rb:895:14:895:14 | x [element] | provenance | | -| array_flow.rb:894:14:894:14 | x [element] | array_flow.rb:894:14:894:17 | ...[...] | provenance | | -| array_flow.rb:895:14:895:14 | x [element] | array_flow.rb:895:14:895:17 | ...[...] | provenance | | -| array_flow.rb:898:10:898:10 | c [element 2] | array_flow.rb:898:10:898:13 | ...[...] | provenance | | -| array_flow.rb:905:5:905:5 | a [element 1] | array_flow.rb:906:9:906:9 | a [element 1] | provenance | | -| array_flow.rb:905:5:905:5 | a [element 1] | array_flow.rb:909:10:909:10 | a [element 1] | provenance | | -| array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:906:9:906:9 | a [element 3] | provenance | | -| array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:911:10:911:10 | a [element 3] | provenance | | -| array_flow.rb:905:9:905:42 | call to [] [element 1] | array_flow.rb:905:5:905:5 | a [element 1] | provenance | | -| array_flow.rb:905:9:905:42 | call to [] [element 3] | array_flow.rb:905:5:905:5 | a [element 3] | provenance | | -| array_flow.rb:905:13:905:24 | call to source | array_flow.rb:905:9:905:42 | call to [] [element 1] | provenance | | -| array_flow.rb:905:30:905:41 | call to source | array_flow.rb:905:9:905:42 | call to [] [element 3] | provenance | | +| array_flow.rb:876:5:876:5 | a : Array [element 2] | array_flow.rb:878:9:878:9 | a : Array [element 2] | provenance | | +| array_flow.rb:876:5:876:5 | a : Array [element 2] | array_flow.rb:886:9:886:9 | a : Array [element 2] | provenance | | +| array_flow.rb:876:5:876:5 | a : Array [element 2] | array_flow.rb:893:9:893:9 | a : Array [element 2] | provenance | | +| array_flow.rb:876:9:876:26 | call to [] : Array [element 2] | array_flow.rb:876:5:876:5 | a : Array [element 2] | provenance | | +| array_flow.rb:876:16:876:25 | call to source | array_flow.rb:876:9:876:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:878:5:878:5 | b : Array [element 2] | array_flow.rb:884:10:884:10 | b : Array [element 2] | provenance | | +| array_flow.rb:878:9:878:9 | a : Array [element 2] | array_flow.rb:878:9:882:7 | call to permutation : Array [element 2] | provenance | | +| array_flow.rb:878:9:878:9 | a : Array [element 2] | array_flow.rb:878:27:878:27 | x : [collection] [element] | provenance | | +| array_flow.rb:878:9:882:7 | call to permutation : Array [element 2] | array_flow.rb:878:5:878:5 | b : Array [element 2] | provenance | | +| array_flow.rb:878:27:878:27 | x : [collection] [element] | array_flow.rb:879:14:879:14 | x : [collection] [element] | provenance | | +| array_flow.rb:878:27:878:27 | x : [collection] [element] | array_flow.rb:880:14:880:14 | x : [collection] [element] | provenance | | +| array_flow.rb:878:27:878:27 | x : [collection] [element] | array_flow.rb:881:14:881:14 | x : [collection] [element] | provenance | | +| array_flow.rb:879:14:879:14 | x : [collection] [element] | array_flow.rb:879:14:879:17 | ...[...] | provenance | | +| array_flow.rb:880:14:880:14 | x : [collection] [element] | array_flow.rb:880:14:880:17 | ...[...] | provenance | | +| array_flow.rb:881:14:881:14 | x : [collection] [element] | array_flow.rb:881:14:881:17 | ...[...] | provenance | | +| array_flow.rb:884:10:884:10 | b : Array [element 2] | array_flow.rb:884:10:884:13 | ...[...] | provenance | | +| array_flow.rb:886:5:886:5 | c : Array [element 2] | array_flow.rb:891:10:891:10 | c : Array [element 2] | provenance | | +| array_flow.rb:886:5:886:5 | c : Array [element 2] | array_flow.rb:898:10:898:10 | c : Array [element 2] | provenance | | +| array_flow.rb:886:9:886:9 | a : Array [element 2] | array_flow.rb:886:9:889:7 | call to permutation : Array [element 2] | provenance | | +| array_flow.rb:886:9:886:9 | a : Array [element 2] | array_flow.rb:886:30:886:30 | x : [collection] [element] | provenance | | +| array_flow.rb:886:9:889:7 | call to permutation : Array [element 2] | array_flow.rb:886:5:886:5 | c : Array [element 2] | provenance | | +| array_flow.rb:886:30:886:30 | x : [collection] [element] | array_flow.rb:887:14:887:14 | x : [collection] [element] | provenance | | +| array_flow.rb:886:30:886:30 | x : [collection] [element] | array_flow.rb:888:14:888:14 | x : [collection] [element] | provenance | | +| array_flow.rb:887:14:887:14 | x : [collection] [element] | array_flow.rb:887:14:887:17 | ...[...] | provenance | | +| array_flow.rb:888:14:888:14 | x : [collection] [element] | array_flow.rb:888:14:888:17 | ...[...] | provenance | | +| array_flow.rb:891:10:891:10 | c : Array [element 2] | array_flow.rb:891:10:891:13 | ...[...] | provenance | | +| array_flow.rb:893:9:893:9 | a : Array [element 2] | array_flow.rb:893:30:893:30 | x : [collection] [element] | provenance | | +| array_flow.rb:893:30:893:30 | x : [collection] [element] | array_flow.rb:894:14:894:14 | x : [collection] [element] | provenance | | +| array_flow.rb:893:30:893:30 | x : [collection] [element] | array_flow.rb:895:14:895:14 | x : [collection] [element] | provenance | | +| array_flow.rb:894:14:894:14 | x : [collection] [element] | array_flow.rb:894:14:894:17 | ...[...] | provenance | | +| array_flow.rb:895:14:895:14 | x : [collection] [element] | array_flow.rb:895:14:895:17 | ...[...] | provenance | | +| array_flow.rb:898:10:898:10 | c : Array [element 2] | array_flow.rb:898:10:898:13 | ...[...] | provenance | | +| array_flow.rb:905:5:905:5 | a : Array [element 1] | array_flow.rb:906:9:906:9 | a : Array [element 1] | provenance | | +| array_flow.rb:905:5:905:5 | a : Array [element 1] | array_flow.rb:909:10:909:10 | a : Array [element 1] | provenance | | +| array_flow.rb:905:5:905:5 | a : Array [element 3] | array_flow.rb:906:9:906:9 | a : Array [element 3] | provenance | | +| array_flow.rb:905:5:905:5 | a : Array [element 3] | array_flow.rb:911:10:911:10 | a : Array [element 3] | provenance | | +| array_flow.rb:905:9:905:42 | call to [] : Array [element 1] | array_flow.rb:905:5:905:5 | a : Array [element 1] | provenance | | +| array_flow.rb:905:9:905:42 | call to [] : Array [element 3] | array_flow.rb:905:5:905:5 | a : Array [element 3] | provenance | | +| array_flow.rb:905:13:905:24 | call to source | array_flow.rb:905:9:905:42 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:905:30:905:41 | call to source | array_flow.rb:905:9:905:42 | call to [] : Array [element 3] | provenance | | | array_flow.rb:906:5:906:5 | b | array_flow.rb:907:10:907:10 | b | provenance | | -| array_flow.rb:906:9:906:9 | a [element 1] | array_flow.rb:906:9:906:13 | call to pop | provenance | | -| array_flow.rb:906:9:906:9 | a [element 3] | array_flow.rb:906:9:906:13 | call to pop | provenance | | +| array_flow.rb:906:9:906:9 | a : Array [element 1] | array_flow.rb:906:9:906:13 | call to pop | provenance | | +| array_flow.rb:906:9:906:9 | a : Array [element 3] | array_flow.rb:906:9:906:13 | call to pop | provenance | | | array_flow.rb:906:9:906:13 | call to pop | array_flow.rb:906:5:906:5 | b | provenance | | -| array_flow.rb:909:10:909:10 | a [element 1] | array_flow.rb:909:10:909:13 | ...[...] | provenance | | -| array_flow.rb:911:10:911:10 | a [element 3] | array_flow.rb:911:10:911:13 | ...[...] | provenance | | -| array_flow.rb:913:5:913:5 | a [element 1] | array_flow.rb:914:9:914:9 | a [element 1] | provenance | | -| array_flow.rb:913:5:913:5 | a [element 1] | array_flow.rb:918:10:918:10 | a [element 1] | provenance | | -| array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:914:9:914:9 | a [element 3] | provenance | | -| array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:920:10:920:10 | a [element 3] | provenance | | -| array_flow.rb:913:9:913:42 | call to [] [element 1] | array_flow.rb:913:5:913:5 | a [element 1] | provenance | | -| array_flow.rb:913:9:913:42 | call to [] [element 3] | array_flow.rb:913:5:913:5 | a [element 3] | provenance | | -| array_flow.rb:913:13:913:24 | call to source | array_flow.rb:913:9:913:42 | call to [] [element 1] | provenance | | -| array_flow.rb:913:30:913:41 | call to source | array_flow.rb:913:9:913:42 | call to [] [element 3] | provenance | | -| array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:915:10:915:10 | b [element] | provenance | | -| array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:916:10:916:10 | b [element] | provenance | | -| array_flow.rb:914:9:914:9 | a [element 1] | array_flow.rb:914:9:914:16 | call to pop [element] | provenance | | -| array_flow.rb:914:9:914:9 | a [element 3] | array_flow.rb:914:9:914:16 | call to pop [element] | provenance | | -| array_flow.rb:914:9:914:16 | call to pop [element] | array_flow.rb:914:5:914:5 | b [element] | provenance | | -| array_flow.rb:915:10:915:10 | b [element] | array_flow.rb:915:10:915:13 | ...[...] | provenance | | -| array_flow.rb:916:10:916:10 | b [element] | array_flow.rb:916:10:916:13 | ...[...] | provenance | | -| array_flow.rb:918:10:918:10 | a [element 1] | array_flow.rb:918:10:918:13 | ...[...] | provenance | | -| array_flow.rb:920:10:920:10 | a [element 3] | array_flow.rb:920:10:920:13 | ...[...] | provenance | | -| array_flow.rb:924:5:924:5 | a [element 2] | array_flow.rb:925:5:925:5 | a [element 2] | provenance | | -| array_flow.rb:924:9:924:28 | call to [] [element 2] | array_flow.rb:924:5:924:5 | a [element 2] | provenance | | -| array_flow.rb:924:16:924:27 | call to source | array_flow.rb:924:9:924:28 | call to [] [element 2] | provenance | | -| array_flow.rb:925:5:925:5 | [post] a [element 2] | array_flow.rb:928:10:928:10 | a [element 2] | provenance | | -| array_flow.rb:925:5:925:5 | [post] a [element 5] | array_flow.rb:931:10:931:10 | a [element 5] | provenance | | -| array_flow.rb:925:5:925:5 | a [element 2] | array_flow.rb:925:5:925:5 | [post] a [element 5] | provenance | | -| array_flow.rb:925:21:925:32 | call to source | array_flow.rb:925:5:925:5 | [post] a [element 2] | provenance | | -| array_flow.rb:928:10:928:10 | a [element 2] | array_flow.rb:928:10:928:13 | ...[...] | provenance | | -| array_flow.rb:931:10:931:10 | a [element 5] | array_flow.rb:931:10:931:13 | ...[...] | provenance | | -| array_flow.rb:935:5:935:5 | a [element 2] | array_flow.rb:938:9:938:9 | a [element 2] | provenance | | -| array_flow.rb:935:9:935:28 | call to [] [element 2] | array_flow.rb:935:5:935:5 | a [element 2] | provenance | | -| array_flow.rb:935:16:935:27 | call to source | array_flow.rb:935:9:935:28 | call to [] [element 2] | provenance | | -| array_flow.rb:936:5:936:5 | b [element 1] | array_flow.rb:938:19:938:19 | b [element 1] | provenance | | -| array_flow.rb:936:9:936:28 | call to [] [element 1] | array_flow.rb:936:5:936:5 | b [element 1] | provenance | | -| array_flow.rb:936:13:936:24 | call to source | array_flow.rb:936:9:936:28 | call to [] [element 1] | provenance | | -| array_flow.rb:937:5:937:5 | c [element 0] | array_flow.rb:938:22:938:22 | c [element 0] | provenance | | -| array_flow.rb:937:9:937:28 | call to [] [element 0] | array_flow.rb:937:5:937:5 | c [element 0] | provenance | | -| array_flow.rb:937:10:937:21 | call to source | array_flow.rb:937:9:937:28 | call to [] [element 0] | provenance | | -| array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:939:10:939:10 | d [element, element] | provenance | | -| array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:940:10:940:10 | d [element, element] | provenance | | -| array_flow.rb:938:9:938:9 | a [element 2] | array_flow.rb:938:9:938:22 | call to product [element, element] | provenance | | -| array_flow.rb:938:9:938:22 | call to product [element, element] | array_flow.rb:938:5:938:5 | d [element, element] | provenance | | -| array_flow.rb:938:19:938:19 | b [element 1] | array_flow.rb:938:9:938:22 | call to product [element, element] | provenance | | -| array_flow.rb:938:22:938:22 | c [element 0] | array_flow.rb:938:9:938:22 | call to product [element, element] | provenance | | -| array_flow.rb:939:10:939:10 | d [element, element] | array_flow.rb:939:10:939:13 | ...[...] [element] | provenance | | +| array_flow.rb:909:10:909:10 | a : Array [element 1] | array_flow.rb:909:10:909:13 | ...[...] | provenance | | +| array_flow.rb:911:10:911:10 | a : Array [element 3] | array_flow.rb:911:10:911:13 | ...[...] | provenance | | +| array_flow.rb:913:5:913:5 | a : Array [element 1] | array_flow.rb:914:9:914:9 | a : Array [element 1] | provenance | | +| array_flow.rb:913:5:913:5 | a : Array [element 1] | array_flow.rb:918:10:918:10 | a : Array [element 1] | provenance | | +| array_flow.rb:913:5:913:5 | a : Array [element 3] | array_flow.rb:914:9:914:9 | a : Array [element 3] | provenance | | +| array_flow.rb:913:5:913:5 | a : Array [element 3] | array_flow.rb:920:10:920:10 | a : Array [element 3] | provenance | | +| array_flow.rb:913:9:913:42 | call to [] : Array [element 1] | array_flow.rb:913:5:913:5 | a : Array [element 1] | provenance | | +| array_flow.rb:913:9:913:42 | call to [] : Array [element 3] | array_flow.rb:913:5:913:5 | a : Array [element 3] | provenance | | +| array_flow.rb:913:13:913:24 | call to source | array_flow.rb:913:9:913:42 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:913:30:913:41 | call to source | array_flow.rb:913:9:913:42 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:914:5:914:5 | b : [collection] [element] | array_flow.rb:915:10:915:10 | b : [collection] [element] | provenance | | +| array_flow.rb:914:5:914:5 | b : [collection] [element] | array_flow.rb:916:10:916:10 | b : [collection] [element] | provenance | | +| array_flow.rb:914:9:914:9 | a : Array [element 1] | array_flow.rb:914:9:914:16 | call to pop : [collection] [element] | provenance | | +| array_flow.rb:914:9:914:9 | a : Array [element 3] | array_flow.rb:914:9:914:16 | call to pop : [collection] [element] | provenance | | +| array_flow.rb:914:9:914:16 | call to pop : [collection] [element] | array_flow.rb:914:5:914:5 | b : [collection] [element] | provenance | | +| array_flow.rb:915:10:915:10 | b : [collection] [element] | array_flow.rb:915:10:915:13 | ...[...] | provenance | | +| array_flow.rb:916:10:916:10 | b : [collection] [element] | array_flow.rb:916:10:916:13 | ...[...] | provenance | | +| array_flow.rb:918:10:918:10 | a : Array [element 1] | array_flow.rb:918:10:918:13 | ...[...] | provenance | | +| array_flow.rb:920:10:920:10 | a : Array [element 3] | array_flow.rb:920:10:920:13 | ...[...] | provenance | | +| array_flow.rb:924:5:924:5 | a : Array [element 2] | array_flow.rb:925:5:925:5 | a : Array [element 2] | provenance | | +| array_flow.rb:924:9:924:28 | call to [] : Array [element 2] | array_flow.rb:924:5:924:5 | a : Array [element 2] | provenance | | +| array_flow.rb:924:16:924:27 | call to source | array_flow.rb:924:9:924:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:925:5:925:5 | [post] a : [collection] [element 2] | array_flow.rb:928:10:928:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:925:5:925:5 | [post] a : [collection] [element 5] | array_flow.rb:931:10:931:10 | a : [collection] [element 5] | provenance | | +| array_flow.rb:925:5:925:5 | a : Array [element 2] | array_flow.rb:925:5:925:5 | [post] a : [collection] [element 5] | provenance | | +| array_flow.rb:925:21:925:32 | call to source | array_flow.rb:925:5:925:5 | [post] a : [collection] [element 2] | provenance | | +| array_flow.rb:928:10:928:10 | a : [collection] [element 2] | array_flow.rb:928:10:928:13 | ...[...] | provenance | | +| array_flow.rb:931:10:931:10 | a : [collection] [element 5] | array_flow.rb:931:10:931:13 | ...[...] | provenance | | +| array_flow.rb:935:5:935:5 | a : Array [element 2] | array_flow.rb:938:9:938:9 | a : Array [element 2] | provenance | | +| array_flow.rb:935:9:935:28 | call to [] : Array [element 2] | array_flow.rb:935:5:935:5 | a : Array [element 2] | provenance | | +| array_flow.rb:935:16:935:27 | call to source | array_flow.rb:935:9:935:28 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:936:5:936:5 | b : Array [element 1] | array_flow.rb:938:19:938:19 | b : Array [element 1] | provenance | | +| array_flow.rb:936:9:936:28 | call to [] : Array [element 1] | array_flow.rb:936:5:936:5 | b : Array [element 1] | provenance | | +| array_flow.rb:936:13:936:24 | call to source | array_flow.rb:936:9:936:28 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:937:5:937:5 | c : Array [element 0] | array_flow.rb:938:22:938:22 | c : Array [element 0] | provenance | | +| array_flow.rb:937:9:937:28 | call to [] : Array [element 0] | array_flow.rb:937:5:937:5 | c : Array [element 0] | provenance | | +| array_flow.rb:937:10:937:21 | call to source | array_flow.rb:937:9:937:28 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:938:5:938:5 | d : [collection] [element, element] | array_flow.rb:939:10:939:10 | d : [collection] [element, element] | provenance | | +| array_flow.rb:938:5:938:5 | d : [collection] [element, element] | array_flow.rb:940:10:940:10 | d : [collection] [element, element] | provenance | | +| array_flow.rb:938:9:938:9 | a : Array [element 2] | array_flow.rb:938:9:938:22 | call to product : [collection] [element, element] | provenance | | +| array_flow.rb:938:9:938:22 | call to product : [collection] [element, element] | array_flow.rb:938:5:938:5 | d : [collection] [element, element] | provenance | | +| array_flow.rb:938:19:938:19 | b : Array [element 1] | array_flow.rb:938:9:938:22 | call to product : [collection] [element, element] | provenance | | +| array_flow.rb:938:22:938:22 | c : Array [element 0] | array_flow.rb:938:9:938:22 | call to product : [collection] [element, element] | provenance | | +| array_flow.rb:939:10:939:10 | d : [collection] [element, element] | array_flow.rb:939:10:939:13 | ...[...] [element] | provenance | | | array_flow.rb:939:10:939:13 | ...[...] [element] | array_flow.rb:939:10:939:16 | ...[...] | provenance | | -| array_flow.rb:940:10:940:10 | d [element, element] | array_flow.rb:940:10:940:13 | ...[...] [element] | provenance | | +| array_flow.rb:940:10:940:10 | d : [collection] [element, element] | array_flow.rb:940:10:940:13 | ...[...] [element] | provenance | | | array_flow.rb:940:10:940:13 | ...[...] [element] | array_flow.rb:940:10:940:16 | ...[...] | provenance | | -| array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:945:9:945:9 | a [element 0] | provenance | | -| array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:946:10:946:10 | a [element 0] | provenance | | -| array_flow.rb:944:9:944:25 | call to [] [element 0] | array_flow.rb:944:5:944:5 | a [element 0] | provenance | | -| array_flow.rb:944:10:944:21 | call to source | array_flow.rb:944:9:944:25 | call to [] [element 0] | provenance | | -| array_flow.rb:945:5:945:5 | b [element 0] | array_flow.rb:948:10:948:10 | b [element 0] | provenance | | -| array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:948:10:948:10 | b [element] | provenance | | -| array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:949:10:949:10 | b [element] | provenance | | -| array_flow.rb:945:9:945:9 | [post] a [element] | array_flow.rb:946:10:946:10 | a [element] | provenance | | -| array_flow.rb:945:9:945:9 | [post] a [element] | array_flow.rb:947:10:947:10 | a [element] | provenance | | -| array_flow.rb:945:9:945:9 | a [element 0] | array_flow.rb:945:9:945:44 | call to append [element 0] | provenance | | -| array_flow.rb:945:9:945:44 | call to append [element 0] | array_flow.rb:945:5:945:5 | b [element 0] | provenance | | -| array_flow.rb:945:9:945:44 | call to append [element] | array_flow.rb:945:5:945:5 | b [element] | provenance | | -| array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:9 | [post] a [element] | provenance | | -| array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:44 | call to append [element] | provenance | | -| array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:9 | [post] a [element] | provenance | | -| array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:44 | call to append [element] | provenance | | -| array_flow.rb:946:10:946:10 | a [element 0] | array_flow.rb:946:10:946:13 | ...[...] | provenance | | -| array_flow.rb:946:10:946:10 | a [element] | array_flow.rb:946:10:946:13 | ...[...] | provenance | | -| array_flow.rb:947:10:947:10 | a [element] | array_flow.rb:947:10:947:13 | ...[...] | provenance | | -| array_flow.rb:948:10:948:10 | b [element 0] | array_flow.rb:948:10:948:13 | ...[...] | provenance | | -| array_flow.rb:948:10:948:10 | b [element] | array_flow.rb:948:10:948:13 | ...[...] | provenance | | -| array_flow.rb:949:10:949:10 | b [element] | array_flow.rb:949:10:949:13 | ...[...] | provenance | | -| array_flow.rb:955:5:955:5 | c [element 0] | array_flow.rb:956:16:956:16 | c [element 0] | provenance | | -| array_flow.rb:955:9:955:25 | call to [] [element 0] | array_flow.rb:955:5:955:5 | c [element 0] | provenance | | -| array_flow.rb:955:10:955:19 | call to source | array_flow.rb:955:9:955:25 | call to [] [element 0] | provenance | | -| array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:957:10:957:10 | d [element 2, element 0] | provenance | | -| array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:958:10:958:10 | d [element 2, element 0] | provenance | | -| array_flow.rb:956:9:956:17 | call to [] [element 2, element 0] | array_flow.rb:956:5:956:5 | d [element 2, element 0] | provenance | | -| array_flow.rb:956:16:956:16 | c [element 0] | array_flow.rb:956:9:956:17 | call to [] [element 2, element 0] | provenance | | -| array_flow.rb:957:10:957:10 | d [element 2, element 0] | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | provenance | | +| array_flow.rb:944:5:944:5 | a : Array [element 0] | array_flow.rb:945:9:945:9 | a : Array [element 0] | provenance | | +| array_flow.rb:944:5:944:5 | a : Array [element 0] | array_flow.rb:946:10:946:10 | a : Array [element 0] | provenance | | +| array_flow.rb:944:9:944:25 | call to [] : Array [element 0] | array_flow.rb:944:5:944:5 | a : Array [element 0] | provenance | | +| array_flow.rb:944:10:944:21 | call to source | array_flow.rb:944:9:944:25 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:945:5:945:5 | b : Array [element 0] | array_flow.rb:948:10:948:10 | b : Array [element 0] | provenance | | +| array_flow.rb:945:5:945:5 | b : [collection] [element] | array_flow.rb:948:10:948:10 | b : [collection] [element] | provenance | | +| array_flow.rb:945:5:945:5 | b : [collection] [element] | array_flow.rb:949:10:949:10 | b : [collection] [element] | provenance | | +| array_flow.rb:945:9:945:9 | [post] a : [collection] [element] | array_flow.rb:946:10:946:10 | a : [collection] [element] | provenance | | +| array_flow.rb:945:9:945:9 | [post] a : [collection] [element] | array_flow.rb:947:10:947:10 | a : [collection] [element] | provenance | | +| array_flow.rb:945:9:945:9 | a : Array [element 0] | array_flow.rb:945:9:945:44 | call to append : Array [element 0] | provenance | | +| array_flow.rb:945:9:945:44 | call to append : Array [element 0] | array_flow.rb:945:5:945:5 | b : Array [element 0] | provenance | | +| array_flow.rb:945:9:945:44 | call to append : [collection] [element] | array_flow.rb:945:5:945:5 | b : [collection] [element] | provenance | | +| array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:44 | call to append : [collection] [element] | provenance | | +| array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:44 | call to append : [collection] [element] | provenance | | +| array_flow.rb:946:10:946:10 | a : Array [element 0] | array_flow.rb:946:10:946:13 | ...[...] | provenance | | +| array_flow.rb:946:10:946:10 | a : [collection] [element] | array_flow.rb:946:10:946:13 | ...[...] | provenance | | +| array_flow.rb:947:10:947:10 | a : [collection] [element] | array_flow.rb:947:10:947:13 | ...[...] | provenance | | +| array_flow.rb:948:10:948:10 | b : Array [element 0] | array_flow.rb:948:10:948:13 | ...[...] | provenance | | +| array_flow.rb:948:10:948:10 | b : [collection] [element] | array_flow.rb:948:10:948:13 | ...[...] | provenance | | +| array_flow.rb:949:10:949:10 | b : [collection] [element] | array_flow.rb:949:10:949:13 | ...[...] | provenance | | +| array_flow.rb:955:5:955:5 | c : Array [element 0] | array_flow.rb:956:16:956:16 | c : Array [element 0] | provenance | | +| array_flow.rb:955:9:955:25 | call to [] : Array [element 0] | array_flow.rb:955:5:955:5 | c : Array [element 0] | provenance | | +| array_flow.rb:955:10:955:19 | call to source | array_flow.rb:955:9:955:25 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:956:5:956:5 | d : Array [element 2, element 0] | array_flow.rb:957:10:957:10 | d : Array [element 2, element 0] | provenance | | +| array_flow.rb:956:5:956:5 | d : Array [element 2, element 0] | array_flow.rb:958:10:958:10 | d : Array [element 2, element 0] | provenance | | +| array_flow.rb:956:9:956:17 | call to [] : Array [element 2, element 0] | array_flow.rb:956:5:956:5 | d : Array [element 2, element 0] | provenance | | +| array_flow.rb:956:16:956:16 | c : Array [element 0] | array_flow.rb:956:9:956:17 | call to [] : Array [element 2, element 0] | provenance | | +| array_flow.rb:957:10:957:10 | d : Array [element 2, element 0] | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | provenance | | | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | array_flow.rb:957:10:957:25 | ...[...] | provenance | | -| array_flow.rb:958:10:958:10 | d [element 2, element 0] | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | provenance | | +| array_flow.rb:958:10:958:10 | d : Array [element 2, element 0] | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | provenance | | | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | array_flow.rb:958:10:958:25 | ...[...] | provenance | | -| array_flow.rb:962:5:962:5 | a [element 0] | array_flow.rb:963:9:963:9 | a [element 0] | provenance | | -| array_flow.rb:962:5:962:5 | a [element 0] | array_flow.rb:968:9:968:9 | a [element 0] | provenance | | -| array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:963:9:963:9 | a [element 2] | provenance | | -| array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:968:9:968:9 | a [element 2] | provenance | | -| array_flow.rb:962:9:962:39 | call to [] [element 0] | array_flow.rb:962:5:962:5 | a [element 0] | provenance | | -| array_flow.rb:962:9:962:39 | call to [] [element 2] | array_flow.rb:962:5:962:5 | a [element 2] | provenance | | -| array_flow.rb:962:10:962:21 | call to source | array_flow.rb:962:9:962:39 | call to [] [element 0] | provenance | | -| array_flow.rb:962:27:962:38 | call to source | array_flow.rb:962:9:962:39 | call to [] [element 2] | provenance | | -| array_flow.rb:963:9:963:9 | a [element 0] | array_flow.rb:963:22:963:22 | x | provenance | | -| array_flow.rb:963:9:963:9 | a [element 2] | array_flow.rb:963:25:963:25 | y | provenance | | +| array_flow.rb:962:5:962:5 | a : Array [element 0] | array_flow.rb:963:9:963:9 | a : Array [element 0] | provenance | | +| array_flow.rb:962:5:962:5 | a : Array [element 0] | array_flow.rb:968:9:968:9 | a : Array [element 0] | provenance | | +| array_flow.rb:962:5:962:5 | a : Array [element 2] | array_flow.rb:963:9:963:9 | a : Array [element 2] | provenance | | +| array_flow.rb:962:5:962:5 | a : Array [element 2] | array_flow.rb:968:9:968:9 | a : Array [element 2] | provenance | | +| array_flow.rb:962:9:962:39 | call to [] : Array [element 0] | array_flow.rb:962:5:962:5 | a : Array [element 0] | provenance | | +| array_flow.rb:962:9:962:39 | call to [] : Array [element 2] | array_flow.rb:962:5:962:5 | a : Array [element 2] | provenance | | +| array_flow.rb:962:10:962:21 | call to source | array_flow.rb:962:9:962:39 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:962:27:962:38 | call to source | array_flow.rb:962:9:962:39 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:963:9:963:9 | a : Array [element 0] | array_flow.rb:963:22:963:22 | x | provenance | | +| array_flow.rb:963:9:963:9 | a : Array [element 2] | array_flow.rb:963:25:963:25 | y | provenance | | | array_flow.rb:963:22:963:22 | x | array_flow.rb:964:14:964:14 | x | provenance | | | array_flow.rb:963:25:963:25 | y | array_flow.rb:965:14:965:14 | y | provenance | | -| array_flow.rb:968:9:968:9 | a [element 0] | array_flow.rb:968:28:968:28 | y | provenance | | -| array_flow.rb:968:9:968:9 | a [element 2] | array_flow.rb:968:28:968:28 | y | provenance | | +| array_flow.rb:968:9:968:9 | a : Array [element 0] | array_flow.rb:968:28:968:28 | y | provenance | | +| array_flow.rb:968:9:968:9 | a : Array [element 2] | array_flow.rb:968:28:968:28 | y | provenance | | | array_flow.rb:968:28:968:28 | y | array_flow.rb:970:14:970:14 | y | provenance | | -| array_flow.rb:976:5:976:5 | a [element 2] | array_flow.rb:977:9:977:9 | a [element 2] | provenance | | -| array_flow.rb:976:9:976:26 | call to [] [element 2] | array_flow.rb:976:5:976:5 | a [element 2] | provenance | | -| array_flow.rb:976:16:976:25 | call to source | array_flow.rb:976:9:976:26 | call to [] [element 2] | provenance | | -| array_flow.rb:977:5:977:5 | b [element] | array_flow.rb:981:10:981:10 | b [element] | provenance | | -| array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:9:980:7 | call to reject [element] | provenance | | -| array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:22:977:22 | x | provenance | | -| array_flow.rb:977:9:980:7 | call to reject [element] | array_flow.rb:977:5:977:5 | b [element] | provenance | | +| array_flow.rb:976:5:976:5 | a : Array [element 2] | array_flow.rb:977:9:977:9 | a : Array [element 2] | provenance | | +| array_flow.rb:976:9:976:26 | call to [] : Array [element 2] | array_flow.rb:976:5:976:5 | a : Array [element 2] | provenance | | +| array_flow.rb:976:16:976:25 | call to source | array_flow.rb:976:9:976:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:977:5:977:5 | b : [collection] [element] | array_flow.rb:981:10:981:10 | b : [collection] [element] | provenance | | +| array_flow.rb:977:9:977:9 | a : Array [element 2] | array_flow.rb:977:9:980:7 | call to reject : [collection] [element] | provenance | | +| array_flow.rb:977:9:977:9 | a : Array [element 2] | array_flow.rb:977:22:977:22 | x | provenance | | +| array_flow.rb:977:9:980:7 | call to reject : [collection] [element] | array_flow.rb:977:5:977:5 | b : [collection] [element] | provenance | | | array_flow.rb:977:22:977:22 | x | array_flow.rb:978:14:978:14 | x | provenance | | -| array_flow.rb:981:10:981:10 | b [element] | array_flow.rb:981:10:981:13 | ...[...] | provenance | | -| array_flow.rb:985:5:985:5 | a [element 2] | array_flow.rb:986:9:986:9 | a [element 2] | provenance | | -| array_flow.rb:985:9:985:26 | call to [] [element 2] | array_flow.rb:985:5:985:5 | a [element 2] | provenance | | -| array_flow.rb:985:16:985:25 | call to source | array_flow.rb:985:9:985:26 | call to [] [element 2] | provenance | | -| array_flow.rb:986:5:986:5 | b [element] | array_flow.rb:991:10:991:10 | b [element] | provenance | | -| array_flow.rb:986:9:986:9 | [post] a [element] | array_flow.rb:990:10:990:10 | a [element] | provenance | | -| array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:9:986:9 | [post] a [element] | provenance | | -| array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:9:989:7 | call to reject! [element] | provenance | | -| array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:23:986:23 | x | provenance | | -| array_flow.rb:986:9:989:7 | call to reject! [element] | array_flow.rb:986:5:986:5 | b [element] | provenance | | +| array_flow.rb:981:10:981:10 | b : [collection] [element] | array_flow.rb:981:10:981:13 | ...[...] | provenance | | +| array_flow.rb:985:5:985:5 | a : Array [element 2] | array_flow.rb:986:9:986:9 | a : Array [element 2] | provenance | | +| array_flow.rb:985:9:985:26 | call to [] : Array [element 2] | array_flow.rb:985:5:985:5 | a : Array [element 2] | provenance | | +| array_flow.rb:985:16:985:25 | call to source | array_flow.rb:985:9:985:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:986:5:986:5 | b : [collection] [element] | array_flow.rb:991:10:991:10 | b : [collection] [element] | provenance | | +| array_flow.rb:986:9:986:9 | [post] a : [collection] [element] | array_flow.rb:990:10:990:10 | a : [collection] [element] | provenance | | +| array_flow.rb:986:9:986:9 | a : Array [element 2] | array_flow.rb:986:9:986:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:986:9:986:9 | a : Array [element 2] | array_flow.rb:986:9:989:7 | call to reject! : [collection] [element] | provenance | | +| array_flow.rb:986:9:986:9 | a : Array [element 2] | array_flow.rb:986:23:986:23 | x | provenance | | +| array_flow.rb:986:9:989:7 | call to reject! : [collection] [element] | array_flow.rb:986:5:986:5 | b : [collection] [element] | provenance | | | array_flow.rb:986:23:986:23 | x | array_flow.rb:987:14:987:14 | x | provenance | | -| array_flow.rb:990:10:990:10 | a [element] | array_flow.rb:990:10:990:13 | ...[...] | provenance | | -| array_flow.rb:991:10:991:10 | b [element] | array_flow.rb:991:10:991:13 | ...[...] | provenance | | -| array_flow.rb:995:5:995:5 | a [element 2] | array_flow.rb:996:9:996:9 | a [element 2] | provenance | | -| array_flow.rb:995:9:995:26 | call to [] [element 2] | array_flow.rb:995:5:995:5 | a [element 2] | provenance | | -| array_flow.rb:995:16:995:25 | call to source | array_flow.rb:995:9:995:26 | call to [] [element 2] | provenance | | -| array_flow.rb:996:5:996:5 | b [element 2] | array_flow.rb:1001:10:1001:10 | b [element 2] | provenance | | -| array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | provenance | | -| array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:39:996:39 | x [element] | provenance | | -| array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | array_flow.rb:996:5:996:5 | b [element 2] | provenance | | -| array_flow.rb:996:39:996:39 | x [element] | array_flow.rb:997:14:997:14 | x [element] | provenance | | -| array_flow.rb:996:39:996:39 | x [element] | array_flow.rb:998:14:998:14 | x [element] | provenance | | -| array_flow.rb:997:14:997:14 | x [element] | array_flow.rb:997:14:997:17 | ...[...] | provenance | | -| array_flow.rb:998:14:998:14 | x [element] | array_flow.rb:998:14:998:17 | ...[...] | provenance | | -| array_flow.rb:1001:10:1001:10 | b [element 2] | array_flow.rb:1001:10:1001:13 | ...[...] | provenance | | -| array_flow.rb:1005:5:1005:5 | a [element 2] | array_flow.rb:1006:9:1006:9 | a [element 2] | provenance | | -| array_flow.rb:1005:9:1005:26 | call to [] [element 2] | array_flow.rb:1005:5:1005:5 | a [element 2] | provenance | | -| array_flow.rb:1005:16:1005:25 | call to source | array_flow.rb:1005:9:1005:26 | call to [] [element 2] | provenance | | -| array_flow.rb:1006:5:1006:5 | b [element 2] | array_flow.rb:1011:10:1011:10 | b [element 2] | provenance | | -| array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | provenance | | -| array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:39:1006:39 | x [element] | provenance | | -| array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | array_flow.rb:1006:5:1006:5 | b [element 2] | provenance | | -| array_flow.rb:1006:39:1006:39 | x [element] | array_flow.rb:1007:14:1007:14 | x [element] | provenance | | -| array_flow.rb:1006:39:1006:39 | x [element] | array_flow.rb:1008:14:1008:14 | x [element] | provenance | | -| array_flow.rb:1007:14:1007:14 | x [element] | array_flow.rb:1007:14:1007:17 | ...[...] | provenance | | -| array_flow.rb:1008:14:1008:14 | x [element] | array_flow.rb:1008:14:1008:17 | ...[...] | provenance | | -| array_flow.rb:1011:10:1011:10 | b [element 2] | array_flow.rb:1011:10:1011:13 | ...[...] | provenance | | -| array_flow.rb:1017:5:1017:5 | b [element 0] | array_flow.rb:1019:10:1019:10 | b [element 0] | provenance | | -| array_flow.rb:1017:9:1017:9 | [post] a [element 0] | array_flow.rb:1018:10:1018:10 | a [element 0] | provenance | | -| array_flow.rb:1017:9:1017:33 | call to replace [element 0] | array_flow.rb:1017:5:1017:5 | b [element 0] | provenance | | -| array_flow.rb:1017:19:1017:32 | call to [] [element 0] | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | provenance | | -| array_flow.rb:1017:19:1017:32 | call to [] [element 0] | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | provenance | | -| array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:19:1017:32 | call to [] [element 0] | provenance | | -| array_flow.rb:1018:10:1018:10 | a [element 0] | array_flow.rb:1018:10:1018:13 | ...[...] | provenance | | -| array_flow.rb:1019:10:1019:10 | b [element 0] | array_flow.rb:1019:10:1019:13 | ...[...] | provenance | | -| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1024:9:1024:9 | a [element 2] | provenance | | -| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1029:10:1029:10 | a [element 2] | provenance | | -| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1024:9:1024:9 | a [element 3] | provenance | | -| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1030:10:1030:10 | a [element 3] | provenance | | -| array_flow.rb:1023:9:1023:44 | call to [] [element 2] | array_flow.rb:1023:5:1023:5 | a [element 2] | provenance | | -| array_flow.rb:1023:9:1023:44 | call to [] [element 3] | array_flow.rb:1023:5:1023:5 | a [element 3] | provenance | | -| array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:9:1023:44 | call to [] [element 2] | provenance | | -| array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:9:1023:44 | call to [] [element 3] | provenance | | -| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1025:10:1025:10 | b [element] | provenance | | -| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1026:10:1026:10 | b [element] | provenance | | -| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1027:10:1027:10 | b [element] | provenance | | -| array_flow.rb:1024:9:1024:9 | a [element 2] | array_flow.rb:1024:9:1024:17 | call to reverse [element] | provenance | | -| array_flow.rb:1024:9:1024:9 | a [element 3] | array_flow.rb:1024:9:1024:17 | call to reverse [element] | provenance | | -| array_flow.rb:1024:9:1024:17 | call to reverse [element] | array_flow.rb:1024:5:1024:5 | b [element] | provenance | | -| array_flow.rb:1025:10:1025:10 | b [element] | array_flow.rb:1025:10:1025:13 | ...[...] | provenance | | -| array_flow.rb:1026:10:1026:10 | b [element] | array_flow.rb:1026:10:1026:13 | ...[...] | provenance | | -| array_flow.rb:1027:10:1027:10 | b [element] | array_flow.rb:1027:10:1027:13 | ...[...] | provenance | | -| array_flow.rb:1029:10:1029:10 | a [element 2] | array_flow.rb:1029:10:1029:13 | ...[...] | provenance | | -| array_flow.rb:1030:10:1030:10 | a [element 3] | array_flow.rb:1030:10:1030:13 | ...[...] | provenance | | -| array_flow.rb:1034:5:1034:5 | a [element 2] | array_flow.rb:1035:9:1035:9 | a [element 2] | provenance | | -| array_flow.rb:1034:5:1034:5 | a [element 2] | array_flow.rb:1040:10:1040:10 | a [element 2] | provenance | | -| array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1035:9:1035:9 | a [element 3] | provenance | | -| array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1041:10:1041:10 | a [element 3] | provenance | | -| array_flow.rb:1034:9:1034:44 | call to [] [element 2] | array_flow.rb:1034:5:1034:5 | a [element 2] | provenance | | -| array_flow.rb:1034:9:1034:44 | call to [] [element 3] | array_flow.rb:1034:5:1034:5 | a [element 3] | provenance | | -| array_flow.rb:1034:16:1034:28 | call to source | array_flow.rb:1034:9:1034:44 | call to [] [element 2] | provenance | | -| array_flow.rb:1034:31:1034:43 | call to source | array_flow.rb:1034:9:1034:44 | call to [] [element 3] | provenance | | -| array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1036:10:1036:10 | b [element] | provenance | | -| array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1037:10:1037:10 | b [element] | provenance | | -| array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1038:10:1038:10 | b [element] | provenance | | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1039:10:1039:10 | a [element] | provenance | | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1040:10:1040:10 | a [element] | provenance | | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1041:10:1041:10 | a [element] | provenance | | -| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1035:9 | [post] a [element] | provenance | | -| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | provenance | | -| array_flow.rb:1035:9:1035:9 | a [element 3] | array_flow.rb:1035:9:1035:9 | [post] a [element] | provenance | | -| array_flow.rb:1035:9:1035:9 | a [element 3] | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | provenance | | -| array_flow.rb:1035:9:1035:18 | call to reverse! [element] | array_flow.rb:1035:5:1035:5 | b [element] | provenance | | -| array_flow.rb:1036:10:1036:10 | b [element] | array_flow.rb:1036:10:1036:13 | ...[...] | provenance | | -| array_flow.rb:1037:10:1037:10 | b [element] | array_flow.rb:1037:10:1037:13 | ...[...] | provenance | | -| array_flow.rb:1038:10:1038:10 | b [element] | array_flow.rb:1038:10:1038:13 | ...[...] | provenance | | -| array_flow.rb:1039:10:1039:10 | a [element] | array_flow.rb:1039:10:1039:13 | ...[...] | provenance | | -| array_flow.rb:1040:10:1040:10 | a [element 2] | array_flow.rb:1040:10:1040:13 | ...[...] | provenance | | -| array_flow.rb:1040:10:1040:10 | a [element] | array_flow.rb:1040:10:1040:13 | ...[...] | provenance | | -| array_flow.rb:1041:10:1041:10 | a [element 3] | array_flow.rb:1041:10:1041:13 | ...[...] | provenance | | -| array_flow.rb:1041:10:1041:10 | a [element] | array_flow.rb:1041:10:1041:13 | ...[...] | provenance | | -| array_flow.rb:1045:5:1045:5 | a [element 2] | array_flow.rb:1046:9:1046:9 | a [element 2] | provenance | | -| array_flow.rb:1045:9:1045:27 | call to [] [element 2] | array_flow.rb:1045:5:1045:5 | a [element 2] | provenance | | -| array_flow.rb:1045:16:1045:26 | call to source | array_flow.rb:1045:9:1045:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1046:5:1046:5 | b [element 2] | array_flow.rb:1049:10:1049:10 | b [element 2] | provenance | | -| array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | provenance | | -| array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:28:1046:28 | x | provenance | | -| array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | array_flow.rb:1046:5:1046:5 | b [element 2] | provenance | | +| array_flow.rb:990:10:990:10 | a : [collection] [element] | array_flow.rb:990:10:990:13 | ...[...] | provenance | | +| array_flow.rb:991:10:991:10 | b : [collection] [element] | array_flow.rb:991:10:991:13 | ...[...] | provenance | | +| array_flow.rb:995:5:995:5 | a : Array [element 2] | array_flow.rb:996:9:996:9 | a : Array [element 2] | provenance | | +| array_flow.rb:995:9:995:26 | call to [] : Array [element 2] | array_flow.rb:995:5:995:5 | a : Array [element 2] | provenance | | +| array_flow.rb:995:16:995:25 | call to source | array_flow.rb:995:9:995:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:996:5:996:5 | b : Array [element 2] | array_flow.rb:1001:10:1001:10 | b : Array [element 2] | provenance | | +| array_flow.rb:996:9:996:9 | a : Array [element 2] | array_flow.rb:996:9:999:7 | call to repeated_combination : Array [element 2] | provenance | | +| array_flow.rb:996:9:996:9 | a : Array [element 2] | array_flow.rb:996:39:996:39 | x : [collection] [element] | provenance | | +| array_flow.rb:996:9:999:7 | call to repeated_combination : Array [element 2] | array_flow.rb:996:5:996:5 | b : Array [element 2] | provenance | | +| array_flow.rb:996:39:996:39 | x : [collection] [element] | array_flow.rb:997:14:997:14 | x : [collection] [element] | provenance | | +| array_flow.rb:996:39:996:39 | x : [collection] [element] | array_flow.rb:998:14:998:14 | x : [collection] [element] | provenance | | +| array_flow.rb:997:14:997:14 | x : [collection] [element] | array_flow.rb:997:14:997:17 | ...[...] | provenance | | +| array_flow.rb:998:14:998:14 | x : [collection] [element] | array_flow.rb:998:14:998:17 | ...[...] | provenance | | +| array_flow.rb:1001:10:1001:10 | b : Array [element 2] | array_flow.rb:1001:10:1001:13 | ...[...] | provenance | | +| array_flow.rb:1005:5:1005:5 | a : Array [element 2] | array_flow.rb:1006:9:1006:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1005:9:1005:26 | call to [] : Array [element 2] | array_flow.rb:1005:5:1005:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1005:16:1005:25 | call to source | array_flow.rb:1005:9:1005:26 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1006:5:1006:5 | b : Array [element 2] | array_flow.rb:1011:10:1011:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1006:9:1006:9 | a : Array [element 2] | array_flow.rb:1006:9:1009:7 | call to repeated_permutation : Array [element 2] | provenance | | +| array_flow.rb:1006:9:1006:9 | a : Array [element 2] | array_flow.rb:1006:39:1006:39 | x : [collection] [element] | provenance | | +| array_flow.rb:1006:9:1009:7 | call to repeated_permutation : Array [element 2] | array_flow.rb:1006:5:1006:5 | b : Array [element 2] | provenance | | +| array_flow.rb:1006:39:1006:39 | x : [collection] [element] | array_flow.rb:1007:14:1007:14 | x : [collection] [element] | provenance | | +| array_flow.rb:1006:39:1006:39 | x : [collection] [element] | array_flow.rb:1008:14:1008:14 | x : [collection] [element] | provenance | | +| array_flow.rb:1007:14:1007:14 | x : [collection] [element] | array_flow.rb:1007:14:1007:17 | ...[...] | provenance | | +| array_flow.rb:1008:14:1008:14 | x : [collection] [element] | array_flow.rb:1008:14:1008:17 | ...[...] | provenance | | +| array_flow.rb:1011:10:1011:10 | b : Array [element 2] | array_flow.rb:1011:10:1011:13 | ...[...] | provenance | | +| array_flow.rb:1017:5:1017:5 | b : Array [element 0] | array_flow.rb:1019:10:1019:10 | b : Array [element 0] | provenance | | +| array_flow.rb:1017:9:1017:9 | [post] a : Array [element 0] | array_flow.rb:1018:10:1018:10 | a : Array [element 0] | provenance | | +| array_flow.rb:1017:9:1017:33 | call to replace : Array [element 0] | array_flow.rb:1017:5:1017:5 | b : Array [element 0] | provenance | | +| array_flow.rb:1017:19:1017:32 | call to [] : Array [element 0] | array_flow.rb:1017:9:1017:9 | [post] a : Array [element 0] | provenance | | +| array_flow.rb:1017:19:1017:32 | call to [] : Array [element 0] | array_flow.rb:1017:9:1017:33 | call to replace : Array [element 0] | provenance | | +| array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:19:1017:32 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1018:10:1018:10 | a : Array [element 0] | array_flow.rb:1018:10:1018:13 | ...[...] | provenance | | +| array_flow.rb:1019:10:1019:10 | b : Array [element 0] | array_flow.rb:1019:10:1019:13 | ...[...] | provenance | | +| array_flow.rb:1023:5:1023:5 | a : Array [element 2] | array_flow.rb:1024:9:1024:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1023:5:1023:5 | a : Array [element 2] | array_flow.rb:1029:10:1029:10 | a : Array [element 2] | provenance | | +| array_flow.rb:1023:5:1023:5 | a : Array [element 3] | array_flow.rb:1024:9:1024:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1023:5:1023:5 | a : Array [element 3] | array_flow.rb:1030:10:1030:10 | a : Array [element 3] | provenance | | +| array_flow.rb:1023:9:1023:44 | call to [] : Array [element 2] | array_flow.rb:1023:5:1023:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1023:9:1023:44 | call to [] : Array [element 3] | array_flow.rb:1023:5:1023:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:9:1023:44 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:9:1023:44 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1024:5:1024:5 | b : [collection] [element] | array_flow.rb:1025:10:1025:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1024:5:1024:5 | b : [collection] [element] | array_flow.rb:1026:10:1026:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1024:5:1024:5 | b : [collection] [element] | array_flow.rb:1027:10:1027:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1024:9:1024:9 | a : Array [element 2] | array_flow.rb:1024:9:1024:17 | call to reverse : [collection] [element] | provenance | | +| array_flow.rb:1024:9:1024:9 | a : Array [element 3] | array_flow.rb:1024:9:1024:17 | call to reverse : [collection] [element] | provenance | | +| array_flow.rb:1024:9:1024:17 | call to reverse : [collection] [element] | array_flow.rb:1024:5:1024:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1025:10:1025:10 | b : [collection] [element] | array_flow.rb:1025:10:1025:13 | ...[...] | provenance | | +| array_flow.rb:1026:10:1026:10 | b : [collection] [element] | array_flow.rb:1026:10:1026:13 | ...[...] | provenance | | +| array_flow.rb:1027:10:1027:10 | b : [collection] [element] | array_flow.rb:1027:10:1027:13 | ...[...] | provenance | | +| array_flow.rb:1029:10:1029:10 | a : Array [element 2] | array_flow.rb:1029:10:1029:13 | ...[...] | provenance | | +| array_flow.rb:1030:10:1030:10 | a : Array [element 3] | array_flow.rb:1030:10:1030:13 | ...[...] | provenance | | +| array_flow.rb:1034:5:1034:5 | a : Array [element 2] | array_flow.rb:1035:9:1035:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1034:5:1034:5 | a : Array [element 2] | array_flow.rb:1040:10:1040:10 | a : Array [element 2] | provenance | | +| array_flow.rb:1034:5:1034:5 | a : Array [element 3] | array_flow.rb:1035:9:1035:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1034:5:1034:5 | a : Array [element 3] | array_flow.rb:1041:10:1041:10 | a : Array [element 3] | provenance | | +| array_flow.rb:1034:9:1034:44 | call to [] : Array [element 2] | array_flow.rb:1034:5:1034:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1034:9:1034:44 | call to [] : Array [element 3] | array_flow.rb:1034:5:1034:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1034:16:1034:28 | call to source | array_flow.rb:1034:9:1034:44 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1034:31:1034:43 | call to source | array_flow.rb:1034:9:1034:44 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1035:5:1035:5 | b : [collection] [element] | array_flow.rb:1036:10:1036:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1035:5:1035:5 | b : [collection] [element] | array_flow.rb:1037:10:1037:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1035:5:1035:5 | b : [collection] [element] | array_flow.rb:1038:10:1038:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:9 | [post] a : [collection] [element] | array_flow.rb:1039:10:1039:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:9 | [post] a : [collection] [element] | array_flow.rb:1040:10:1040:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:9 | [post] a : [collection] [element] | array_flow.rb:1041:10:1041:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:9 | a : Array [element 2] | array_flow.rb:1035:9:1035:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:9 | a : Array [element 2] | array_flow.rb:1035:9:1035:18 | call to reverse! : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:9 | a : Array [element 3] | array_flow.rb:1035:9:1035:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:9 | a : Array [element 3] | array_flow.rb:1035:9:1035:18 | call to reverse! : [collection] [element] | provenance | | +| array_flow.rb:1035:9:1035:18 | call to reverse! : [collection] [element] | array_flow.rb:1035:5:1035:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1036:10:1036:10 | b : [collection] [element] | array_flow.rb:1036:10:1036:13 | ...[...] | provenance | | +| array_flow.rb:1037:10:1037:10 | b : [collection] [element] | array_flow.rb:1037:10:1037:13 | ...[...] | provenance | | +| array_flow.rb:1038:10:1038:10 | b : [collection] [element] | array_flow.rb:1038:10:1038:13 | ...[...] | provenance | | +| array_flow.rb:1039:10:1039:10 | a : [collection] [element] | array_flow.rb:1039:10:1039:13 | ...[...] | provenance | | +| array_flow.rb:1040:10:1040:10 | a : Array [element 2] | array_flow.rb:1040:10:1040:13 | ...[...] | provenance | | +| array_flow.rb:1040:10:1040:10 | a : [collection] [element] | array_flow.rb:1040:10:1040:13 | ...[...] | provenance | | +| array_flow.rb:1041:10:1041:10 | a : Array [element 3] | array_flow.rb:1041:10:1041:13 | ...[...] | provenance | | +| array_flow.rb:1041:10:1041:10 | a : [collection] [element] | array_flow.rb:1041:10:1041:13 | ...[...] | provenance | | +| array_flow.rb:1045:5:1045:5 | a : Array [element 2] | array_flow.rb:1046:9:1046:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1045:9:1045:27 | call to [] : Array [element 2] | array_flow.rb:1045:5:1045:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1045:16:1045:26 | call to source | array_flow.rb:1045:9:1045:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1046:5:1046:5 | b : Array [element 2] | array_flow.rb:1049:10:1049:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1046:9:1046:9 | a : Array [element 2] | array_flow.rb:1046:9:1048:7 | call to reverse_each : Array [element 2] | provenance | | +| array_flow.rb:1046:9:1046:9 | a : Array [element 2] | array_flow.rb:1046:28:1046:28 | x | provenance | | +| array_flow.rb:1046:9:1048:7 | call to reverse_each : Array [element 2] | array_flow.rb:1046:5:1046:5 | b : Array [element 2] | provenance | | | array_flow.rb:1046:28:1046:28 | x | array_flow.rb:1047:14:1047:14 | x | provenance | | -| array_flow.rb:1049:10:1049:10 | b [element 2] | array_flow.rb:1049:10:1049:13 | ...[...] | provenance | | -| array_flow.rb:1053:5:1053:5 | a [element 2] | array_flow.rb:1054:5:1054:5 | a [element 2] | provenance | | -| array_flow.rb:1053:9:1053:27 | call to [] [element 2] | array_flow.rb:1053:5:1053:5 | a [element 2] | provenance | | -| array_flow.rb:1053:16:1053:26 | call to source | array_flow.rb:1053:9:1053:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1054:5:1054:5 | a [element 2] | array_flow.rb:1054:18:1054:18 | x | provenance | | +| array_flow.rb:1049:10:1049:10 | b : Array [element 2] | array_flow.rb:1049:10:1049:13 | ...[...] | provenance | | +| array_flow.rb:1053:5:1053:5 | a : Array [element 2] | array_flow.rb:1054:5:1054:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1053:9:1053:27 | call to [] : Array [element 2] | array_flow.rb:1053:5:1053:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1053:16:1053:26 | call to source | array_flow.rb:1053:9:1053:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1054:5:1054:5 | a : Array [element 2] | array_flow.rb:1054:18:1054:18 | x | provenance | | | array_flow.rb:1054:18:1054:18 | x | array_flow.rb:1055:14:1055:14 | x | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1065:9:1065:9 | a [element 0] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1071:9:1071:9 | a [element 0] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1077:9:1077:9 | a [element 0] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1083:9:1083:9 | a [element 0] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1065:9:1065:9 | a [element 2] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1071:9:1071:9 | a [element 2] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1077:9:1077:9 | a [element 2] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1083:9:1083:9 | a [element 2] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1065:9:1065:9 | a [element 3] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1071:9:1071:9 | a [element 3] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1077:9:1077:9 | a [element 3] | provenance | | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1083:9:1083:9 | a [element 3] | provenance | | -| array_flow.rb:1063:9:1063:56 | call to [] [element 0] | array_flow.rb:1063:5:1063:5 | a [element 0] | provenance | | -| array_flow.rb:1063:9:1063:56 | call to [] [element 2] | array_flow.rb:1063:5:1063:5 | a [element 2] | provenance | | -| array_flow.rb:1063:9:1063:56 | call to [] [element 3] | array_flow.rb:1063:5:1063:5 | a [element 3] | provenance | | -| array_flow.rb:1063:10:1063:22 | call to source | array_flow.rb:1063:9:1063:56 | call to [] [element 0] | provenance | | -| array_flow.rb:1063:28:1063:40 | call to source | array_flow.rb:1063:9:1063:56 | call to [] [element 2] | provenance | | -| array_flow.rb:1063:43:1063:55 | call to source | array_flow.rb:1063:9:1063:56 | call to [] [element 3] | provenance | | -| array_flow.rb:1065:5:1065:5 | b [element 1] | array_flow.rb:1067:10:1067:10 | b [element 1] | provenance | | -| array_flow.rb:1065:5:1065:5 | b [element 2] | array_flow.rb:1068:10:1068:10 | b [element 2] | provenance | | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1066:10:1066:10 | b [element] | provenance | | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1067:10:1067:10 | b [element] | provenance | | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1068:10:1068:10 | b [element] | provenance | | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1069:10:1069:10 | b [element] | provenance | | -| array_flow.rb:1065:9:1065:9 | a [element 0] | array_flow.rb:1065:9:1065:16 | call to rotate [element] | provenance | | -| array_flow.rb:1065:9:1065:9 | a [element 2] | array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | provenance | | -| array_flow.rb:1065:9:1065:9 | a [element 3] | array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | provenance | | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | array_flow.rb:1065:5:1065:5 | b [element 1] | provenance | | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | array_flow.rb:1065:5:1065:5 | b [element 2] | provenance | | -| array_flow.rb:1065:9:1065:16 | call to rotate [element] | array_flow.rb:1065:5:1065:5 | b [element] | provenance | | -| array_flow.rb:1066:10:1066:10 | b [element] | array_flow.rb:1066:10:1066:13 | ...[...] | provenance | | -| array_flow.rb:1067:10:1067:10 | b [element 1] | array_flow.rb:1067:10:1067:13 | ...[...] | provenance | | -| array_flow.rb:1067:10:1067:10 | b [element] | array_flow.rb:1067:10:1067:13 | ...[...] | provenance | | -| array_flow.rb:1068:10:1068:10 | b [element 2] | array_flow.rb:1068:10:1068:13 | ...[...] | provenance | | -| array_flow.rb:1068:10:1068:10 | b [element] | array_flow.rb:1068:10:1068:13 | ...[...] | provenance | | -| array_flow.rb:1069:10:1069:10 | b [element] | array_flow.rb:1069:10:1069:13 | ...[...] | provenance | | -| array_flow.rb:1071:5:1071:5 | b [element 0] | array_flow.rb:1072:10:1072:10 | b [element 0] | provenance | | -| array_flow.rb:1071:5:1071:5 | b [element 1] | array_flow.rb:1073:10:1073:10 | b [element 1] | provenance | | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1072:10:1072:10 | b [element] | provenance | | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1073:10:1073:10 | b [element] | provenance | | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1074:10:1074:10 | b [element] | provenance | | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1075:10:1075:10 | b [element] | provenance | | -| array_flow.rb:1071:9:1071:9 | a [element 0] | array_flow.rb:1071:9:1071:19 | call to rotate [element] | provenance | | -| array_flow.rb:1071:9:1071:9 | a [element 2] | array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | provenance | | -| array_flow.rb:1071:9:1071:9 | a [element 3] | array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | provenance | | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | array_flow.rb:1071:5:1071:5 | b [element 0] | provenance | | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | array_flow.rb:1071:5:1071:5 | b [element 1] | provenance | | -| array_flow.rb:1071:9:1071:19 | call to rotate [element] | array_flow.rb:1071:5:1071:5 | b [element] | provenance | | -| array_flow.rb:1072:10:1072:10 | b [element 0] | array_flow.rb:1072:10:1072:13 | ...[...] | provenance | | -| array_flow.rb:1072:10:1072:10 | b [element] | array_flow.rb:1072:10:1072:13 | ...[...] | provenance | | -| array_flow.rb:1073:10:1073:10 | b [element 1] | array_flow.rb:1073:10:1073:13 | ...[...] | provenance | | -| array_flow.rb:1073:10:1073:10 | b [element] | array_flow.rb:1073:10:1073:13 | ...[...] | provenance | | -| array_flow.rb:1074:10:1074:10 | b [element] | array_flow.rb:1074:10:1074:13 | ...[...] | provenance | | -| array_flow.rb:1075:10:1075:10 | b [element] | array_flow.rb:1075:10:1075:13 | ...[...] | provenance | | -| array_flow.rb:1077:5:1077:5 | b [element 0] | array_flow.rb:1078:10:1078:10 | b [element 0] | provenance | | -| array_flow.rb:1077:5:1077:5 | b [element 2] | array_flow.rb:1080:10:1080:10 | b [element 2] | provenance | | -| array_flow.rb:1077:5:1077:5 | b [element 3] | array_flow.rb:1081:10:1081:10 | b [element 3] | provenance | | -| array_flow.rb:1077:9:1077:9 | a [element 0] | array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | provenance | | -| array_flow.rb:1077:9:1077:9 | a [element 2] | array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | provenance | | -| array_flow.rb:1077:9:1077:9 | a [element 3] | array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | provenance | | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | array_flow.rb:1077:5:1077:5 | b [element 0] | provenance | | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | array_flow.rb:1077:5:1077:5 | b [element 2] | provenance | | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | array_flow.rb:1077:5:1077:5 | b [element 3] | provenance | | -| array_flow.rb:1078:10:1078:10 | b [element 0] | array_flow.rb:1078:10:1078:13 | ...[...] | provenance | | -| array_flow.rb:1080:10:1080:10 | b [element 2] | array_flow.rb:1080:10:1080:13 | ...[...] | provenance | | -| array_flow.rb:1081:10:1081:10 | b [element 3] | array_flow.rb:1081:10:1081:13 | ...[...] | provenance | | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1084:10:1084:10 | b [element] | provenance | | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1085:10:1085:10 | b [element] | provenance | | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1086:10:1086:10 | b [element] | provenance | | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1087:10:1087:10 | b [element] | provenance | | -| array_flow.rb:1083:9:1083:9 | a [element 0] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | provenance | | -| array_flow.rb:1083:9:1083:9 | a [element 2] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | provenance | | -| array_flow.rb:1083:9:1083:9 | a [element 3] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | provenance | | -| array_flow.rb:1083:9:1083:19 | call to rotate [element] | array_flow.rb:1083:5:1083:5 | b [element] | provenance | | -| array_flow.rb:1084:10:1084:10 | b [element] | array_flow.rb:1084:10:1084:13 | ...[...] | provenance | | -| array_flow.rb:1085:10:1085:10 | b [element] | array_flow.rb:1085:10:1085:13 | ...[...] | provenance | | -| array_flow.rb:1086:10:1086:10 | b [element] | array_flow.rb:1086:10:1086:13 | ...[...] | provenance | | -| array_flow.rb:1087:10:1087:10 | b [element] | array_flow.rb:1087:10:1087:13 | ...[...] | provenance | | -| array_flow.rb:1095:5:1095:5 | a [element 0] | array_flow.rb:1096:9:1096:9 | a [element 0] | provenance | | -| array_flow.rb:1095:5:1095:5 | a [element 2] | array_flow.rb:1096:9:1096:9 | a [element 2] | provenance | | -| array_flow.rb:1095:5:1095:5 | a [element 3] | array_flow.rb:1096:9:1096:9 | a [element 3] | provenance | | -| array_flow.rb:1095:9:1095:56 | call to [] [element 0] | array_flow.rb:1095:5:1095:5 | a [element 0] | provenance | | -| array_flow.rb:1095:9:1095:56 | call to [] [element 2] | array_flow.rb:1095:5:1095:5 | a [element 2] | provenance | | -| array_flow.rb:1095:9:1095:56 | call to [] [element 3] | array_flow.rb:1095:5:1095:5 | a [element 3] | provenance | | -| array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:9:1095:56 | call to [] [element 0] | provenance | | -| array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:9:1095:56 | call to [] [element 2] | provenance | | -| array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:9:1095:56 | call to [] [element 3] | provenance | | -| array_flow.rb:1096:5:1096:5 | b [element 1] | array_flow.rb:1102:10:1102:10 | b [element 1] | provenance | | -| array_flow.rb:1096:5:1096:5 | b [element 2] | array_flow.rb:1103:10:1103:10 | b [element 2] | provenance | | -| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1101:10:1101:10 | b [element] | provenance | | -| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1102:10:1102:10 | b [element] | provenance | | -| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1103:10:1103:10 | b [element] | provenance | | -| array_flow.rb:1096:5:1096:5 | b [element] | array_flow.rb:1104:10:1104:10 | b [element] | provenance | | -| array_flow.rb:1096:9:1096:9 | [post] a [element 1] | array_flow.rb:1098:10:1098:10 | a [element 1] | provenance | | -| array_flow.rb:1096:9:1096:9 | [post] a [element 2] | array_flow.rb:1099:10:1099:10 | a [element 2] | provenance | | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1097:10:1097:10 | a [element] | provenance | | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1098:10:1098:10 | a [element] | provenance | | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1099:10:1099:10 | a [element] | provenance | | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1100:10:1100:10 | a [element] | provenance | | -| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:9 | [post] a [element] | provenance | | -| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:17 | call to rotate! [element] | provenance | | -| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:9 | [post] a [element 1] | provenance | | -| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | provenance | | -| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:9 | [post] a [element 2] | provenance | | -| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | provenance | | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | array_flow.rb:1096:5:1096:5 | b [element 1] | provenance | | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | array_flow.rb:1096:5:1096:5 | b [element 2] | provenance | | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element] | array_flow.rb:1096:5:1096:5 | b [element] | provenance | | -| array_flow.rb:1097:10:1097:10 | a [element] | array_flow.rb:1097:10:1097:13 | ...[...] | provenance | | -| array_flow.rb:1098:10:1098:10 | a [element 1] | array_flow.rb:1098:10:1098:13 | ...[...] | provenance | | -| array_flow.rb:1098:10:1098:10 | a [element] | array_flow.rb:1098:10:1098:13 | ...[...] | provenance | | -| array_flow.rb:1099:10:1099:10 | a [element 2] | array_flow.rb:1099:10:1099:13 | ...[...] | provenance | | -| array_flow.rb:1099:10:1099:10 | a [element] | array_flow.rb:1099:10:1099:13 | ...[...] | provenance | | -| array_flow.rb:1100:10:1100:10 | a [element] | array_flow.rb:1100:10:1100:13 | ...[...] | provenance | | -| array_flow.rb:1101:10:1101:10 | b [element] | array_flow.rb:1101:10:1101:13 | ...[...] | provenance | | -| array_flow.rb:1102:10:1102:10 | b [element 1] | array_flow.rb:1102:10:1102:13 | ...[...] | provenance | | -| array_flow.rb:1102:10:1102:10 | b [element] | array_flow.rb:1102:10:1102:13 | ...[...] | provenance | | -| array_flow.rb:1103:10:1103:10 | b [element 2] | array_flow.rb:1103:10:1103:13 | ...[...] | provenance | | -| array_flow.rb:1103:10:1103:10 | b [element] | array_flow.rb:1103:10:1103:13 | ...[...] | provenance | | -| array_flow.rb:1104:10:1104:10 | b [element] | array_flow.rb:1104:10:1104:13 | ...[...] | provenance | | -| array_flow.rb:1106:5:1106:5 | a [element 0] | array_flow.rb:1107:9:1107:9 | a [element 0] | provenance | | -| array_flow.rb:1106:5:1106:5 | a [element 2] | array_flow.rb:1107:9:1107:9 | a [element 2] | provenance | | -| array_flow.rb:1106:5:1106:5 | a [element 3] | array_flow.rb:1107:9:1107:9 | a [element 3] | provenance | | -| array_flow.rb:1106:9:1106:56 | call to [] [element 0] | array_flow.rb:1106:5:1106:5 | a [element 0] | provenance | | -| array_flow.rb:1106:9:1106:56 | call to [] [element 2] | array_flow.rb:1106:5:1106:5 | a [element 2] | provenance | | -| array_flow.rb:1106:9:1106:56 | call to [] [element 3] | array_flow.rb:1106:5:1106:5 | a [element 3] | provenance | | -| array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:9:1106:56 | call to [] [element 0] | provenance | | -| array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:9:1106:56 | call to [] [element 2] | provenance | | -| array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:9:1106:56 | call to [] [element 3] | provenance | | -| array_flow.rb:1107:5:1107:5 | b [element 0] | array_flow.rb:1112:10:1112:10 | b [element 0] | provenance | | -| array_flow.rb:1107:5:1107:5 | b [element 1] | array_flow.rb:1113:10:1113:10 | b [element 1] | provenance | | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1112:10:1112:10 | b [element] | provenance | | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1113:10:1113:10 | b [element] | provenance | | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1114:10:1114:10 | b [element] | provenance | | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1115:10:1115:10 | b [element] | provenance | | -| array_flow.rb:1107:9:1107:9 | [post] a [element 0] | array_flow.rb:1108:10:1108:10 | a [element 0] | provenance | | -| array_flow.rb:1107:9:1107:9 | [post] a [element 1] | array_flow.rb:1109:10:1109:10 | a [element 1] | provenance | | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1108:10:1108:10 | a [element] | provenance | | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1109:10:1109:10 | a [element] | provenance | | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1110:10:1110:10 | a [element] | provenance | | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1111:10:1111:10 | a [element] | provenance | | -| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:9 | [post] a [element] | provenance | | -| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:20 | call to rotate! [element] | provenance | | -| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:9 | [post] a [element 0] | provenance | | -| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | provenance | | -| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:9 | [post] a [element 1] | provenance | | -| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | provenance | | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | array_flow.rb:1107:5:1107:5 | b [element 0] | provenance | | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | array_flow.rb:1107:5:1107:5 | b [element 1] | provenance | | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element] | array_flow.rb:1107:5:1107:5 | b [element] | provenance | | -| array_flow.rb:1108:10:1108:10 | a [element 0] | array_flow.rb:1108:10:1108:13 | ...[...] | provenance | | -| array_flow.rb:1108:10:1108:10 | a [element] | array_flow.rb:1108:10:1108:13 | ...[...] | provenance | | -| array_flow.rb:1109:10:1109:10 | a [element 1] | array_flow.rb:1109:10:1109:13 | ...[...] | provenance | | -| array_flow.rb:1109:10:1109:10 | a [element] | array_flow.rb:1109:10:1109:13 | ...[...] | provenance | | -| array_flow.rb:1110:10:1110:10 | a [element] | array_flow.rb:1110:10:1110:13 | ...[...] | provenance | | -| array_flow.rb:1111:10:1111:10 | a [element] | array_flow.rb:1111:10:1111:13 | ...[...] | provenance | | -| array_flow.rb:1112:10:1112:10 | b [element 0] | array_flow.rb:1112:10:1112:13 | ...[...] | provenance | | -| array_flow.rb:1112:10:1112:10 | b [element] | array_flow.rb:1112:10:1112:13 | ...[...] | provenance | | -| array_flow.rb:1113:10:1113:10 | b [element 1] | array_flow.rb:1113:10:1113:13 | ...[...] | provenance | | -| array_flow.rb:1113:10:1113:10 | b [element] | array_flow.rb:1113:10:1113:13 | ...[...] | provenance | | -| array_flow.rb:1114:10:1114:10 | b [element] | array_flow.rb:1114:10:1114:13 | ...[...] | provenance | | -| array_flow.rb:1115:10:1115:10 | b [element] | array_flow.rb:1115:10:1115:13 | ...[...] | provenance | | -| array_flow.rb:1117:5:1117:5 | a [element 0] | array_flow.rb:1118:9:1118:9 | a [element 0] | provenance | | -| array_flow.rb:1117:5:1117:5 | a [element 2] | array_flow.rb:1118:9:1118:9 | a [element 2] | provenance | | -| array_flow.rb:1117:5:1117:5 | a [element 3] | array_flow.rb:1118:9:1118:9 | a [element 3] | provenance | | -| array_flow.rb:1117:9:1117:56 | call to [] [element 0] | array_flow.rb:1117:5:1117:5 | a [element 0] | provenance | | -| array_flow.rb:1117:9:1117:56 | call to [] [element 2] | array_flow.rb:1117:5:1117:5 | a [element 2] | provenance | | -| array_flow.rb:1117:9:1117:56 | call to [] [element 3] | array_flow.rb:1117:5:1117:5 | a [element 3] | provenance | | -| array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:9:1117:56 | call to [] [element 0] | provenance | | -| array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:9:1117:56 | call to [] [element 2] | provenance | | -| array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:9:1117:56 | call to [] [element 3] | provenance | | -| array_flow.rb:1118:5:1118:5 | b [element 0] | array_flow.rb:1123:10:1123:10 | b [element 0] | provenance | | -| array_flow.rb:1118:5:1118:5 | b [element 2] | array_flow.rb:1125:10:1125:10 | b [element 2] | provenance | | -| array_flow.rb:1118:5:1118:5 | b [element 3] | array_flow.rb:1126:10:1126:10 | b [element 3] | provenance | | -| array_flow.rb:1118:9:1118:9 | [post] a [element 0] | array_flow.rb:1119:10:1119:10 | a [element 0] | provenance | | -| array_flow.rb:1118:9:1118:9 | [post] a [element 2] | array_flow.rb:1121:10:1121:10 | a [element 2] | provenance | | -| array_flow.rb:1118:9:1118:9 | [post] a [element 3] | array_flow.rb:1122:10:1122:10 | a [element 3] | provenance | | -| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:9 | [post] a [element 0] | provenance | | -| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | provenance | | -| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:9 | [post] a [element 2] | provenance | | -| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | provenance | | -| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:9 | [post] a [element 3] | provenance | | -| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | provenance | | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | array_flow.rb:1118:5:1118:5 | b [element 0] | provenance | | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | array_flow.rb:1118:5:1118:5 | b [element 2] | provenance | | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | array_flow.rb:1118:5:1118:5 | b [element 3] | provenance | | -| array_flow.rb:1119:10:1119:10 | a [element 0] | array_flow.rb:1119:10:1119:13 | ...[...] | provenance | | -| array_flow.rb:1121:10:1121:10 | a [element 2] | array_flow.rb:1121:10:1121:13 | ...[...] | provenance | | -| array_flow.rb:1122:10:1122:10 | a [element 3] | array_flow.rb:1122:10:1122:13 | ...[...] | provenance | | -| array_flow.rb:1123:10:1123:10 | b [element 0] | array_flow.rb:1123:10:1123:13 | ...[...] | provenance | | -| array_flow.rb:1125:10:1125:10 | b [element 2] | array_flow.rb:1125:10:1125:13 | ...[...] | provenance | | -| array_flow.rb:1126:10:1126:10 | b [element 3] | array_flow.rb:1126:10:1126:13 | ...[...] | provenance | | -| array_flow.rb:1128:5:1128:5 | a [element 0] | array_flow.rb:1129:9:1129:9 | a [element 0] | provenance | | -| array_flow.rb:1128:5:1128:5 | a [element 2] | array_flow.rb:1129:9:1129:9 | a [element 2] | provenance | | -| array_flow.rb:1128:5:1128:5 | a [element 3] | array_flow.rb:1129:9:1129:9 | a [element 3] | provenance | | -| array_flow.rb:1128:9:1128:56 | call to [] [element 0] | array_flow.rb:1128:5:1128:5 | a [element 0] | provenance | | -| array_flow.rb:1128:9:1128:56 | call to [] [element 2] | array_flow.rb:1128:5:1128:5 | a [element 2] | provenance | | -| array_flow.rb:1128:9:1128:56 | call to [] [element 3] | array_flow.rb:1128:5:1128:5 | a [element 3] | provenance | | -| array_flow.rb:1128:10:1128:22 | call to source | array_flow.rb:1128:9:1128:56 | call to [] [element 0] | provenance | | -| array_flow.rb:1128:28:1128:40 | call to source | array_flow.rb:1128:9:1128:56 | call to [] [element 2] | provenance | | -| array_flow.rb:1128:43:1128:55 | call to source | array_flow.rb:1128:9:1128:56 | call to [] [element 3] | provenance | | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1134:10:1134:10 | b [element] | provenance | | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1135:10:1135:10 | b [element] | provenance | | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1136:10:1136:10 | b [element] | provenance | | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1137:10:1137:10 | b [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1130:10:1130:10 | a [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1131:10:1131:10 | a [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1132:10:1132:10 | a [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1133:10:1133:10 | a [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | a [element 0] | array_flow.rb:1129:9:1129:9 | [post] a [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | a [element 0] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | a [element 2] | array_flow.rb:1129:9:1129:9 | [post] a [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | a [element 2] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | a [element 3] | array_flow.rb:1129:9:1129:9 | [post] a [element] | provenance | | -| array_flow.rb:1129:9:1129:9 | a [element 3] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | provenance | | -| array_flow.rb:1129:9:1129:20 | call to rotate! [element] | array_flow.rb:1129:5:1129:5 | b [element] | provenance | | -| array_flow.rb:1130:10:1130:10 | a [element] | array_flow.rb:1130:10:1130:13 | ...[...] | provenance | | -| array_flow.rb:1131:10:1131:10 | a [element] | array_flow.rb:1131:10:1131:13 | ...[...] | provenance | | -| array_flow.rb:1132:10:1132:10 | a [element] | array_flow.rb:1132:10:1132:13 | ...[...] | provenance | | -| array_flow.rb:1133:10:1133:10 | a [element] | array_flow.rb:1133:10:1133:13 | ...[...] | provenance | | -| array_flow.rb:1134:10:1134:10 | b [element] | array_flow.rb:1134:10:1134:13 | ...[...] | provenance | | -| array_flow.rb:1135:10:1135:10 | b [element] | array_flow.rb:1135:10:1135:13 | ...[...] | provenance | | -| array_flow.rb:1136:10:1136:10 | b [element] | array_flow.rb:1136:10:1136:13 | ...[...] | provenance | | -| array_flow.rb:1137:10:1137:10 | b [element] | array_flow.rb:1137:10:1137:13 | ...[...] | provenance | | -| array_flow.rb:1141:5:1141:5 | a [element 3] | array_flow.rb:1142:9:1142:9 | a [element 3] | provenance | | -| array_flow.rb:1141:9:1141:30 | call to [] [element 3] | array_flow.rb:1141:5:1141:5 | a [element 3] | provenance | | -| array_flow.rb:1141:19:1141:29 | call to source | array_flow.rb:1141:9:1141:30 | call to [] [element 3] | provenance | | -| array_flow.rb:1142:5:1142:5 | b [element] | array_flow.rb:1145:10:1145:10 | b [element] | provenance | | -| array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:9:1144:7 | call to select [element] | provenance | | -| array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:22:1142:22 | x | provenance | | -| array_flow.rb:1142:9:1144:7 | call to select [element] | array_flow.rb:1142:5:1142:5 | b [element] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 0] | array_flow.rb:1065:9:1065:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 0] | array_flow.rb:1071:9:1071:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 0] | array_flow.rb:1077:9:1077:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 0] | array_flow.rb:1083:9:1083:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 2] | array_flow.rb:1065:9:1065:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 2] | array_flow.rb:1071:9:1071:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 2] | array_flow.rb:1077:9:1077:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 2] | array_flow.rb:1083:9:1083:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 3] | array_flow.rb:1065:9:1065:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 3] | array_flow.rb:1071:9:1071:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 3] | array_flow.rb:1077:9:1077:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1063:5:1063:5 | a : Array [element 3] | array_flow.rb:1083:9:1083:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1063:9:1063:56 | call to [] : Array [element 0] | array_flow.rb:1063:5:1063:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1063:9:1063:56 | call to [] : Array [element 2] | array_flow.rb:1063:5:1063:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1063:9:1063:56 | call to [] : Array [element 3] | array_flow.rb:1063:5:1063:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1063:10:1063:22 | call to source | array_flow.rb:1063:9:1063:56 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1063:28:1063:40 | call to source | array_flow.rb:1063:9:1063:56 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1063:43:1063:55 | call to source | array_flow.rb:1063:9:1063:56 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element 1] | array_flow.rb:1067:10:1067:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element 2] | array_flow.rb:1068:10:1068:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element] | array_flow.rb:1066:10:1066:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element] | array_flow.rb:1067:10:1067:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element] | array_flow.rb:1068:10:1068:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element] | array_flow.rb:1069:10:1069:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1065:9:1065:9 | a : Array [element 0] | array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element] | provenance | | +| array_flow.rb:1065:9:1065:9 | a : Array [element 2] | array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element 1] | provenance | | +| array_flow.rb:1065:9:1065:9 | a : Array [element 3] | array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element 2] | provenance | | +| array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element 1] | array_flow.rb:1065:5:1065:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element 2] | array_flow.rb:1065:5:1065:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element] | array_flow.rb:1065:5:1065:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1066:10:1066:10 | b : [collection] [element] | array_flow.rb:1066:10:1066:13 | ...[...] | provenance | | +| array_flow.rb:1067:10:1067:10 | b : [collection] [element 1] | array_flow.rb:1067:10:1067:13 | ...[...] | provenance | | +| array_flow.rb:1067:10:1067:10 | b : [collection] [element] | array_flow.rb:1067:10:1067:13 | ...[...] | provenance | | +| array_flow.rb:1068:10:1068:10 | b : [collection] [element 2] | array_flow.rb:1068:10:1068:13 | ...[...] | provenance | | +| array_flow.rb:1068:10:1068:10 | b : [collection] [element] | array_flow.rb:1068:10:1068:13 | ...[...] | provenance | | +| array_flow.rb:1069:10:1069:10 | b : [collection] [element] | array_flow.rb:1069:10:1069:13 | ...[...] | provenance | | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element 0] | array_flow.rb:1072:10:1072:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element 1] | array_flow.rb:1073:10:1073:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element] | array_flow.rb:1072:10:1072:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element] | array_flow.rb:1073:10:1073:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element] | array_flow.rb:1074:10:1074:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element] | array_flow.rb:1075:10:1075:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1071:9:1071:9 | a : Array [element 0] | array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element] | provenance | | +| array_flow.rb:1071:9:1071:9 | a : Array [element 2] | array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element 0] | provenance | | +| array_flow.rb:1071:9:1071:9 | a : Array [element 3] | array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element 1] | provenance | | +| array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element 0] | array_flow.rb:1071:5:1071:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element 1] | array_flow.rb:1071:5:1071:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element] | array_flow.rb:1071:5:1071:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1072:10:1072:10 | b : [collection] [element 0] | array_flow.rb:1072:10:1072:13 | ...[...] | provenance | | +| array_flow.rb:1072:10:1072:10 | b : [collection] [element] | array_flow.rb:1072:10:1072:13 | ...[...] | provenance | | +| array_flow.rb:1073:10:1073:10 | b : [collection] [element 1] | array_flow.rb:1073:10:1073:13 | ...[...] | provenance | | +| array_flow.rb:1073:10:1073:10 | b : [collection] [element] | array_flow.rb:1073:10:1073:13 | ...[...] | provenance | | +| array_flow.rb:1074:10:1074:10 | b : [collection] [element] | array_flow.rb:1074:10:1074:13 | ...[...] | provenance | | +| array_flow.rb:1075:10:1075:10 | b : [collection] [element] | array_flow.rb:1075:10:1075:13 | ...[...] | provenance | | +| array_flow.rb:1077:5:1077:5 | b : [collection] [element 0] | array_flow.rb:1078:10:1078:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1077:5:1077:5 | b : [collection] [element 2] | array_flow.rb:1080:10:1080:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1077:5:1077:5 | b : [collection] [element 3] | array_flow.rb:1081:10:1081:10 | b : [collection] [element 3] | provenance | | +| array_flow.rb:1077:9:1077:9 | a : Array [element 0] | array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 0] | provenance | | +| array_flow.rb:1077:9:1077:9 | a : Array [element 2] | array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 2] | provenance | | +| array_flow.rb:1077:9:1077:9 | a : Array [element 3] | array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 3] | provenance | | +| array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 0] | array_flow.rb:1077:5:1077:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 2] | array_flow.rb:1077:5:1077:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 3] | array_flow.rb:1077:5:1077:5 | b : [collection] [element 3] | provenance | | +| array_flow.rb:1078:10:1078:10 | b : [collection] [element 0] | array_flow.rb:1078:10:1078:13 | ...[...] | provenance | | +| array_flow.rb:1080:10:1080:10 | b : [collection] [element 2] | array_flow.rb:1080:10:1080:13 | ...[...] | provenance | | +| array_flow.rb:1081:10:1081:10 | b : [collection] [element 3] | array_flow.rb:1081:10:1081:13 | ...[...] | provenance | | +| array_flow.rb:1083:5:1083:5 | b : [collection] [element] | array_flow.rb:1084:10:1084:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1083:5:1083:5 | b : [collection] [element] | array_flow.rb:1085:10:1085:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1083:5:1083:5 | b : [collection] [element] | array_flow.rb:1086:10:1086:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1083:5:1083:5 | b : [collection] [element] | array_flow.rb:1087:10:1087:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1083:9:1083:9 | a : Array [element 0] | array_flow.rb:1083:9:1083:19 | call to rotate : [collection] [element] | provenance | | +| array_flow.rb:1083:9:1083:9 | a : Array [element 2] | array_flow.rb:1083:9:1083:19 | call to rotate : [collection] [element] | provenance | | +| array_flow.rb:1083:9:1083:9 | a : Array [element 3] | array_flow.rb:1083:9:1083:19 | call to rotate : [collection] [element] | provenance | | +| array_flow.rb:1083:9:1083:19 | call to rotate : [collection] [element] | array_flow.rb:1083:5:1083:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1084:10:1084:10 | b : [collection] [element] | array_flow.rb:1084:10:1084:13 | ...[...] | provenance | | +| array_flow.rb:1085:10:1085:10 | b : [collection] [element] | array_flow.rb:1085:10:1085:13 | ...[...] | provenance | | +| array_flow.rb:1086:10:1086:10 | b : [collection] [element] | array_flow.rb:1086:10:1086:13 | ...[...] | provenance | | +| array_flow.rb:1087:10:1087:10 | b : [collection] [element] | array_flow.rb:1087:10:1087:13 | ...[...] | provenance | | +| array_flow.rb:1095:5:1095:5 | a : Array [element 0] | array_flow.rb:1096:9:1096:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1095:5:1095:5 | a : Array [element 2] | array_flow.rb:1096:9:1096:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1095:5:1095:5 | a : Array [element 3] | array_flow.rb:1096:9:1096:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1095:9:1095:56 | call to [] : Array [element 0] | array_flow.rb:1095:5:1095:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1095:9:1095:56 | call to [] : Array [element 2] | array_flow.rb:1095:5:1095:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1095:9:1095:56 | call to [] : Array [element 3] | array_flow.rb:1095:5:1095:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:9:1095:56 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:9:1095:56 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:9:1095:56 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element 1] | array_flow.rb:1102:10:1102:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element 2] | array_flow.rb:1103:10:1103:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element] | array_flow.rb:1101:10:1101:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element] | array_flow.rb:1102:10:1102:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element] | array_flow.rb:1103:10:1103:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element] | array_flow.rb:1104:10:1104:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element 1] | array_flow.rb:1098:10:1098:10 | a : [collection] [element 1] | provenance | | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element 2] | array_flow.rb:1099:10:1099:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element] | array_flow.rb:1097:10:1097:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element] | array_flow.rb:1098:10:1098:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element] | array_flow.rb:1099:10:1099:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element] | array_flow.rb:1100:10:1100:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1096:9:1096:9 | a : Array [element 0] | array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1096:9:1096:9 | a : Array [element 0] | array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element] | provenance | | +| array_flow.rb:1096:9:1096:9 | a : Array [element 2] | array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element 1] | provenance | | +| array_flow.rb:1096:9:1096:9 | a : Array [element 2] | array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element 1] | provenance | | +| array_flow.rb:1096:9:1096:9 | a : Array [element 3] | array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element 2] | provenance | | +| array_flow.rb:1096:9:1096:9 | a : Array [element 3] | array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element 2] | provenance | | +| array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element 1] | array_flow.rb:1096:5:1096:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element 2] | array_flow.rb:1096:5:1096:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element] | array_flow.rb:1096:5:1096:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1097:10:1097:10 | a : [collection] [element] | array_flow.rb:1097:10:1097:13 | ...[...] | provenance | | +| array_flow.rb:1098:10:1098:10 | a : [collection] [element 1] | array_flow.rb:1098:10:1098:13 | ...[...] | provenance | | +| array_flow.rb:1098:10:1098:10 | a : [collection] [element] | array_flow.rb:1098:10:1098:13 | ...[...] | provenance | | +| array_flow.rb:1099:10:1099:10 | a : [collection] [element 2] | array_flow.rb:1099:10:1099:13 | ...[...] | provenance | | +| array_flow.rb:1099:10:1099:10 | a : [collection] [element] | array_flow.rb:1099:10:1099:13 | ...[...] | provenance | | +| array_flow.rb:1100:10:1100:10 | a : [collection] [element] | array_flow.rb:1100:10:1100:13 | ...[...] | provenance | | +| array_flow.rb:1101:10:1101:10 | b : [collection] [element] | array_flow.rb:1101:10:1101:13 | ...[...] | provenance | | +| array_flow.rb:1102:10:1102:10 | b : [collection] [element 1] | array_flow.rb:1102:10:1102:13 | ...[...] | provenance | | +| array_flow.rb:1102:10:1102:10 | b : [collection] [element] | array_flow.rb:1102:10:1102:13 | ...[...] | provenance | | +| array_flow.rb:1103:10:1103:10 | b : [collection] [element 2] | array_flow.rb:1103:10:1103:13 | ...[...] | provenance | | +| array_flow.rb:1103:10:1103:10 | b : [collection] [element] | array_flow.rb:1103:10:1103:13 | ...[...] | provenance | | +| array_flow.rb:1104:10:1104:10 | b : [collection] [element] | array_flow.rb:1104:10:1104:13 | ...[...] | provenance | | +| array_flow.rb:1106:5:1106:5 | a : Array [element 0] | array_flow.rb:1107:9:1107:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1106:5:1106:5 | a : Array [element 2] | array_flow.rb:1107:9:1107:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1106:5:1106:5 | a : Array [element 3] | array_flow.rb:1107:9:1107:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1106:9:1106:56 | call to [] : Array [element 0] | array_flow.rb:1106:5:1106:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1106:9:1106:56 | call to [] : Array [element 2] | array_flow.rb:1106:5:1106:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1106:9:1106:56 | call to [] : Array [element 3] | array_flow.rb:1106:5:1106:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:9:1106:56 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:9:1106:56 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:9:1106:56 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element 0] | array_flow.rb:1112:10:1112:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element 1] | array_flow.rb:1113:10:1113:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element] | array_flow.rb:1112:10:1112:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element] | array_flow.rb:1113:10:1113:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element] | array_flow.rb:1114:10:1114:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element] | array_flow.rb:1115:10:1115:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element 0] | array_flow.rb:1108:10:1108:10 | a : [collection] [element 0] | provenance | | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element 1] | array_flow.rb:1109:10:1109:10 | a : [collection] [element 1] | provenance | | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element] | array_flow.rb:1108:10:1108:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element] | array_flow.rb:1109:10:1109:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element] | array_flow.rb:1110:10:1110:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element] | array_flow.rb:1111:10:1111:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1107:9:1107:9 | a : Array [element 0] | array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1107:9:1107:9 | a : Array [element 0] | array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element] | provenance | | +| array_flow.rb:1107:9:1107:9 | a : Array [element 2] | array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element 0] | provenance | | +| array_flow.rb:1107:9:1107:9 | a : Array [element 2] | array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element 0] | provenance | | +| array_flow.rb:1107:9:1107:9 | a : Array [element 3] | array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element 1] | provenance | | +| array_flow.rb:1107:9:1107:9 | a : Array [element 3] | array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element 1] | provenance | | +| array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element 0] | array_flow.rb:1107:5:1107:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element 1] | array_flow.rb:1107:5:1107:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element] | array_flow.rb:1107:5:1107:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1108:10:1108:10 | a : [collection] [element 0] | array_flow.rb:1108:10:1108:13 | ...[...] | provenance | | +| array_flow.rb:1108:10:1108:10 | a : [collection] [element] | array_flow.rb:1108:10:1108:13 | ...[...] | provenance | | +| array_flow.rb:1109:10:1109:10 | a : [collection] [element 1] | array_flow.rb:1109:10:1109:13 | ...[...] | provenance | | +| array_flow.rb:1109:10:1109:10 | a : [collection] [element] | array_flow.rb:1109:10:1109:13 | ...[...] | provenance | | +| array_flow.rb:1110:10:1110:10 | a : [collection] [element] | array_flow.rb:1110:10:1110:13 | ...[...] | provenance | | +| array_flow.rb:1111:10:1111:10 | a : [collection] [element] | array_flow.rb:1111:10:1111:13 | ...[...] | provenance | | +| array_flow.rb:1112:10:1112:10 | b : [collection] [element 0] | array_flow.rb:1112:10:1112:13 | ...[...] | provenance | | +| array_flow.rb:1112:10:1112:10 | b : [collection] [element] | array_flow.rb:1112:10:1112:13 | ...[...] | provenance | | +| array_flow.rb:1113:10:1113:10 | b : [collection] [element 1] | array_flow.rb:1113:10:1113:13 | ...[...] | provenance | | +| array_flow.rb:1113:10:1113:10 | b : [collection] [element] | array_flow.rb:1113:10:1113:13 | ...[...] | provenance | | +| array_flow.rb:1114:10:1114:10 | b : [collection] [element] | array_flow.rb:1114:10:1114:13 | ...[...] | provenance | | +| array_flow.rb:1115:10:1115:10 | b : [collection] [element] | array_flow.rb:1115:10:1115:13 | ...[...] | provenance | | +| array_flow.rb:1117:5:1117:5 | a : Array [element 0] | array_flow.rb:1118:9:1118:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1117:5:1117:5 | a : Array [element 2] | array_flow.rb:1118:9:1118:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1117:5:1117:5 | a : Array [element 3] | array_flow.rb:1118:9:1118:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1117:9:1117:56 | call to [] : Array [element 0] | array_flow.rb:1117:5:1117:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1117:9:1117:56 | call to [] : Array [element 2] | array_flow.rb:1117:5:1117:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1117:9:1117:56 | call to [] : Array [element 3] | array_flow.rb:1117:5:1117:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:9:1117:56 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:9:1117:56 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:9:1117:56 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1118:5:1118:5 | b : [collection] [element 0] | array_flow.rb:1123:10:1123:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1118:5:1118:5 | b : [collection] [element 2] | array_flow.rb:1125:10:1125:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1118:5:1118:5 | b : [collection] [element 3] | array_flow.rb:1126:10:1126:10 | b : [collection] [element 3] | provenance | | +| array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 0] | array_flow.rb:1119:10:1119:10 | a : [collection] [element 0] | provenance | | +| array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 2] | array_flow.rb:1121:10:1121:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 3] | array_flow.rb:1122:10:1122:10 | a : [collection] [element 3] | provenance | | +| array_flow.rb:1118:9:1118:9 | a : Array [element 0] | array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 0] | provenance | | +| array_flow.rb:1118:9:1118:9 | a : Array [element 0] | array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 0] | provenance | | +| array_flow.rb:1118:9:1118:9 | a : Array [element 2] | array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 2] | provenance | | +| array_flow.rb:1118:9:1118:9 | a : Array [element 2] | array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 2] | provenance | | +| array_flow.rb:1118:9:1118:9 | a : Array [element 3] | array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 3] | provenance | | +| array_flow.rb:1118:9:1118:9 | a : Array [element 3] | array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 3] | provenance | | +| array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 0] | array_flow.rb:1118:5:1118:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 2] | array_flow.rb:1118:5:1118:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 3] | array_flow.rb:1118:5:1118:5 | b : [collection] [element 3] | provenance | | +| array_flow.rb:1119:10:1119:10 | a : [collection] [element 0] | array_flow.rb:1119:10:1119:13 | ...[...] | provenance | | +| array_flow.rb:1121:10:1121:10 | a : [collection] [element 2] | array_flow.rb:1121:10:1121:13 | ...[...] | provenance | | +| array_flow.rb:1122:10:1122:10 | a : [collection] [element 3] | array_flow.rb:1122:10:1122:13 | ...[...] | provenance | | +| array_flow.rb:1123:10:1123:10 | b : [collection] [element 0] | array_flow.rb:1123:10:1123:13 | ...[...] | provenance | | +| array_flow.rb:1125:10:1125:10 | b : [collection] [element 2] | array_flow.rb:1125:10:1125:13 | ...[...] | provenance | | +| array_flow.rb:1126:10:1126:10 | b : [collection] [element 3] | array_flow.rb:1126:10:1126:13 | ...[...] | provenance | | +| array_flow.rb:1128:5:1128:5 | a : Array [element 0] | array_flow.rb:1129:9:1129:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1128:5:1128:5 | a : Array [element 2] | array_flow.rb:1129:9:1129:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1128:5:1128:5 | a : Array [element 3] | array_flow.rb:1129:9:1129:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1128:9:1128:56 | call to [] : Array [element 0] | array_flow.rb:1128:5:1128:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1128:9:1128:56 | call to [] : Array [element 2] | array_flow.rb:1128:5:1128:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1128:9:1128:56 | call to [] : Array [element 3] | array_flow.rb:1128:5:1128:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1128:10:1128:22 | call to source | array_flow.rb:1128:9:1128:56 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1128:28:1128:40 | call to source | array_flow.rb:1128:9:1128:56 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1128:43:1128:55 | call to source | array_flow.rb:1128:9:1128:56 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1129:5:1129:5 | b : [collection] [element] | array_flow.rb:1134:10:1134:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1129:5:1129:5 | b : [collection] [element] | array_flow.rb:1135:10:1135:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1129:5:1129:5 | b : [collection] [element] | array_flow.rb:1136:10:1136:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1129:5:1129:5 | b : [collection] [element] | array_flow.rb:1137:10:1137:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | array_flow.rb:1130:10:1130:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | array_flow.rb:1131:10:1131:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | array_flow.rb:1132:10:1132:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | array_flow.rb:1133:10:1133:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | a : Array [element 0] | array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | a : Array [element 0] | array_flow.rb:1129:9:1129:20 | call to rotate! : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | a : Array [element 2] | array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | a : Array [element 2] | array_flow.rb:1129:9:1129:20 | call to rotate! : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | a : Array [element 3] | array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:9 | a : Array [element 3] | array_flow.rb:1129:9:1129:20 | call to rotate! : [collection] [element] | provenance | | +| array_flow.rb:1129:9:1129:20 | call to rotate! : [collection] [element] | array_flow.rb:1129:5:1129:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1130:10:1130:10 | a : [collection] [element] | array_flow.rb:1130:10:1130:13 | ...[...] | provenance | | +| array_flow.rb:1131:10:1131:10 | a : [collection] [element] | array_flow.rb:1131:10:1131:13 | ...[...] | provenance | | +| array_flow.rb:1132:10:1132:10 | a : [collection] [element] | array_flow.rb:1132:10:1132:13 | ...[...] | provenance | | +| array_flow.rb:1133:10:1133:10 | a : [collection] [element] | array_flow.rb:1133:10:1133:13 | ...[...] | provenance | | +| array_flow.rb:1134:10:1134:10 | b : [collection] [element] | array_flow.rb:1134:10:1134:13 | ...[...] | provenance | | +| array_flow.rb:1135:10:1135:10 | b : [collection] [element] | array_flow.rb:1135:10:1135:13 | ...[...] | provenance | | +| array_flow.rb:1136:10:1136:10 | b : [collection] [element] | array_flow.rb:1136:10:1136:13 | ...[...] | provenance | | +| array_flow.rb:1137:10:1137:10 | b : [collection] [element] | array_flow.rb:1137:10:1137:13 | ...[...] | provenance | | +| array_flow.rb:1141:5:1141:5 | a : Array [element 3] | array_flow.rb:1142:9:1142:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1141:9:1141:30 | call to [] : Array [element 3] | array_flow.rb:1141:5:1141:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1141:19:1141:29 | call to source | array_flow.rb:1141:9:1141:30 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1142:5:1142:5 | b : [collection] [element] | array_flow.rb:1145:10:1145:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1142:9:1142:9 | a : Array [element 3] | array_flow.rb:1142:9:1144:7 | call to select : [collection] [element] | provenance | | +| array_flow.rb:1142:9:1142:9 | a : Array [element 3] | array_flow.rb:1142:22:1142:22 | x | provenance | | +| array_flow.rb:1142:9:1144:7 | call to select : [collection] [element] | array_flow.rb:1142:5:1142:5 | b : [collection] [element] | provenance | | | array_flow.rb:1142:22:1142:22 | x | array_flow.rb:1143:14:1143:14 | x | provenance | | -| array_flow.rb:1145:10:1145:10 | b [element] | array_flow.rb:1145:10:1145:13 | ...[...] | provenance | | -| array_flow.rb:1149:5:1149:5 | a [element 2] | array_flow.rb:1150:9:1150:9 | a [element 2] | provenance | | -| array_flow.rb:1149:9:1149:27 | call to [] [element 2] | array_flow.rb:1149:5:1149:5 | a [element 2] | provenance | | -| array_flow.rb:1149:16:1149:26 | call to source | array_flow.rb:1149:9:1149:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1150:5:1150:5 | b [element] | array_flow.rb:1155:10:1155:10 | b [element] | provenance | | -| array_flow.rb:1150:9:1150:9 | [post] a [element] | array_flow.rb:1154:10:1154:10 | a [element] | provenance | | -| array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:9:1150:9 | [post] a [element] | provenance | | -| array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:9:1153:7 | call to select! [element] | provenance | | -| array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:23:1150:23 | x | provenance | | -| array_flow.rb:1150:9:1153:7 | call to select! [element] | array_flow.rb:1150:5:1150:5 | b [element] | provenance | | +| array_flow.rb:1145:10:1145:10 | b : [collection] [element] | array_flow.rb:1145:10:1145:13 | ...[...] | provenance | | +| array_flow.rb:1149:5:1149:5 | a : Array [element 2] | array_flow.rb:1150:9:1150:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1149:9:1149:27 | call to [] : Array [element 2] | array_flow.rb:1149:5:1149:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1149:16:1149:26 | call to source | array_flow.rb:1149:9:1149:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1150:5:1150:5 | b : [collection] [element] | array_flow.rb:1155:10:1155:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1150:9:1150:9 | [post] a : [collection] [element] | array_flow.rb:1154:10:1154:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1150:9:1150:9 | a : Array [element 2] | array_flow.rb:1150:9:1150:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1150:9:1150:9 | a : Array [element 2] | array_flow.rb:1150:9:1153:7 | call to select! : [collection] [element] | provenance | | +| array_flow.rb:1150:9:1150:9 | a : Array [element 2] | array_flow.rb:1150:23:1150:23 | x | provenance | | +| array_flow.rb:1150:9:1153:7 | call to select! : [collection] [element] | array_flow.rb:1150:5:1150:5 | b : [collection] [element] | provenance | | | array_flow.rb:1150:23:1150:23 | x | array_flow.rb:1151:14:1151:14 | x | provenance | | -| array_flow.rb:1154:10:1154:10 | a [element] | array_flow.rb:1154:10:1154:13 | ...[...] | provenance | | -| array_flow.rb:1155:10:1155:10 | b [element] | array_flow.rb:1155:10:1155:13 | ...[...] | provenance | | -| array_flow.rb:1159:5:1159:5 | a [element 0] | array_flow.rb:1160:9:1160:9 | a [element 0] | provenance | | -| array_flow.rb:1159:5:1159:5 | a [element 2] | array_flow.rb:1160:9:1160:9 | a [element 2] | provenance | | -| array_flow.rb:1159:9:1159:41 | call to [] [element 0] | array_flow.rb:1159:5:1159:5 | a [element 0] | provenance | | -| array_flow.rb:1159:9:1159:41 | call to [] [element 2] | array_flow.rb:1159:5:1159:5 | a [element 2] | provenance | | -| array_flow.rb:1159:10:1159:22 | call to source | array_flow.rb:1159:9:1159:41 | call to [] [element 0] | provenance | | -| array_flow.rb:1159:28:1159:40 | call to source | array_flow.rb:1159:9:1159:41 | call to [] [element 2] | provenance | | +| array_flow.rb:1154:10:1154:10 | a : [collection] [element] | array_flow.rb:1154:10:1154:13 | ...[...] | provenance | | +| array_flow.rb:1155:10:1155:10 | b : [collection] [element] | array_flow.rb:1155:10:1155:13 | ...[...] | provenance | | +| array_flow.rb:1159:5:1159:5 | a : Array [element 0] | array_flow.rb:1160:9:1160:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1159:5:1159:5 | a : Array [element 2] | array_flow.rb:1160:9:1160:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1159:9:1159:41 | call to [] : Array [element 0] | array_flow.rb:1159:5:1159:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1159:9:1159:41 | call to [] : Array [element 2] | array_flow.rb:1159:5:1159:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1159:10:1159:22 | call to source | array_flow.rb:1159:9:1159:41 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1159:28:1159:40 | call to source | array_flow.rb:1159:9:1159:41 | call to [] : Array [element 2] | provenance | | | array_flow.rb:1160:5:1160:5 | b | array_flow.rb:1161:10:1161:10 | b | provenance | | -| array_flow.rb:1160:9:1160:9 | [post] a [element 1] | array_flow.rb:1163:10:1163:10 | a [element 1] | provenance | | -| array_flow.rb:1160:9:1160:9 | a [element 0] | array_flow.rb:1160:9:1160:15 | call to shift | provenance | | -| array_flow.rb:1160:9:1160:9 | a [element 2] | array_flow.rb:1160:9:1160:9 | [post] a [element 1] | provenance | | +| array_flow.rb:1160:9:1160:9 | [post] a : [collection] [element 1] | array_flow.rb:1163:10:1163:10 | a : [collection] [element 1] | provenance | | +| array_flow.rb:1160:9:1160:9 | a : Array [element 0] | array_flow.rb:1160:9:1160:15 | call to shift | provenance | | +| array_flow.rb:1160:9:1160:9 | a : Array [element 2] | array_flow.rb:1160:9:1160:9 | [post] a : [collection] [element 1] | provenance | | | array_flow.rb:1160:9:1160:15 | call to shift | array_flow.rb:1160:5:1160:5 | b | provenance | | -| array_flow.rb:1163:10:1163:10 | a [element 1] | array_flow.rb:1163:10:1163:13 | ...[...] | provenance | | -| array_flow.rb:1166:5:1166:5 | a [element 0] | array_flow.rb:1167:9:1167:9 | a [element 0] | provenance | | -| array_flow.rb:1166:5:1166:5 | a [element 2] | array_flow.rb:1167:9:1167:9 | a [element 2] | provenance | | -| array_flow.rb:1166:9:1166:41 | call to [] [element 0] | array_flow.rb:1166:5:1166:5 | a [element 0] | provenance | | -| array_flow.rb:1166:9:1166:41 | call to [] [element 2] | array_flow.rb:1166:5:1166:5 | a [element 2] | provenance | | -| array_flow.rb:1166:10:1166:22 | call to source | array_flow.rb:1166:9:1166:41 | call to [] [element 0] | provenance | | -| array_flow.rb:1166:28:1166:40 | call to source | array_flow.rb:1166:9:1166:41 | call to [] [element 2] | provenance | | -| array_flow.rb:1167:5:1167:5 | b [element 0] | array_flow.rb:1168:10:1168:10 | b [element 0] | provenance | | -| array_flow.rb:1167:9:1167:9 | [post] a [element 0] | array_flow.rb:1170:10:1170:10 | a [element 0] | provenance | | -| array_flow.rb:1167:9:1167:9 | a [element 0] | array_flow.rb:1167:9:1167:18 | call to shift [element 0] | provenance | | -| array_flow.rb:1167:9:1167:9 | a [element 2] | array_flow.rb:1167:9:1167:9 | [post] a [element 0] | provenance | | -| array_flow.rb:1167:9:1167:18 | call to shift [element 0] | array_flow.rb:1167:5:1167:5 | b [element 0] | provenance | | -| array_flow.rb:1168:10:1168:10 | b [element 0] | array_flow.rb:1168:10:1168:13 | ...[...] | provenance | | -| array_flow.rb:1170:10:1170:10 | a [element 0] | array_flow.rb:1170:10:1170:13 | ...[...] | provenance | | -| array_flow.rb:1174:5:1174:5 | a [element 0] | array_flow.rb:1175:9:1175:9 | a [element 0] | provenance | | -| array_flow.rb:1174:5:1174:5 | a [element 0] | array_flow.rb:1178:10:1178:10 | a [element 0] | provenance | | -| array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1175:9:1175:9 | a [element 2] | provenance | | -| array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1180:10:1180:10 | a [element 2] | provenance | | -| array_flow.rb:1174:9:1174:41 | call to [] [element 0] | array_flow.rb:1174:5:1174:5 | a [element 0] | provenance | | -| array_flow.rb:1174:9:1174:41 | call to [] [element 2] | array_flow.rb:1174:5:1174:5 | a [element 2] | provenance | | -| array_flow.rb:1174:10:1174:22 | call to source | array_flow.rb:1174:9:1174:41 | call to [] [element 0] | provenance | | -| array_flow.rb:1174:28:1174:40 | call to source | array_flow.rb:1174:9:1174:41 | call to [] [element 2] | provenance | | -| array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1176:10:1176:10 | b [element] | provenance | | -| array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1177:10:1177:10 | b [element] | provenance | | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1178:10:1178:10 | a [element] | provenance | | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1179:10:1179:10 | a [element] | provenance | | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1180:10:1180:10 | a [element] | provenance | | -| array_flow.rb:1175:9:1175:9 | a [element 0] | array_flow.rb:1175:9:1175:9 | [post] a [element] | provenance | | -| array_flow.rb:1175:9:1175:9 | a [element 0] | array_flow.rb:1175:9:1175:18 | call to shift [element] | provenance | | -| array_flow.rb:1175:9:1175:9 | a [element 2] | array_flow.rb:1175:9:1175:9 | [post] a [element] | provenance | | -| array_flow.rb:1175:9:1175:9 | a [element 2] | array_flow.rb:1175:9:1175:18 | call to shift [element] | provenance | | -| array_flow.rb:1175:9:1175:18 | call to shift [element] | array_flow.rb:1175:5:1175:5 | b [element] | provenance | | -| array_flow.rb:1176:10:1176:10 | b [element] | array_flow.rb:1176:10:1176:13 | ...[...] | provenance | | -| array_flow.rb:1177:10:1177:10 | b [element] | array_flow.rb:1177:10:1177:13 | ...[...] | provenance | | -| array_flow.rb:1178:10:1178:10 | a [element 0] | array_flow.rb:1178:10:1178:13 | ...[...] | provenance | | -| array_flow.rb:1178:10:1178:10 | a [element] | array_flow.rb:1178:10:1178:13 | ...[...] | provenance | | -| array_flow.rb:1179:10:1179:10 | a [element] | array_flow.rb:1179:10:1179:13 | ...[...] | provenance | | -| array_flow.rb:1180:10:1180:10 | a [element 2] | array_flow.rb:1180:10:1180:13 | ...[...] | provenance | | -| array_flow.rb:1180:10:1180:10 | a [element] | array_flow.rb:1180:10:1180:13 | ...[...] | provenance | | -| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1185:9:1185:9 | a [element 2] | provenance | | -| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1188:10:1188:10 | a [element 2] | provenance | | -| array_flow.rb:1184:9:1184:27 | call to [] [element 2] | array_flow.rb:1184:5:1184:5 | a [element 2] | provenance | | -| array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:9:1184:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1189:10:1189:10 | b [element] | provenance | | -| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1190:10:1190:10 | b [element] | provenance | | -| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1191:10:1191:10 | b [element] | provenance | | -| array_flow.rb:1185:9:1185:9 | a [element 2] | array_flow.rb:1185:9:1185:17 | call to shuffle [element] | provenance | | -| array_flow.rb:1185:9:1185:17 | call to shuffle [element] | array_flow.rb:1185:5:1185:5 | b [element] | provenance | | -| array_flow.rb:1188:10:1188:10 | a [element 2] | array_flow.rb:1188:10:1188:13 | ...[...] | provenance | | -| array_flow.rb:1189:10:1189:10 | b [element] | array_flow.rb:1189:10:1189:13 | ...[...] | provenance | | -| array_flow.rb:1190:10:1190:10 | b [element] | array_flow.rb:1190:10:1190:13 | ...[...] | provenance | | -| array_flow.rb:1191:10:1191:10 | b [element] | array_flow.rb:1191:10:1191:13 | ...[...] | provenance | | -| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1196:9:1196:9 | a [element 2] | provenance | | -| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1199:10:1199:10 | a [element 2] | provenance | | -| array_flow.rb:1195:9:1195:27 | call to [] [element 2] | array_flow.rb:1195:5:1195:5 | a [element 2] | provenance | | -| array_flow.rb:1195:16:1195:26 | call to source | array_flow.rb:1195:9:1195:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1200:10:1200:10 | b [element] | provenance | | -| array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1201:10:1201:10 | b [element] | provenance | | -| array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1202:10:1202:10 | b [element] | provenance | | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1197:10:1197:10 | a [element] | provenance | | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1198:10:1198:10 | a [element] | provenance | | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1199:10:1199:10 | a [element] | provenance | | -| array_flow.rb:1196:9:1196:9 | a [element 2] | array_flow.rb:1196:9:1196:9 | [post] a [element] | provenance | | -| array_flow.rb:1196:9:1196:9 | a [element 2] | array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | provenance | | -| array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | array_flow.rb:1196:5:1196:5 | b [element] | provenance | | -| array_flow.rb:1197:10:1197:10 | a [element] | array_flow.rb:1197:10:1197:13 | ...[...] | provenance | | -| array_flow.rb:1198:10:1198:10 | a [element] | array_flow.rb:1198:10:1198:13 | ...[...] | provenance | | -| array_flow.rb:1199:10:1199:10 | a [element 2] | array_flow.rb:1199:10:1199:13 | ...[...] | provenance | | -| array_flow.rb:1199:10:1199:10 | a [element] | array_flow.rb:1199:10:1199:13 | ...[...] | provenance | | -| array_flow.rb:1200:10:1200:10 | b [element] | array_flow.rb:1200:10:1200:13 | ...[...] | provenance | | -| array_flow.rb:1201:10:1201:10 | b [element] | array_flow.rb:1201:10:1201:13 | ...[...] | provenance | | -| array_flow.rb:1202:10:1202:10 | b [element] | array_flow.rb:1202:10:1202:13 | ...[...] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1211:9:1211:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1214:9:1214:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1221:9:1221:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1226:9:1226:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1230:9:1230:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1235:9:1235:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1240:9:1240:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1244:9:1244:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1248:9:1248:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1253:9:1253:9 | a [element 2] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1208:9:1208:9 | a [element 4] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1211:9:1211:9 | a [element 4] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1214:9:1214:9 | a [element 4] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1221:9:1221:9 | a [element 4] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1226:9:1226:9 | a [element 4] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1240:9:1240:9 | a [element 4] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1244:9:1244:9 | a [element 4] | provenance | | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1253:9:1253:9 | a [element 4] | provenance | | -| array_flow.rb:1206:9:1206:47 | call to [] [element 2] | array_flow.rb:1206:5:1206:5 | a [element 2] | provenance | | -| array_flow.rb:1206:9:1206:47 | call to [] [element 4] | array_flow.rb:1206:5:1206:5 | a [element 4] | provenance | | -| array_flow.rb:1206:16:1206:28 | call to source | array_flow.rb:1206:9:1206:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1206:34:1206:46 | call to source | array_flow.rb:1206:9:1206:47 | call to [] [element 4] | provenance | | +| array_flow.rb:1163:10:1163:10 | a : [collection] [element 1] | array_flow.rb:1163:10:1163:13 | ...[...] | provenance | | +| array_flow.rb:1166:5:1166:5 | a : Array [element 0] | array_flow.rb:1167:9:1167:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1166:5:1166:5 | a : Array [element 2] | array_flow.rb:1167:9:1167:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1166:9:1166:41 | call to [] : Array [element 0] | array_flow.rb:1166:5:1166:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1166:9:1166:41 | call to [] : Array [element 2] | array_flow.rb:1166:5:1166:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1166:10:1166:22 | call to source | array_flow.rb:1166:9:1166:41 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1166:28:1166:40 | call to source | array_flow.rb:1166:9:1166:41 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1167:5:1167:5 | b : Array [element 0] | array_flow.rb:1168:10:1168:10 | b : Array [element 0] | provenance | | +| array_flow.rb:1167:9:1167:9 | [post] a : [collection] [element 0] | array_flow.rb:1170:10:1170:10 | a : [collection] [element 0] | provenance | | +| array_flow.rb:1167:9:1167:9 | a : Array [element 0] | array_flow.rb:1167:9:1167:18 | call to shift : Array [element 0] | provenance | | +| array_flow.rb:1167:9:1167:9 | a : Array [element 2] | array_flow.rb:1167:9:1167:9 | [post] a : [collection] [element 0] | provenance | | +| array_flow.rb:1167:9:1167:18 | call to shift : Array [element 0] | array_flow.rb:1167:5:1167:5 | b : Array [element 0] | provenance | | +| array_flow.rb:1168:10:1168:10 | b : Array [element 0] | array_flow.rb:1168:10:1168:13 | ...[...] | provenance | | +| array_flow.rb:1170:10:1170:10 | a : [collection] [element 0] | array_flow.rb:1170:10:1170:13 | ...[...] | provenance | | +| array_flow.rb:1174:5:1174:5 | a : Array [element 0] | array_flow.rb:1175:9:1175:9 | a : Array [element 0] | provenance | | +| array_flow.rb:1174:5:1174:5 | a : Array [element 0] | array_flow.rb:1178:10:1178:10 | a : Array [element 0] | provenance | | +| array_flow.rb:1174:5:1174:5 | a : Array [element 2] | array_flow.rb:1175:9:1175:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1174:5:1174:5 | a : Array [element 2] | array_flow.rb:1180:10:1180:10 | a : Array [element 2] | provenance | | +| array_flow.rb:1174:9:1174:41 | call to [] : Array [element 0] | array_flow.rb:1174:5:1174:5 | a : Array [element 0] | provenance | | +| array_flow.rb:1174:9:1174:41 | call to [] : Array [element 2] | array_flow.rb:1174:5:1174:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1174:10:1174:22 | call to source | array_flow.rb:1174:9:1174:41 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1174:28:1174:40 | call to source | array_flow.rb:1174:9:1174:41 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1175:5:1175:5 | b : [collection] [element] | array_flow.rb:1176:10:1176:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1175:5:1175:5 | b : [collection] [element] | array_flow.rb:1177:10:1177:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:9 | [post] a : [collection] [element] | array_flow.rb:1178:10:1178:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:9 | [post] a : [collection] [element] | array_flow.rb:1179:10:1179:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:9 | [post] a : [collection] [element] | array_flow.rb:1180:10:1180:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:9 | a : Array [element 0] | array_flow.rb:1175:9:1175:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:9 | a : Array [element 0] | array_flow.rb:1175:9:1175:18 | call to shift : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:9 | a : Array [element 2] | array_flow.rb:1175:9:1175:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:9 | a : Array [element 2] | array_flow.rb:1175:9:1175:18 | call to shift : [collection] [element] | provenance | | +| array_flow.rb:1175:9:1175:18 | call to shift : [collection] [element] | array_flow.rb:1175:5:1175:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1176:10:1176:10 | b : [collection] [element] | array_flow.rb:1176:10:1176:13 | ...[...] | provenance | | +| array_flow.rb:1177:10:1177:10 | b : [collection] [element] | array_flow.rb:1177:10:1177:13 | ...[...] | provenance | | +| array_flow.rb:1178:10:1178:10 | a : Array [element 0] | array_flow.rb:1178:10:1178:13 | ...[...] | provenance | | +| array_flow.rb:1178:10:1178:10 | a : [collection] [element] | array_flow.rb:1178:10:1178:13 | ...[...] | provenance | | +| array_flow.rb:1179:10:1179:10 | a : [collection] [element] | array_flow.rb:1179:10:1179:13 | ...[...] | provenance | | +| array_flow.rb:1180:10:1180:10 | a : Array [element 2] | array_flow.rb:1180:10:1180:13 | ...[...] | provenance | | +| array_flow.rb:1180:10:1180:10 | a : [collection] [element] | array_flow.rb:1180:10:1180:13 | ...[...] | provenance | | +| array_flow.rb:1184:5:1184:5 | a : Array [element 2] | array_flow.rb:1185:9:1185:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1184:5:1184:5 | a : Array [element 2] | array_flow.rb:1188:10:1188:10 | a : Array [element 2] | provenance | | +| array_flow.rb:1184:9:1184:27 | call to [] : Array [element 2] | array_flow.rb:1184:5:1184:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:9:1184:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1185:5:1185:5 | b : [collection] [element] | array_flow.rb:1189:10:1189:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1185:5:1185:5 | b : [collection] [element] | array_flow.rb:1190:10:1190:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1185:5:1185:5 | b : [collection] [element] | array_flow.rb:1191:10:1191:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1185:9:1185:9 | a : Array [element 2] | array_flow.rb:1185:9:1185:17 | call to shuffle : [collection] [element] | provenance | | +| array_flow.rb:1185:9:1185:17 | call to shuffle : [collection] [element] | array_flow.rb:1185:5:1185:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1188:10:1188:10 | a : Array [element 2] | array_flow.rb:1188:10:1188:13 | ...[...] | provenance | | +| array_flow.rb:1189:10:1189:10 | b : [collection] [element] | array_flow.rb:1189:10:1189:13 | ...[...] | provenance | | +| array_flow.rb:1190:10:1190:10 | b : [collection] [element] | array_flow.rb:1190:10:1190:13 | ...[...] | provenance | | +| array_flow.rb:1191:10:1191:10 | b : [collection] [element] | array_flow.rb:1191:10:1191:13 | ...[...] | provenance | | +| array_flow.rb:1195:5:1195:5 | a : Array [element 2] | array_flow.rb:1196:9:1196:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1195:5:1195:5 | a : Array [element 2] | array_flow.rb:1199:10:1199:10 | a : Array [element 2] | provenance | | +| array_flow.rb:1195:9:1195:27 | call to [] : Array [element 2] | array_flow.rb:1195:5:1195:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1195:16:1195:26 | call to source | array_flow.rb:1195:9:1195:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1196:5:1196:5 | b : [collection] [element] | array_flow.rb:1200:10:1200:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1196:5:1196:5 | b : [collection] [element] | array_flow.rb:1201:10:1201:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1196:5:1196:5 | b : [collection] [element] | array_flow.rb:1202:10:1202:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1196:9:1196:9 | [post] a : [collection] [element] | array_flow.rb:1197:10:1197:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1196:9:1196:9 | [post] a : [collection] [element] | array_flow.rb:1198:10:1198:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1196:9:1196:9 | [post] a : [collection] [element] | array_flow.rb:1199:10:1199:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1196:9:1196:9 | a : Array [element 2] | array_flow.rb:1196:9:1196:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1196:9:1196:9 | a : Array [element 2] | array_flow.rb:1196:9:1196:18 | call to shuffle! : [collection] [element] | provenance | | +| array_flow.rb:1196:9:1196:18 | call to shuffle! : [collection] [element] | array_flow.rb:1196:5:1196:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1197:10:1197:10 | a : [collection] [element] | array_flow.rb:1197:10:1197:13 | ...[...] | provenance | | +| array_flow.rb:1198:10:1198:10 | a : [collection] [element] | array_flow.rb:1198:10:1198:13 | ...[...] | provenance | | +| array_flow.rb:1199:10:1199:10 | a : Array [element 2] | array_flow.rb:1199:10:1199:13 | ...[...] | provenance | | +| array_flow.rb:1199:10:1199:10 | a : [collection] [element] | array_flow.rb:1199:10:1199:13 | ...[...] | provenance | | +| array_flow.rb:1200:10:1200:10 | b : [collection] [element] | array_flow.rb:1200:10:1200:13 | ...[...] | provenance | | +| array_flow.rb:1201:10:1201:10 | b : [collection] [element] | array_flow.rb:1201:10:1201:13 | ...[...] | provenance | | +| array_flow.rb:1202:10:1202:10 | b : [collection] [element] | array_flow.rb:1202:10:1202:13 | ...[...] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1211:9:1211:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1214:9:1214:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1221:9:1221:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1226:9:1226:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1230:9:1230:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1235:9:1235:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1240:9:1240:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1244:9:1244:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1248:9:1248:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | array_flow.rb:1253:9:1253:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1208:9:1208:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1211:9:1211:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1214:9:1214:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1221:9:1221:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1226:9:1226:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1240:9:1240:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1244:9:1244:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | array_flow.rb:1253:9:1253:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:9:1206:47 | call to [] : Array [element 2] | array_flow.rb:1206:5:1206:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1206:9:1206:47 | call to [] : Array [element 4] | array_flow.rb:1206:5:1206:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1206:16:1206:28 | call to source | array_flow.rb:1206:9:1206:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1206:34:1206:46 | call to source | array_flow.rb:1206:9:1206:47 | call to [] : Array [element 4] | provenance | | | array_flow.rb:1208:5:1208:5 | b | array_flow.rb:1209:10:1209:10 | b | provenance | | -| array_flow.rb:1208:9:1208:9 | a [element 4] | array_flow.rb:1208:9:1208:17 | call to slice | provenance | | +| array_flow.rb:1208:9:1208:9 | a : Array [element 4] | array_flow.rb:1208:9:1208:17 | call to slice | provenance | | | array_flow.rb:1208:9:1208:17 | call to slice | array_flow.rb:1208:5:1208:5 | b | provenance | | | array_flow.rb:1211:5:1211:5 | b | array_flow.rb:1212:10:1212:10 | b | provenance | | -| array_flow.rb:1211:9:1211:9 | a [element 2] | array_flow.rb:1211:9:1211:19 | call to slice | provenance | | -| array_flow.rb:1211:9:1211:9 | a [element 4] | array_flow.rb:1211:9:1211:19 | call to slice | provenance | | +| array_flow.rb:1211:9:1211:9 | a : Array [element 2] | array_flow.rb:1211:9:1211:19 | call to slice | provenance | | +| array_flow.rb:1211:9:1211:9 | a : Array [element 4] | array_flow.rb:1211:9:1211:19 | call to slice | provenance | | | array_flow.rb:1211:9:1211:19 | call to slice | array_flow.rb:1211:5:1211:5 | b | provenance | | | array_flow.rb:1214:5:1214:5 | b | array_flow.rb:1216:10:1216:10 | b | provenance | | -| array_flow.rb:1214:9:1214:9 | a [element 2] | array_flow.rb:1214:9:1214:17 | call to slice | provenance | | -| array_flow.rb:1214:9:1214:9 | a [element 4] | array_flow.rb:1214:9:1214:17 | call to slice | provenance | | +| array_flow.rb:1214:9:1214:9 | a : Array [element 2] | array_flow.rb:1214:9:1214:17 | call to slice | provenance | | +| array_flow.rb:1214:9:1214:9 | a : Array [element 4] | array_flow.rb:1214:9:1214:17 | call to slice | provenance | | | array_flow.rb:1214:9:1214:17 | call to slice | array_flow.rb:1214:5:1214:5 | b | provenance | | -| array_flow.rb:1221:5:1221:5 | b [element 0] | array_flow.rb:1222:10:1222:10 | b [element 0] | provenance | | -| array_flow.rb:1221:5:1221:5 | b [element 2] | array_flow.rb:1224:10:1224:10 | b [element 2] | provenance | | -| array_flow.rb:1221:9:1221:9 | a [element 2] | array_flow.rb:1221:9:1221:21 | call to slice [element 0] | provenance | | -| array_flow.rb:1221:9:1221:9 | a [element 4] | array_flow.rb:1221:9:1221:21 | call to slice [element 2] | provenance | | -| array_flow.rb:1221:9:1221:21 | call to slice [element 0] | array_flow.rb:1221:5:1221:5 | b [element 0] | provenance | | -| array_flow.rb:1221:9:1221:21 | call to slice [element 2] | array_flow.rb:1221:5:1221:5 | b [element 2] | provenance | | -| array_flow.rb:1222:10:1222:10 | b [element 0] | array_flow.rb:1222:10:1222:13 | ...[...] | provenance | | -| array_flow.rb:1224:10:1224:10 | b [element 2] | array_flow.rb:1224:10:1224:13 | ...[...] | provenance | | -| array_flow.rb:1226:5:1226:5 | b [element] | array_flow.rb:1227:10:1227:10 | b [element] | provenance | | -| array_flow.rb:1226:5:1226:5 | b [element] | array_flow.rb:1228:10:1228:10 | b [element] | provenance | | -| array_flow.rb:1226:9:1226:9 | a [element 2] | array_flow.rb:1226:9:1226:21 | call to slice [element] | provenance | | -| array_flow.rb:1226:9:1226:9 | a [element 4] | array_flow.rb:1226:9:1226:21 | call to slice [element] | provenance | | -| array_flow.rb:1226:9:1226:21 | call to slice [element] | array_flow.rb:1226:5:1226:5 | b [element] | provenance | | -| array_flow.rb:1227:10:1227:10 | b [element] | array_flow.rb:1227:10:1227:13 | ...[...] | provenance | | -| array_flow.rb:1228:10:1228:10 | b [element] | array_flow.rb:1228:10:1228:13 | ...[...] | provenance | | -| array_flow.rb:1230:5:1230:5 | b [element 0] | array_flow.rb:1231:10:1231:10 | b [element 0] | provenance | | -| array_flow.rb:1230:9:1230:9 | a [element 2] | array_flow.rb:1230:9:1230:21 | call to slice [element 0] | provenance | | -| array_flow.rb:1230:9:1230:21 | call to slice [element 0] | array_flow.rb:1230:5:1230:5 | b [element 0] | provenance | | -| array_flow.rb:1231:10:1231:10 | b [element 0] | array_flow.rb:1231:10:1231:13 | ...[...] | provenance | | -| array_flow.rb:1235:5:1235:5 | b [element 0] | array_flow.rb:1236:10:1236:10 | b [element 0] | provenance | | -| array_flow.rb:1235:9:1235:9 | a [element 2] | array_flow.rb:1235:9:1235:22 | call to slice [element 0] | provenance | | -| array_flow.rb:1235:9:1235:22 | call to slice [element 0] | array_flow.rb:1235:5:1235:5 | b [element 0] | provenance | | -| array_flow.rb:1236:10:1236:10 | b [element 0] | array_flow.rb:1236:10:1236:13 | ...[...] | provenance | | -| array_flow.rb:1240:5:1240:5 | b [element] | array_flow.rb:1241:10:1241:10 | b [element] | provenance | | -| array_flow.rb:1240:5:1240:5 | b [element] | array_flow.rb:1242:10:1242:10 | b [element] | provenance | | -| array_flow.rb:1240:9:1240:9 | a [element 2] | array_flow.rb:1240:9:1240:21 | call to slice [element] | provenance | | -| array_flow.rb:1240:9:1240:9 | a [element 4] | array_flow.rb:1240:9:1240:21 | call to slice [element] | provenance | | -| array_flow.rb:1240:9:1240:21 | call to slice [element] | array_flow.rb:1240:5:1240:5 | b [element] | provenance | | -| array_flow.rb:1241:10:1241:10 | b [element] | array_flow.rb:1241:10:1241:13 | ...[...] | provenance | | -| array_flow.rb:1242:10:1242:10 | b [element] | array_flow.rb:1242:10:1242:13 | ...[...] | provenance | | -| array_flow.rb:1244:5:1244:5 | b [element] | array_flow.rb:1245:10:1245:10 | b [element] | provenance | | -| array_flow.rb:1244:5:1244:5 | b [element] | array_flow.rb:1246:10:1246:10 | b [element] | provenance | | -| array_flow.rb:1244:9:1244:9 | a [element 2] | array_flow.rb:1244:9:1244:24 | call to slice [element] | provenance | | -| array_flow.rb:1244:9:1244:9 | a [element 4] | array_flow.rb:1244:9:1244:24 | call to slice [element] | provenance | | -| array_flow.rb:1244:9:1244:24 | call to slice [element] | array_flow.rb:1244:5:1244:5 | b [element] | provenance | | -| array_flow.rb:1245:10:1245:10 | b [element] | array_flow.rb:1245:10:1245:13 | ...[...] | provenance | | -| array_flow.rb:1246:10:1246:10 | b [element] | array_flow.rb:1246:10:1246:13 | ...[...] | provenance | | -| array_flow.rb:1248:5:1248:5 | b [element 2] | array_flow.rb:1251:10:1251:10 | b [element 2] | provenance | | -| array_flow.rb:1248:9:1248:9 | a [element 2] | array_flow.rb:1248:9:1248:20 | call to slice [element 2] | provenance | | -| array_flow.rb:1248:9:1248:20 | call to slice [element 2] | array_flow.rb:1248:5:1248:5 | b [element 2] | provenance | | -| array_flow.rb:1251:10:1251:10 | b [element 2] | array_flow.rb:1251:10:1251:13 | ...[...] | provenance | | -| array_flow.rb:1253:5:1253:5 | b [element] | array_flow.rb:1254:10:1254:10 | b [element] | provenance | | -| array_flow.rb:1253:5:1253:5 | b [element] | array_flow.rb:1255:10:1255:10 | b [element] | provenance | | -| array_flow.rb:1253:5:1253:5 | b [element] | array_flow.rb:1256:10:1256:10 | b [element] | provenance | | -| array_flow.rb:1253:9:1253:9 | a [element 2] | array_flow.rb:1253:9:1253:20 | call to slice [element] | provenance | | -| array_flow.rb:1253:9:1253:9 | a [element 4] | array_flow.rb:1253:9:1253:20 | call to slice [element] | provenance | | -| array_flow.rb:1253:9:1253:20 | call to slice [element] | array_flow.rb:1253:5:1253:5 | b [element] | provenance | | -| array_flow.rb:1254:10:1254:10 | b [element] | array_flow.rb:1254:10:1254:13 | ...[...] | provenance | | -| array_flow.rb:1255:10:1255:10 | b [element] | array_flow.rb:1255:10:1255:13 | ...[...] | provenance | | -| array_flow.rb:1256:10:1256:10 | b [element] | array_flow.rb:1256:10:1256:13 | ...[...] | provenance | | -| array_flow.rb:1260:5:1260:5 | a [element 2] | array_flow.rb:1261:9:1261:9 | a [element 2] | provenance | | -| array_flow.rb:1260:5:1260:5 | a [element 4] | array_flow.rb:1261:9:1261:9 | a [element 4] | provenance | | -| array_flow.rb:1260:9:1260:47 | call to [] [element 2] | array_flow.rb:1260:5:1260:5 | a [element 2] | provenance | | -| array_flow.rb:1260:9:1260:47 | call to [] [element 4] | array_flow.rb:1260:5:1260:5 | a [element 4] | provenance | | -| array_flow.rb:1260:16:1260:28 | call to source | array_flow.rb:1260:9:1260:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1260:34:1260:46 | call to source | array_flow.rb:1260:9:1260:47 | call to [] [element 4] | provenance | | +| array_flow.rb:1221:5:1221:5 | b : [collection] [element 0] | array_flow.rb:1222:10:1222:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1221:5:1221:5 | b : [collection] [element 2] | array_flow.rb:1224:10:1224:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1221:9:1221:9 | a : Array [element 2] | array_flow.rb:1221:9:1221:21 | call to slice : [collection] [element 0] | provenance | | +| array_flow.rb:1221:9:1221:9 | a : Array [element 4] | array_flow.rb:1221:9:1221:21 | call to slice : [collection] [element 2] | provenance | | +| array_flow.rb:1221:9:1221:21 | call to slice : [collection] [element 0] | array_flow.rb:1221:5:1221:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1221:9:1221:21 | call to slice : [collection] [element 2] | array_flow.rb:1221:5:1221:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1222:10:1222:10 | b : [collection] [element 0] | array_flow.rb:1222:10:1222:13 | ...[...] | provenance | | +| array_flow.rb:1224:10:1224:10 | b : [collection] [element 2] | array_flow.rb:1224:10:1224:13 | ...[...] | provenance | | +| array_flow.rb:1226:5:1226:5 | b : [collection] [element] | array_flow.rb:1227:10:1227:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1226:5:1226:5 | b : [collection] [element] | array_flow.rb:1228:10:1228:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1226:9:1226:9 | a : Array [element 2] | array_flow.rb:1226:9:1226:21 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1226:9:1226:9 | a : Array [element 4] | array_flow.rb:1226:9:1226:21 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1226:9:1226:21 | call to slice : [collection] [element] | array_flow.rb:1226:5:1226:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1227:10:1227:10 | b : [collection] [element] | array_flow.rb:1227:10:1227:13 | ...[...] | provenance | | +| array_flow.rb:1228:10:1228:10 | b : [collection] [element] | array_flow.rb:1228:10:1228:13 | ...[...] | provenance | | +| array_flow.rb:1230:5:1230:5 | b : [collection] [element 0] | array_flow.rb:1231:10:1231:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1230:9:1230:9 | a : Array [element 2] | array_flow.rb:1230:9:1230:21 | call to slice : [collection] [element 0] | provenance | | +| array_flow.rb:1230:9:1230:21 | call to slice : [collection] [element 0] | array_flow.rb:1230:5:1230:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1231:10:1231:10 | b : [collection] [element 0] | array_flow.rb:1231:10:1231:13 | ...[...] | provenance | | +| array_flow.rb:1235:5:1235:5 | b : [collection] [element 0] | array_flow.rb:1236:10:1236:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1235:9:1235:9 | a : Array [element 2] | array_flow.rb:1235:9:1235:22 | call to slice : [collection] [element 0] | provenance | | +| array_flow.rb:1235:9:1235:22 | call to slice : [collection] [element 0] | array_flow.rb:1235:5:1235:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1236:10:1236:10 | b : [collection] [element 0] | array_flow.rb:1236:10:1236:13 | ...[...] | provenance | | +| array_flow.rb:1240:5:1240:5 | b : [collection] [element] | array_flow.rb:1241:10:1241:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1240:5:1240:5 | b : [collection] [element] | array_flow.rb:1242:10:1242:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1240:9:1240:9 | a : Array [element 2] | array_flow.rb:1240:9:1240:21 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1240:9:1240:9 | a : Array [element 4] | array_flow.rb:1240:9:1240:21 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1240:9:1240:21 | call to slice : [collection] [element] | array_flow.rb:1240:5:1240:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1241:10:1241:10 | b : [collection] [element] | array_flow.rb:1241:10:1241:13 | ...[...] | provenance | | +| array_flow.rb:1242:10:1242:10 | b : [collection] [element] | array_flow.rb:1242:10:1242:13 | ...[...] | provenance | | +| array_flow.rb:1244:5:1244:5 | b : [collection] [element] | array_flow.rb:1245:10:1245:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1244:5:1244:5 | b : [collection] [element] | array_flow.rb:1246:10:1246:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1244:9:1244:9 | a : Array [element 2] | array_flow.rb:1244:9:1244:24 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1244:9:1244:9 | a : Array [element 4] | array_flow.rb:1244:9:1244:24 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1244:9:1244:24 | call to slice : [collection] [element] | array_flow.rb:1244:5:1244:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1245:10:1245:10 | b : [collection] [element] | array_flow.rb:1245:10:1245:13 | ...[...] | provenance | | +| array_flow.rb:1246:10:1246:10 | b : [collection] [element] | array_flow.rb:1246:10:1246:13 | ...[...] | provenance | | +| array_flow.rb:1248:5:1248:5 | b : [collection] [element 2] | array_flow.rb:1251:10:1251:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1248:9:1248:9 | a : Array [element 2] | array_flow.rb:1248:9:1248:20 | call to slice : [collection] [element 2] | provenance | | +| array_flow.rb:1248:9:1248:20 | call to slice : [collection] [element 2] | array_flow.rb:1248:5:1248:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1251:10:1251:10 | b : [collection] [element 2] | array_flow.rb:1251:10:1251:13 | ...[...] | provenance | | +| array_flow.rb:1253:5:1253:5 | b : [collection] [element] | array_flow.rb:1254:10:1254:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1253:5:1253:5 | b : [collection] [element] | array_flow.rb:1255:10:1255:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1253:5:1253:5 | b : [collection] [element] | array_flow.rb:1256:10:1256:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1253:9:1253:9 | a : Array [element 2] | array_flow.rb:1253:9:1253:20 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1253:9:1253:9 | a : Array [element 4] | array_flow.rb:1253:9:1253:20 | call to slice : [collection] [element] | provenance | | +| array_flow.rb:1253:9:1253:20 | call to slice : [collection] [element] | array_flow.rb:1253:5:1253:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1254:10:1254:10 | b : [collection] [element] | array_flow.rb:1254:10:1254:13 | ...[...] | provenance | | +| array_flow.rb:1255:10:1255:10 | b : [collection] [element] | array_flow.rb:1255:10:1255:13 | ...[...] | provenance | | +| array_flow.rb:1256:10:1256:10 | b : [collection] [element] | array_flow.rb:1256:10:1256:13 | ...[...] | provenance | | +| array_flow.rb:1260:5:1260:5 | a : Array [element 2] | array_flow.rb:1261:9:1261:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1260:5:1260:5 | a : Array [element 4] | array_flow.rb:1261:9:1261:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1260:9:1260:47 | call to [] : Array [element 2] | array_flow.rb:1260:5:1260:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1260:9:1260:47 | call to [] : Array [element 4] | array_flow.rb:1260:5:1260:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1260:16:1260:28 | call to source | array_flow.rb:1260:9:1260:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1260:34:1260:46 | call to source | array_flow.rb:1260:9:1260:47 | call to [] : Array [element 4] | provenance | | | array_flow.rb:1261:5:1261:5 | b | array_flow.rb:1262:10:1262:10 | b | provenance | | -| array_flow.rb:1261:9:1261:9 | [post] a [element 3] | array_flow.rb:1266:10:1266:10 | a [element 3] | provenance | | -| array_flow.rb:1261:9:1261:9 | a [element 2] | array_flow.rb:1261:9:1261:19 | call to slice! | provenance | | -| array_flow.rb:1261:9:1261:9 | a [element 4] | array_flow.rb:1261:9:1261:9 | [post] a [element 3] | provenance | | +| array_flow.rb:1261:9:1261:9 | [post] a : [collection] [element 3] | array_flow.rb:1266:10:1266:10 | a : [collection] [element 3] | provenance | | +| array_flow.rb:1261:9:1261:9 | a : Array [element 2] | array_flow.rb:1261:9:1261:19 | call to slice! | provenance | | +| array_flow.rb:1261:9:1261:9 | a : Array [element 4] | array_flow.rb:1261:9:1261:9 | [post] a : [collection] [element 3] | provenance | | | array_flow.rb:1261:9:1261:19 | call to slice! | array_flow.rb:1261:5:1261:5 | b | provenance | | -| array_flow.rb:1266:10:1266:10 | a [element 3] | array_flow.rb:1266:10:1266:13 | ...[...] | provenance | | -| array_flow.rb:1268:5:1268:5 | a [element 2] | array_flow.rb:1269:9:1269:9 | a [element 2] | provenance | | -| array_flow.rb:1268:5:1268:5 | a [element 4] | array_flow.rb:1269:9:1269:9 | a [element 4] | provenance | | -| array_flow.rb:1268:9:1268:47 | call to [] [element 2] | array_flow.rb:1268:5:1268:5 | a [element 2] | provenance | | -| array_flow.rb:1268:9:1268:47 | call to [] [element 4] | array_flow.rb:1268:5:1268:5 | a [element 4] | provenance | | -| array_flow.rb:1268:16:1268:28 | call to source | array_flow.rb:1268:9:1268:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1268:34:1268:46 | call to source | array_flow.rb:1268:9:1268:47 | call to [] [element 4] | provenance | | +| array_flow.rb:1266:10:1266:10 | a : [collection] [element 3] | array_flow.rb:1266:10:1266:13 | ...[...] | provenance | | +| array_flow.rb:1268:5:1268:5 | a : Array [element 2] | array_flow.rb:1269:9:1269:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1268:5:1268:5 | a : Array [element 4] | array_flow.rb:1269:9:1269:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1268:9:1268:47 | call to [] : Array [element 2] | array_flow.rb:1268:5:1268:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1268:9:1268:47 | call to [] : Array [element 4] | array_flow.rb:1268:5:1268:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1268:16:1268:28 | call to source | array_flow.rb:1268:9:1268:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1268:34:1268:46 | call to source | array_flow.rb:1268:9:1268:47 | call to [] : Array [element 4] | provenance | | | array_flow.rb:1269:5:1269:5 | b | array_flow.rb:1275:10:1275:10 | b | provenance | | -| array_flow.rb:1269:5:1269:5 | b [element] | array_flow.rb:1277:10:1277:10 | b [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | [post] a [element] | array_flow.rb:1270:10:1270:10 | a [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | [post] a [element] | array_flow.rb:1271:10:1271:10 | a [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | [post] a [element] | array_flow.rb:1272:10:1272:10 | a [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | [post] a [element] | array_flow.rb:1273:10:1273:10 | a [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | a [element 2] | array_flow.rb:1269:9:1269:9 | [post] a [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | a [element 2] | array_flow.rb:1269:9:1269:19 | call to slice! | provenance | | -| array_flow.rb:1269:9:1269:9 | a [element 2] | array_flow.rb:1269:9:1269:19 | call to slice! [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | a [element 4] | array_flow.rb:1269:9:1269:9 | [post] a [element] | provenance | | -| array_flow.rb:1269:9:1269:9 | a [element 4] | array_flow.rb:1269:9:1269:19 | call to slice! | provenance | | -| array_flow.rb:1269:9:1269:9 | a [element 4] | array_flow.rb:1269:9:1269:19 | call to slice! [element] | provenance | | +| array_flow.rb:1269:5:1269:5 | b : [collection] [element] | array_flow.rb:1277:10:1277:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | [post] a : [collection] [element] | array_flow.rb:1270:10:1270:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | [post] a : [collection] [element] | array_flow.rb:1271:10:1271:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | [post] a : [collection] [element] | array_flow.rb:1272:10:1272:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | [post] a : [collection] [element] | array_flow.rb:1273:10:1273:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | a : Array [element 2] | array_flow.rb:1269:9:1269:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | a : Array [element 2] | array_flow.rb:1269:9:1269:19 | call to slice! | provenance | | +| array_flow.rb:1269:9:1269:9 | a : Array [element 2] | array_flow.rb:1269:9:1269:19 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | a : Array [element 4] | array_flow.rb:1269:9:1269:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1269:9:1269:9 | a : Array [element 4] | array_flow.rb:1269:9:1269:19 | call to slice! | provenance | | +| array_flow.rb:1269:9:1269:9 | a : Array [element 4] | array_flow.rb:1269:9:1269:19 | call to slice! : [collection] [element] | provenance | | | array_flow.rb:1269:9:1269:19 | call to slice! | array_flow.rb:1269:5:1269:5 | b | provenance | | -| array_flow.rb:1269:9:1269:19 | call to slice! [element] | array_flow.rb:1269:5:1269:5 | b [element] | provenance | | -| array_flow.rb:1270:10:1270:10 | a [element] | array_flow.rb:1270:10:1270:13 | ...[...] | provenance | | -| array_flow.rb:1271:10:1271:10 | a [element] | array_flow.rb:1271:10:1271:13 | ...[...] | provenance | | -| array_flow.rb:1272:10:1272:10 | a [element] | array_flow.rb:1272:10:1272:13 | ...[...] | provenance | | -| array_flow.rb:1273:10:1273:10 | a [element] | array_flow.rb:1273:10:1273:13 | ...[...] | provenance | | -| array_flow.rb:1277:10:1277:10 | b [element] | array_flow.rb:1277:10:1277:13 | ...[...] | provenance | | -| array_flow.rb:1279:5:1279:5 | a [element 2] | array_flow.rb:1280:9:1280:9 | a [element 2] | provenance | | -| array_flow.rb:1279:5:1279:5 | a [element 4] | array_flow.rb:1280:9:1280:9 | a [element 4] | provenance | | -| array_flow.rb:1279:9:1279:47 | call to [] [element 2] | array_flow.rb:1279:5:1279:5 | a [element 2] | provenance | | -| array_flow.rb:1279:9:1279:47 | call to [] [element 4] | array_flow.rb:1279:5:1279:5 | a [element 4] | provenance | | -| array_flow.rb:1279:16:1279:28 | call to source | array_flow.rb:1279:9:1279:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1279:34:1279:46 | call to source | array_flow.rb:1279:9:1279:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1280:5:1280:5 | b [element 0] | array_flow.rb:1281:10:1281:10 | b [element 0] | provenance | | -| array_flow.rb:1280:5:1280:5 | b [element 2] | array_flow.rb:1283:10:1283:10 | b [element 2] | provenance | | -| array_flow.rb:1280:9:1280:9 | a [element 2] | array_flow.rb:1280:9:1280:22 | call to slice! [element 0] | provenance | | -| array_flow.rb:1280:9:1280:9 | a [element 4] | array_flow.rb:1280:9:1280:22 | call to slice! [element 2] | provenance | | -| array_flow.rb:1280:9:1280:22 | call to slice! [element 0] | array_flow.rb:1280:5:1280:5 | b [element 0] | provenance | | -| array_flow.rb:1280:9:1280:22 | call to slice! [element 2] | array_flow.rb:1280:5:1280:5 | b [element 2] | provenance | | -| array_flow.rb:1281:10:1281:10 | b [element 0] | array_flow.rb:1281:10:1281:13 | ...[...] | provenance | | -| array_flow.rb:1283:10:1283:10 | b [element 2] | array_flow.rb:1283:10:1283:13 | ...[...] | provenance | | -| array_flow.rb:1290:5:1290:5 | a [element 2] | array_flow.rb:1291:9:1291:9 | a [element 2] | provenance | | -| array_flow.rb:1290:5:1290:5 | a [element 4] | array_flow.rb:1291:9:1291:9 | a [element 4] | provenance | | -| array_flow.rb:1290:9:1290:47 | call to [] [element 2] | array_flow.rb:1290:5:1290:5 | a [element 2] | provenance | | -| array_flow.rb:1290:9:1290:47 | call to [] [element 4] | array_flow.rb:1290:5:1290:5 | a [element 4] | provenance | | -| array_flow.rb:1290:16:1290:28 | call to source | array_flow.rb:1290:9:1290:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1290:34:1290:46 | call to source | array_flow.rb:1290:9:1290:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1291:5:1291:5 | b [element 0] | array_flow.rb:1292:10:1292:10 | b [element 0] | provenance | | -| array_flow.rb:1291:9:1291:9 | [post] a [element 2] | array_flow.rb:1297:10:1297:10 | a [element 2] | provenance | | -| array_flow.rb:1291:9:1291:9 | a [element 2] | array_flow.rb:1291:9:1291:22 | call to slice! [element 0] | provenance | | -| array_flow.rb:1291:9:1291:9 | a [element 4] | array_flow.rb:1291:9:1291:9 | [post] a [element 2] | provenance | | -| array_flow.rb:1291:9:1291:22 | call to slice! [element 0] | array_flow.rb:1291:5:1291:5 | b [element 0] | provenance | | -| array_flow.rb:1292:10:1292:10 | b [element 0] | array_flow.rb:1292:10:1292:13 | ...[...] | provenance | | -| array_flow.rb:1297:10:1297:10 | a [element 2] | array_flow.rb:1297:10:1297:13 | ...[...] | provenance | | -| array_flow.rb:1301:5:1301:5 | a [element 2] | array_flow.rb:1302:9:1302:9 | a [element 2] | provenance | | -| array_flow.rb:1301:5:1301:5 | a [element 4] | array_flow.rb:1302:9:1302:9 | a [element 4] | provenance | | -| array_flow.rb:1301:9:1301:47 | call to [] [element 2] | array_flow.rb:1301:5:1301:5 | a [element 2] | provenance | | -| array_flow.rb:1301:9:1301:47 | call to [] [element 4] | array_flow.rb:1301:5:1301:5 | a [element 4] | provenance | | -| array_flow.rb:1301:16:1301:28 | call to source | array_flow.rb:1301:9:1301:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1301:34:1301:46 | call to source | array_flow.rb:1301:9:1301:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1302:5:1302:5 | b [element 0] | array_flow.rb:1303:10:1303:10 | b [element 0] | provenance | | -| array_flow.rb:1302:9:1302:9 | [post] a [element 2] | array_flow.rb:1308:10:1308:10 | a [element 2] | provenance | | -| array_flow.rb:1302:9:1302:9 | a [element 2] | array_flow.rb:1302:9:1302:23 | call to slice! [element 0] | provenance | | -| array_flow.rb:1302:9:1302:9 | a [element 4] | array_flow.rb:1302:9:1302:9 | [post] a [element 2] | provenance | | -| array_flow.rb:1302:9:1302:23 | call to slice! [element 0] | array_flow.rb:1302:5:1302:5 | b [element 0] | provenance | | -| array_flow.rb:1303:10:1303:10 | b [element 0] | array_flow.rb:1303:10:1303:13 | ...[...] | provenance | | -| array_flow.rb:1308:10:1308:10 | a [element 2] | array_flow.rb:1308:10:1308:13 | ...[...] | provenance | | -| array_flow.rb:1312:5:1312:5 | a [element 2] | array_flow.rb:1313:9:1313:9 | a [element 2] | provenance | | -| array_flow.rb:1312:5:1312:5 | a [element 4] | array_flow.rb:1313:9:1313:9 | a [element 4] | provenance | | -| array_flow.rb:1312:9:1312:47 | call to [] [element 2] | array_flow.rb:1312:5:1312:5 | a [element 2] | provenance | | -| array_flow.rb:1312:9:1312:47 | call to [] [element 4] | array_flow.rb:1312:5:1312:5 | a [element 4] | provenance | | -| array_flow.rb:1312:16:1312:28 | call to source | array_flow.rb:1312:9:1312:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1312:34:1312:46 | call to source | array_flow.rb:1312:9:1312:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1313:5:1313:5 | b [element] | array_flow.rb:1314:10:1314:10 | b [element] | provenance | | -| array_flow.rb:1313:5:1313:5 | b [element] | array_flow.rb:1315:10:1315:10 | b [element] | provenance | | -| array_flow.rb:1313:5:1313:5 | b [element] | array_flow.rb:1316:10:1316:10 | b [element] | provenance | | -| array_flow.rb:1313:9:1313:9 | [post] a [element] | array_flow.rb:1317:10:1317:10 | a [element] | provenance | | -| array_flow.rb:1313:9:1313:9 | [post] a [element] | array_flow.rb:1318:10:1318:10 | a [element] | provenance | | -| array_flow.rb:1313:9:1313:9 | [post] a [element] | array_flow.rb:1319:10:1319:10 | a [element] | provenance | | -| array_flow.rb:1313:9:1313:9 | a [element 2] | array_flow.rb:1313:9:1313:9 | [post] a [element] | provenance | | -| array_flow.rb:1313:9:1313:9 | a [element 2] | array_flow.rb:1313:9:1313:22 | call to slice! [element] | provenance | | -| array_flow.rb:1313:9:1313:9 | a [element 4] | array_flow.rb:1313:9:1313:9 | [post] a [element] | provenance | | -| array_flow.rb:1313:9:1313:9 | a [element 4] | array_flow.rb:1313:9:1313:22 | call to slice! [element] | provenance | | -| array_flow.rb:1313:9:1313:22 | call to slice! [element] | array_flow.rb:1313:5:1313:5 | b [element] | provenance | | -| array_flow.rb:1314:10:1314:10 | b [element] | array_flow.rb:1314:10:1314:13 | ...[...] | provenance | | -| array_flow.rb:1315:10:1315:10 | b [element] | array_flow.rb:1315:10:1315:13 | ...[...] | provenance | | -| array_flow.rb:1316:10:1316:10 | b [element] | array_flow.rb:1316:10:1316:13 | ...[...] | provenance | | -| array_flow.rb:1317:10:1317:10 | a [element] | array_flow.rb:1317:10:1317:13 | ...[...] | provenance | | -| array_flow.rb:1318:10:1318:10 | a [element] | array_flow.rb:1318:10:1318:13 | ...[...] | provenance | | -| array_flow.rb:1319:10:1319:10 | a [element] | array_flow.rb:1319:10:1319:13 | ...[...] | provenance | | -| array_flow.rb:1321:5:1321:5 | a [element 2] | array_flow.rb:1322:9:1322:9 | a [element 2] | provenance | | -| array_flow.rb:1321:5:1321:5 | a [element 4] | array_flow.rb:1322:9:1322:9 | a [element 4] | provenance | | -| array_flow.rb:1321:9:1321:47 | call to [] [element 2] | array_flow.rb:1321:5:1321:5 | a [element 2] | provenance | | -| array_flow.rb:1321:9:1321:47 | call to [] [element 4] | array_flow.rb:1321:5:1321:5 | a [element 4] | provenance | | -| array_flow.rb:1321:16:1321:28 | call to source | array_flow.rb:1321:9:1321:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1321:34:1321:46 | call to source | array_flow.rb:1321:9:1321:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1322:5:1322:5 | b [element] | array_flow.rb:1323:10:1323:10 | b [element] | provenance | | -| array_flow.rb:1322:5:1322:5 | b [element] | array_flow.rb:1324:10:1324:10 | b [element] | provenance | | -| array_flow.rb:1322:5:1322:5 | b [element] | array_flow.rb:1325:10:1325:10 | b [element] | provenance | | -| array_flow.rb:1322:9:1322:9 | [post] a [element] | array_flow.rb:1326:10:1326:10 | a [element] | provenance | | -| array_flow.rb:1322:9:1322:9 | [post] a [element] | array_flow.rb:1327:10:1327:10 | a [element] | provenance | | -| array_flow.rb:1322:9:1322:9 | [post] a [element] | array_flow.rb:1328:10:1328:10 | a [element] | provenance | | -| array_flow.rb:1322:9:1322:9 | a [element 2] | array_flow.rb:1322:9:1322:9 | [post] a [element] | provenance | | -| array_flow.rb:1322:9:1322:9 | a [element 2] | array_flow.rb:1322:9:1322:22 | call to slice! [element] | provenance | | -| array_flow.rb:1322:9:1322:9 | a [element 4] | array_flow.rb:1322:9:1322:9 | [post] a [element] | provenance | | -| array_flow.rb:1322:9:1322:9 | a [element 4] | array_flow.rb:1322:9:1322:22 | call to slice! [element] | provenance | | -| array_flow.rb:1322:9:1322:22 | call to slice! [element] | array_flow.rb:1322:5:1322:5 | b [element] | provenance | | -| array_flow.rb:1323:10:1323:10 | b [element] | array_flow.rb:1323:10:1323:13 | ...[...] | provenance | | -| array_flow.rb:1324:10:1324:10 | b [element] | array_flow.rb:1324:10:1324:13 | ...[...] | provenance | | -| array_flow.rb:1325:10:1325:10 | b [element] | array_flow.rb:1325:10:1325:13 | ...[...] | provenance | | -| array_flow.rb:1326:10:1326:10 | a [element] | array_flow.rb:1326:10:1326:13 | ...[...] | provenance | | -| array_flow.rb:1327:10:1327:10 | a [element] | array_flow.rb:1327:10:1327:13 | ...[...] | provenance | | -| array_flow.rb:1328:10:1328:10 | a [element] | array_flow.rb:1328:10:1328:13 | ...[...] | provenance | | -| array_flow.rb:1330:5:1330:5 | a [element 2] | array_flow.rb:1331:9:1331:9 | a [element 2] | provenance | | -| array_flow.rb:1330:5:1330:5 | a [element 4] | array_flow.rb:1331:9:1331:9 | a [element 4] | provenance | | -| array_flow.rb:1330:9:1330:47 | call to [] [element 2] | array_flow.rb:1330:5:1330:5 | a [element 2] | provenance | | -| array_flow.rb:1330:9:1330:47 | call to [] [element 4] | array_flow.rb:1330:5:1330:5 | a [element 4] | provenance | | -| array_flow.rb:1330:16:1330:28 | call to source | array_flow.rb:1330:9:1330:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1330:34:1330:46 | call to source | array_flow.rb:1330:9:1330:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1331:5:1331:5 | b [element] | array_flow.rb:1332:10:1332:10 | b [element] | provenance | | -| array_flow.rb:1331:5:1331:5 | b [element] | array_flow.rb:1333:10:1333:10 | b [element] | provenance | | -| array_flow.rb:1331:5:1331:5 | b [element] | array_flow.rb:1334:10:1334:10 | b [element] | provenance | | -| array_flow.rb:1331:9:1331:9 | [post] a [element] | array_flow.rb:1335:10:1335:10 | a [element] | provenance | | -| array_flow.rb:1331:9:1331:9 | [post] a [element] | array_flow.rb:1336:10:1336:10 | a [element] | provenance | | -| array_flow.rb:1331:9:1331:9 | [post] a [element] | array_flow.rb:1337:10:1337:10 | a [element] | provenance | | -| array_flow.rb:1331:9:1331:9 | a [element 2] | array_flow.rb:1331:9:1331:9 | [post] a [element] | provenance | | -| array_flow.rb:1331:9:1331:9 | a [element 2] | array_flow.rb:1331:9:1331:25 | call to slice! [element] | provenance | | -| array_flow.rb:1331:9:1331:9 | a [element 4] | array_flow.rb:1331:9:1331:9 | [post] a [element] | provenance | | -| array_flow.rb:1331:9:1331:9 | a [element 4] | array_flow.rb:1331:9:1331:25 | call to slice! [element] | provenance | | -| array_flow.rb:1331:9:1331:25 | call to slice! [element] | array_flow.rb:1331:5:1331:5 | b [element] | provenance | | -| array_flow.rb:1332:10:1332:10 | b [element] | array_flow.rb:1332:10:1332:13 | ...[...] | provenance | | -| array_flow.rb:1333:10:1333:10 | b [element] | array_flow.rb:1333:10:1333:13 | ...[...] | provenance | | -| array_flow.rb:1334:10:1334:10 | b [element] | array_flow.rb:1334:10:1334:13 | ...[...] | provenance | | -| array_flow.rb:1335:10:1335:10 | a [element] | array_flow.rb:1335:10:1335:13 | ...[...] | provenance | | -| array_flow.rb:1336:10:1336:10 | a [element] | array_flow.rb:1336:10:1336:13 | ...[...] | provenance | | -| array_flow.rb:1337:10:1337:10 | a [element] | array_flow.rb:1337:10:1337:13 | ...[...] | provenance | | -| array_flow.rb:1339:5:1339:5 | a [element 2] | array_flow.rb:1340:9:1340:9 | a [element 2] | provenance | | -| array_flow.rb:1339:5:1339:5 | a [element 4] | array_flow.rb:1340:9:1340:9 | a [element 4] | provenance | | -| array_flow.rb:1339:9:1339:47 | call to [] [element 2] | array_flow.rb:1339:5:1339:5 | a [element 2] | provenance | | -| array_flow.rb:1339:9:1339:47 | call to [] [element 4] | array_flow.rb:1339:5:1339:5 | a [element 4] | provenance | | -| array_flow.rb:1339:16:1339:28 | call to source | array_flow.rb:1339:9:1339:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1339:34:1339:46 | call to source | array_flow.rb:1339:9:1339:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1340:5:1340:5 | b [element 2] | array_flow.rb:1343:10:1343:10 | b [element 2] | provenance | | -| array_flow.rb:1340:9:1340:9 | [post] a [element 1] | array_flow.rb:1345:10:1345:10 | a [element 1] | provenance | | -| array_flow.rb:1340:9:1340:9 | a [element 2] | array_flow.rb:1340:9:1340:21 | call to slice! [element 2] | provenance | | -| array_flow.rb:1340:9:1340:9 | a [element 4] | array_flow.rb:1340:9:1340:9 | [post] a [element 1] | provenance | | -| array_flow.rb:1340:9:1340:21 | call to slice! [element 2] | array_flow.rb:1340:5:1340:5 | b [element 2] | provenance | | -| array_flow.rb:1343:10:1343:10 | b [element 2] | array_flow.rb:1343:10:1343:13 | ...[...] | provenance | | -| array_flow.rb:1345:10:1345:10 | a [element 1] | array_flow.rb:1345:10:1345:13 | ...[...] | provenance | | -| array_flow.rb:1348:5:1348:5 | a [element 2] | array_flow.rb:1349:9:1349:9 | a [element 2] | provenance | | -| array_flow.rb:1348:5:1348:5 | a [element 4] | array_flow.rb:1349:9:1349:9 | a [element 4] | provenance | | -| array_flow.rb:1348:9:1348:47 | call to [] [element 2] | array_flow.rb:1348:5:1348:5 | a [element 2] | provenance | | -| array_flow.rb:1348:9:1348:47 | call to [] [element 4] | array_flow.rb:1348:5:1348:5 | a [element 4] | provenance | | -| array_flow.rb:1348:16:1348:28 | call to source | array_flow.rb:1348:9:1348:47 | call to [] [element 2] | provenance | | -| array_flow.rb:1348:34:1348:46 | call to source | array_flow.rb:1348:9:1348:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1349:5:1349:5 | b [element] | array_flow.rb:1350:10:1350:10 | b [element] | provenance | | -| array_flow.rb:1349:5:1349:5 | b [element] | array_flow.rb:1351:10:1351:10 | b [element] | provenance | | -| array_flow.rb:1349:5:1349:5 | b [element] | array_flow.rb:1352:10:1352:10 | b [element] | provenance | | -| array_flow.rb:1349:9:1349:9 | [post] a [element] | array_flow.rb:1353:10:1353:10 | a [element] | provenance | | -| array_flow.rb:1349:9:1349:9 | [post] a [element] | array_flow.rb:1354:10:1354:10 | a [element] | provenance | | -| array_flow.rb:1349:9:1349:9 | [post] a [element] | array_flow.rb:1355:10:1355:10 | a [element] | provenance | | -| array_flow.rb:1349:9:1349:9 | a [element 2] | array_flow.rb:1349:9:1349:9 | [post] a [element] | provenance | | -| array_flow.rb:1349:9:1349:9 | a [element 2] | array_flow.rb:1349:9:1349:21 | call to slice! [element] | provenance | | -| array_flow.rb:1349:9:1349:9 | a [element 4] | array_flow.rb:1349:9:1349:9 | [post] a [element] | provenance | | -| array_flow.rb:1349:9:1349:9 | a [element 4] | array_flow.rb:1349:9:1349:21 | call to slice! [element] | provenance | | -| array_flow.rb:1349:9:1349:21 | call to slice! [element] | array_flow.rb:1349:5:1349:5 | b [element] | provenance | | -| array_flow.rb:1350:10:1350:10 | b [element] | array_flow.rb:1350:10:1350:13 | ...[...] | provenance | | -| array_flow.rb:1351:10:1351:10 | b [element] | array_flow.rb:1351:10:1351:13 | ...[...] | provenance | | -| array_flow.rb:1352:10:1352:10 | b [element] | array_flow.rb:1352:10:1352:13 | ...[...] | provenance | | -| array_flow.rb:1353:10:1353:10 | a [element] | array_flow.rb:1353:10:1353:13 | ...[...] | provenance | | -| array_flow.rb:1354:10:1354:10 | a [element] | array_flow.rb:1354:10:1354:13 | ...[...] | provenance | | -| array_flow.rb:1355:10:1355:10 | a [element] | array_flow.rb:1355:10:1355:13 | ...[...] | provenance | | -| array_flow.rb:1359:5:1359:5 | a [element 2] | array_flow.rb:1360:9:1360:9 | a [element 2] | provenance | | -| array_flow.rb:1359:9:1359:27 | call to [] [element 2] | array_flow.rb:1359:5:1359:5 | a [element 2] | provenance | | -| array_flow.rb:1359:16:1359:26 | call to source | array_flow.rb:1359:9:1359:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1360:9:1360:9 | a [element 2] | array_flow.rb:1360:27:1360:27 | x | provenance | | +| array_flow.rb:1269:9:1269:19 | call to slice! : [collection] [element] | array_flow.rb:1269:5:1269:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1270:10:1270:10 | a : [collection] [element] | array_flow.rb:1270:10:1270:13 | ...[...] | provenance | | +| array_flow.rb:1271:10:1271:10 | a : [collection] [element] | array_flow.rb:1271:10:1271:13 | ...[...] | provenance | | +| array_flow.rb:1272:10:1272:10 | a : [collection] [element] | array_flow.rb:1272:10:1272:13 | ...[...] | provenance | | +| array_flow.rb:1273:10:1273:10 | a : [collection] [element] | array_flow.rb:1273:10:1273:13 | ...[...] | provenance | | +| array_flow.rb:1277:10:1277:10 | b : [collection] [element] | array_flow.rb:1277:10:1277:13 | ...[...] | provenance | | +| array_flow.rb:1279:5:1279:5 | a : Array [element 2] | array_flow.rb:1280:9:1280:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1279:5:1279:5 | a : Array [element 4] | array_flow.rb:1280:9:1280:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1279:9:1279:47 | call to [] : Array [element 2] | array_flow.rb:1279:5:1279:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1279:9:1279:47 | call to [] : Array [element 4] | array_flow.rb:1279:5:1279:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1279:16:1279:28 | call to source | array_flow.rb:1279:9:1279:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1279:34:1279:46 | call to source | array_flow.rb:1279:9:1279:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1280:5:1280:5 | b : [collection] [element 0] | array_flow.rb:1281:10:1281:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1280:5:1280:5 | b : [collection] [element 2] | array_flow.rb:1283:10:1283:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1280:9:1280:9 | a : Array [element 2] | array_flow.rb:1280:9:1280:22 | call to slice! : [collection] [element 0] | provenance | | +| array_flow.rb:1280:9:1280:9 | a : Array [element 4] | array_flow.rb:1280:9:1280:22 | call to slice! : [collection] [element 2] | provenance | | +| array_flow.rb:1280:9:1280:22 | call to slice! : [collection] [element 0] | array_flow.rb:1280:5:1280:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1280:9:1280:22 | call to slice! : [collection] [element 2] | array_flow.rb:1280:5:1280:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1281:10:1281:10 | b : [collection] [element 0] | array_flow.rb:1281:10:1281:13 | ...[...] | provenance | | +| array_flow.rb:1283:10:1283:10 | b : [collection] [element 2] | array_flow.rb:1283:10:1283:13 | ...[...] | provenance | | +| array_flow.rb:1290:5:1290:5 | a : Array [element 2] | array_flow.rb:1291:9:1291:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1290:5:1290:5 | a : Array [element 4] | array_flow.rb:1291:9:1291:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1290:9:1290:47 | call to [] : Array [element 2] | array_flow.rb:1290:5:1290:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1290:9:1290:47 | call to [] : Array [element 4] | array_flow.rb:1290:5:1290:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1290:16:1290:28 | call to source | array_flow.rb:1290:9:1290:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1290:34:1290:46 | call to source | array_flow.rb:1290:9:1290:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1291:5:1291:5 | b : [collection] [element 0] | array_flow.rb:1292:10:1292:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1291:9:1291:9 | [post] a : [collection] [element 2] | array_flow.rb:1297:10:1297:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:1291:9:1291:9 | a : Array [element 2] | array_flow.rb:1291:9:1291:22 | call to slice! : [collection] [element 0] | provenance | | +| array_flow.rb:1291:9:1291:9 | a : Array [element 4] | array_flow.rb:1291:9:1291:9 | [post] a : [collection] [element 2] | provenance | | +| array_flow.rb:1291:9:1291:22 | call to slice! : [collection] [element 0] | array_flow.rb:1291:5:1291:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1292:10:1292:10 | b : [collection] [element 0] | array_flow.rb:1292:10:1292:13 | ...[...] | provenance | | +| array_flow.rb:1297:10:1297:10 | a : [collection] [element 2] | array_flow.rb:1297:10:1297:13 | ...[...] | provenance | | +| array_flow.rb:1301:5:1301:5 | a : Array [element 2] | array_flow.rb:1302:9:1302:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1301:5:1301:5 | a : Array [element 4] | array_flow.rb:1302:9:1302:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1301:9:1301:47 | call to [] : Array [element 2] | array_flow.rb:1301:5:1301:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1301:9:1301:47 | call to [] : Array [element 4] | array_flow.rb:1301:5:1301:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1301:16:1301:28 | call to source | array_flow.rb:1301:9:1301:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1301:34:1301:46 | call to source | array_flow.rb:1301:9:1301:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1302:5:1302:5 | b : [collection] [element 0] | array_flow.rb:1303:10:1303:10 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1302:9:1302:9 | [post] a : [collection] [element 2] | array_flow.rb:1308:10:1308:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:1302:9:1302:9 | a : Array [element 2] | array_flow.rb:1302:9:1302:23 | call to slice! : [collection] [element 0] | provenance | | +| array_flow.rb:1302:9:1302:9 | a : Array [element 4] | array_flow.rb:1302:9:1302:9 | [post] a : [collection] [element 2] | provenance | | +| array_flow.rb:1302:9:1302:23 | call to slice! : [collection] [element 0] | array_flow.rb:1302:5:1302:5 | b : [collection] [element 0] | provenance | | +| array_flow.rb:1303:10:1303:10 | b : [collection] [element 0] | array_flow.rb:1303:10:1303:13 | ...[...] | provenance | | +| array_flow.rb:1308:10:1308:10 | a : [collection] [element 2] | array_flow.rb:1308:10:1308:13 | ...[...] | provenance | | +| array_flow.rb:1312:5:1312:5 | a : Array [element 2] | array_flow.rb:1313:9:1313:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1312:5:1312:5 | a : Array [element 4] | array_flow.rb:1313:9:1313:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1312:9:1312:47 | call to [] : Array [element 2] | array_flow.rb:1312:5:1312:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1312:9:1312:47 | call to [] : Array [element 4] | array_flow.rb:1312:5:1312:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1312:16:1312:28 | call to source | array_flow.rb:1312:9:1312:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1312:34:1312:46 | call to source | array_flow.rb:1312:9:1312:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1313:5:1313:5 | b : [collection] [element] | array_flow.rb:1314:10:1314:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1313:5:1313:5 | b : [collection] [element] | array_flow.rb:1315:10:1315:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1313:5:1313:5 | b : [collection] [element] | array_flow.rb:1316:10:1316:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:9 | [post] a : [collection] [element] | array_flow.rb:1317:10:1317:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:9 | [post] a : [collection] [element] | array_flow.rb:1318:10:1318:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:9 | [post] a : [collection] [element] | array_flow.rb:1319:10:1319:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:9 | a : Array [element 2] | array_flow.rb:1313:9:1313:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:9 | a : Array [element 2] | array_flow.rb:1313:9:1313:22 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:9 | a : Array [element 4] | array_flow.rb:1313:9:1313:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:9 | a : Array [element 4] | array_flow.rb:1313:9:1313:22 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1313:9:1313:22 | call to slice! : [collection] [element] | array_flow.rb:1313:5:1313:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1314:10:1314:10 | b : [collection] [element] | array_flow.rb:1314:10:1314:13 | ...[...] | provenance | | +| array_flow.rb:1315:10:1315:10 | b : [collection] [element] | array_flow.rb:1315:10:1315:13 | ...[...] | provenance | | +| array_flow.rb:1316:10:1316:10 | b : [collection] [element] | array_flow.rb:1316:10:1316:13 | ...[...] | provenance | | +| array_flow.rb:1317:10:1317:10 | a : [collection] [element] | array_flow.rb:1317:10:1317:13 | ...[...] | provenance | | +| array_flow.rb:1318:10:1318:10 | a : [collection] [element] | array_flow.rb:1318:10:1318:13 | ...[...] | provenance | | +| array_flow.rb:1319:10:1319:10 | a : [collection] [element] | array_flow.rb:1319:10:1319:13 | ...[...] | provenance | | +| array_flow.rb:1321:5:1321:5 | a : Array [element 2] | array_flow.rb:1322:9:1322:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1321:5:1321:5 | a : Array [element 4] | array_flow.rb:1322:9:1322:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1321:9:1321:47 | call to [] : Array [element 2] | array_flow.rb:1321:5:1321:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1321:9:1321:47 | call to [] : Array [element 4] | array_flow.rb:1321:5:1321:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1321:16:1321:28 | call to source | array_flow.rb:1321:9:1321:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1321:34:1321:46 | call to source | array_flow.rb:1321:9:1321:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1322:5:1322:5 | b : [collection] [element] | array_flow.rb:1323:10:1323:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1322:5:1322:5 | b : [collection] [element] | array_flow.rb:1324:10:1324:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1322:5:1322:5 | b : [collection] [element] | array_flow.rb:1325:10:1325:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:9 | [post] a : [collection] [element] | array_flow.rb:1326:10:1326:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:9 | [post] a : [collection] [element] | array_flow.rb:1327:10:1327:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:9 | [post] a : [collection] [element] | array_flow.rb:1328:10:1328:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:9 | a : Array [element 2] | array_flow.rb:1322:9:1322:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:9 | a : Array [element 2] | array_flow.rb:1322:9:1322:22 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:9 | a : Array [element 4] | array_flow.rb:1322:9:1322:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:9 | a : Array [element 4] | array_flow.rb:1322:9:1322:22 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1322:9:1322:22 | call to slice! : [collection] [element] | array_flow.rb:1322:5:1322:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1323:10:1323:10 | b : [collection] [element] | array_flow.rb:1323:10:1323:13 | ...[...] | provenance | | +| array_flow.rb:1324:10:1324:10 | b : [collection] [element] | array_flow.rb:1324:10:1324:13 | ...[...] | provenance | | +| array_flow.rb:1325:10:1325:10 | b : [collection] [element] | array_flow.rb:1325:10:1325:13 | ...[...] | provenance | | +| array_flow.rb:1326:10:1326:10 | a : [collection] [element] | array_flow.rb:1326:10:1326:13 | ...[...] | provenance | | +| array_flow.rb:1327:10:1327:10 | a : [collection] [element] | array_flow.rb:1327:10:1327:13 | ...[...] | provenance | | +| array_flow.rb:1328:10:1328:10 | a : [collection] [element] | array_flow.rb:1328:10:1328:13 | ...[...] | provenance | | +| array_flow.rb:1330:5:1330:5 | a : Array [element 2] | array_flow.rb:1331:9:1331:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1330:5:1330:5 | a : Array [element 4] | array_flow.rb:1331:9:1331:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1330:9:1330:47 | call to [] : Array [element 2] | array_flow.rb:1330:5:1330:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1330:9:1330:47 | call to [] : Array [element 4] | array_flow.rb:1330:5:1330:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1330:16:1330:28 | call to source | array_flow.rb:1330:9:1330:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1330:34:1330:46 | call to source | array_flow.rb:1330:9:1330:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1331:5:1331:5 | b : [collection] [element] | array_flow.rb:1332:10:1332:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1331:5:1331:5 | b : [collection] [element] | array_flow.rb:1333:10:1333:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1331:5:1331:5 | b : [collection] [element] | array_flow.rb:1334:10:1334:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:9 | [post] a : [collection] [element] | array_flow.rb:1335:10:1335:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:9 | [post] a : [collection] [element] | array_flow.rb:1336:10:1336:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:9 | [post] a : [collection] [element] | array_flow.rb:1337:10:1337:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:9 | a : Array [element 2] | array_flow.rb:1331:9:1331:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:9 | a : Array [element 2] | array_flow.rb:1331:9:1331:25 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:9 | a : Array [element 4] | array_flow.rb:1331:9:1331:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:9 | a : Array [element 4] | array_flow.rb:1331:9:1331:25 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1331:9:1331:25 | call to slice! : [collection] [element] | array_flow.rb:1331:5:1331:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1332:10:1332:10 | b : [collection] [element] | array_flow.rb:1332:10:1332:13 | ...[...] | provenance | | +| array_flow.rb:1333:10:1333:10 | b : [collection] [element] | array_flow.rb:1333:10:1333:13 | ...[...] | provenance | | +| array_flow.rb:1334:10:1334:10 | b : [collection] [element] | array_flow.rb:1334:10:1334:13 | ...[...] | provenance | | +| array_flow.rb:1335:10:1335:10 | a : [collection] [element] | array_flow.rb:1335:10:1335:13 | ...[...] | provenance | | +| array_flow.rb:1336:10:1336:10 | a : [collection] [element] | array_flow.rb:1336:10:1336:13 | ...[...] | provenance | | +| array_flow.rb:1337:10:1337:10 | a : [collection] [element] | array_flow.rb:1337:10:1337:13 | ...[...] | provenance | | +| array_flow.rb:1339:5:1339:5 | a : Array [element 2] | array_flow.rb:1340:9:1340:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1339:5:1339:5 | a : Array [element 4] | array_flow.rb:1340:9:1340:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1339:9:1339:47 | call to [] : Array [element 2] | array_flow.rb:1339:5:1339:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1339:9:1339:47 | call to [] : Array [element 4] | array_flow.rb:1339:5:1339:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1339:16:1339:28 | call to source | array_flow.rb:1339:9:1339:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1339:34:1339:46 | call to source | array_flow.rb:1339:9:1339:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1340:5:1340:5 | b : [collection] [element 2] | array_flow.rb:1343:10:1343:10 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1340:9:1340:9 | [post] a : [collection] [element 1] | array_flow.rb:1345:10:1345:10 | a : [collection] [element 1] | provenance | | +| array_flow.rb:1340:9:1340:9 | a : Array [element 2] | array_flow.rb:1340:9:1340:21 | call to slice! : [collection] [element 2] | provenance | | +| array_flow.rb:1340:9:1340:9 | a : Array [element 4] | array_flow.rb:1340:9:1340:9 | [post] a : [collection] [element 1] | provenance | | +| array_flow.rb:1340:9:1340:21 | call to slice! : [collection] [element 2] | array_flow.rb:1340:5:1340:5 | b : [collection] [element 2] | provenance | | +| array_flow.rb:1343:10:1343:10 | b : [collection] [element 2] | array_flow.rb:1343:10:1343:13 | ...[...] | provenance | | +| array_flow.rb:1345:10:1345:10 | a : [collection] [element 1] | array_flow.rb:1345:10:1345:13 | ...[...] | provenance | | +| array_flow.rb:1348:5:1348:5 | a : Array [element 2] | array_flow.rb:1349:9:1349:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1348:5:1348:5 | a : Array [element 4] | array_flow.rb:1349:9:1349:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1348:9:1348:47 | call to [] : Array [element 2] | array_flow.rb:1348:5:1348:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1348:9:1348:47 | call to [] : Array [element 4] | array_flow.rb:1348:5:1348:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1348:16:1348:28 | call to source | array_flow.rb:1348:9:1348:47 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1348:34:1348:46 | call to source | array_flow.rb:1348:9:1348:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1349:5:1349:5 | b : [collection] [element] | array_flow.rb:1350:10:1350:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1349:5:1349:5 | b : [collection] [element] | array_flow.rb:1351:10:1351:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1349:5:1349:5 | b : [collection] [element] | array_flow.rb:1352:10:1352:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:9 | [post] a : [collection] [element] | array_flow.rb:1353:10:1353:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:9 | [post] a : [collection] [element] | array_flow.rb:1354:10:1354:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:9 | [post] a : [collection] [element] | array_flow.rb:1355:10:1355:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:9 | a : Array [element 2] | array_flow.rb:1349:9:1349:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:9 | a : Array [element 2] | array_flow.rb:1349:9:1349:21 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:9 | a : Array [element 4] | array_flow.rb:1349:9:1349:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:9 | a : Array [element 4] | array_flow.rb:1349:9:1349:21 | call to slice! : [collection] [element] | provenance | | +| array_flow.rb:1349:9:1349:21 | call to slice! : [collection] [element] | array_flow.rb:1349:5:1349:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1350:10:1350:10 | b : [collection] [element] | array_flow.rb:1350:10:1350:13 | ...[...] | provenance | | +| array_flow.rb:1351:10:1351:10 | b : [collection] [element] | array_flow.rb:1351:10:1351:13 | ...[...] | provenance | | +| array_flow.rb:1352:10:1352:10 | b : [collection] [element] | array_flow.rb:1352:10:1352:13 | ...[...] | provenance | | +| array_flow.rb:1353:10:1353:10 | a : [collection] [element] | array_flow.rb:1353:10:1353:13 | ...[...] | provenance | | +| array_flow.rb:1354:10:1354:10 | a : [collection] [element] | array_flow.rb:1354:10:1354:13 | ...[...] | provenance | | +| array_flow.rb:1355:10:1355:10 | a : [collection] [element] | array_flow.rb:1355:10:1355:13 | ...[...] | provenance | | +| array_flow.rb:1359:5:1359:5 | a : Array [element 2] | array_flow.rb:1360:9:1360:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1359:9:1359:27 | call to [] : Array [element 2] | array_flow.rb:1359:5:1359:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1359:16:1359:26 | call to source | array_flow.rb:1359:9:1359:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1360:9:1360:9 | a : Array [element 2] | array_flow.rb:1360:27:1360:27 | x | provenance | | | array_flow.rb:1360:27:1360:27 | x | array_flow.rb:1361:14:1361:14 | x | provenance | | -| array_flow.rb:1367:5:1367:5 | a [element 2] | array_flow.rb:1368:9:1368:9 | a [element 2] | provenance | | -| array_flow.rb:1367:9:1367:27 | call to [] [element 2] | array_flow.rb:1367:5:1367:5 | a [element 2] | provenance | | -| array_flow.rb:1367:16:1367:26 | call to source | array_flow.rb:1367:9:1367:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1368:9:1368:9 | a [element 2] | array_flow.rb:1368:28:1368:28 | x | provenance | | +| array_flow.rb:1367:5:1367:5 | a : Array [element 2] | array_flow.rb:1368:9:1368:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1367:9:1367:27 | call to [] : Array [element 2] | array_flow.rb:1367:5:1367:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1367:16:1367:26 | call to source | array_flow.rb:1367:9:1367:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1368:9:1368:9 | a : Array [element 2] | array_flow.rb:1368:28:1368:28 | x | provenance | | | array_flow.rb:1368:28:1368:28 | x | array_flow.rb:1369:14:1369:14 | x | provenance | | -| array_flow.rb:1375:5:1375:5 | a [element 2] | array_flow.rb:1376:9:1376:9 | a [element 2] | provenance | | -| array_flow.rb:1375:9:1375:27 | call to [] [element 2] | array_flow.rb:1375:5:1375:5 | a [element 2] | provenance | | -| array_flow.rb:1375:16:1375:26 | call to source | array_flow.rb:1375:9:1375:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1376:9:1376:9 | a [element 2] | array_flow.rb:1376:26:1376:26 | x | provenance | | -| array_flow.rb:1376:9:1376:9 | a [element 2] | array_flow.rb:1376:29:1376:29 | y | provenance | | +| array_flow.rb:1375:5:1375:5 | a : Array [element 2] | array_flow.rb:1376:9:1376:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1375:9:1375:27 | call to [] : Array [element 2] | array_flow.rb:1375:5:1375:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1375:16:1375:26 | call to source | array_flow.rb:1375:9:1375:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1376:9:1376:9 | a : Array [element 2] | array_flow.rb:1376:26:1376:26 | x | provenance | | +| array_flow.rb:1376:9:1376:9 | a : Array [element 2] | array_flow.rb:1376:29:1376:29 | y | provenance | | | array_flow.rb:1376:26:1376:26 | x | array_flow.rb:1377:14:1377:14 | x | provenance | | | array_flow.rb:1376:29:1376:29 | y | array_flow.rb:1378:14:1378:14 | y | provenance | | -| array_flow.rb:1383:5:1383:5 | a [element 2] | array_flow.rb:1384:9:1384:9 | a [element 2] | provenance | | -| array_flow.rb:1383:5:1383:5 | a [element 2] | array_flow.rb:1387:9:1387:9 | a [element 2] | provenance | | -| array_flow.rb:1383:9:1383:27 | call to [] [element 2] | array_flow.rb:1383:5:1383:5 | a [element 2] | provenance | | -| array_flow.rb:1383:16:1383:26 | call to source | array_flow.rb:1383:9:1383:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1384:5:1384:5 | b [element] | array_flow.rb:1385:10:1385:10 | b [element] | provenance | | -| array_flow.rb:1384:5:1384:5 | b [element] | array_flow.rb:1386:10:1386:10 | b [element] | provenance | | -| array_flow.rb:1384:9:1384:9 | a [element 2] | array_flow.rb:1384:9:1384:14 | call to sort [element] | provenance | | -| array_flow.rb:1384:9:1384:14 | call to sort [element] | array_flow.rb:1384:5:1384:5 | b [element] | provenance | | -| array_flow.rb:1385:10:1385:10 | b [element] | array_flow.rb:1385:10:1385:13 | ...[...] | provenance | | -| array_flow.rb:1386:10:1386:10 | b [element] | array_flow.rb:1386:10:1386:13 | ...[...] | provenance | | -| array_flow.rb:1387:5:1387:5 | c [element] | array_flow.rb:1392:10:1392:10 | c [element] | provenance | | -| array_flow.rb:1387:5:1387:5 | c [element] | array_flow.rb:1393:10:1393:10 | c [element] | provenance | | -| array_flow.rb:1387:9:1387:9 | a [element 2] | array_flow.rb:1387:9:1391:7 | call to sort [element] | provenance | | -| array_flow.rb:1387:9:1387:9 | a [element 2] | array_flow.rb:1387:20:1387:20 | x | provenance | | -| array_flow.rb:1387:9:1387:9 | a [element 2] | array_flow.rb:1387:23:1387:23 | y | provenance | | -| array_flow.rb:1387:9:1391:7 | call to sort [element] | array_flow.rb:1387:5:1387:5 | c [element] | provenance | | +| array_flow.rb:1383:5:1383:5 | a : Array [element 2] | array_flow.rb:1384:9:1384:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1383:5:1383:5 | a : Array [element 2] | array_flow.rb:1387:9:1387:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1383:9:1383:27 | call to [] : Array [element 2] | array_flow.rb:1383:5:1383:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1383:16:1383:26 | call to source | array_flow.rb:1383:9:1383:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1384:5:1384:5 | b : [collection] [element] | array_flow.rb:1385:10:1385:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1384:5:1384:5 | b : [collection] [element] | array_flow.rb:1386:10:1386:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1384:9:1384:9 | a : Array [element 2] | array_flow.rb:1384:9:1384:14 | call to sort : [collection] [element] | provenance | | +| array_flow.rb:1384:9:1384:14 | call to sort : [collection] [element] | array_flow.rb:1384:5:1384:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1385:10:1385:10 | b : [collection] [element] | array_flow.rb:1385:10:1385:13 | ...[...] | provenance | | +| array_flow.rb:1386:10:1386:10 | b : [collection] [element] | array_flow.rb:1386:10:1386:13 | ...[...] | provenance | | +| array_flow.rb:1387:5:1387:5 | c : [collection] [element] | array_flow.rb:1392:10:1392:10 | c : [collection] [element] | provenance | | +| array_flow.rb:1387:5:1387:5 | c : [collection] [element] | array_flow.rb:1393:10:1393:10 | c : [collection] [element] | provenance | | +| array_flow.rb:1387:9:1387:9 | a : Array [element 2] | array_flow.rb:1387:9:1391:7 | call to sort : [collection] [element] | provenance | | +| array_flow.rb:1387:9:1387:9 | a : Array [element 2] | array_flow.rb:1387:20:1387:20 | x | provenance | | +| array_flow.rb:1387:9:1387:9 | a : Array [element 2] | array_flow.rb:1387:23:1387:23 | y | provenance | | +| array_flow.rb:1387:9:1391:7 | call to sort : [collection] [element] | array_flow.rb:1387:5:1387:5 | c : [collection] [element] | provenance | | | array_flow.rb:1387:20:1387:20 | x | array_flow.rb:1388:14:1388:14 | x | provenance | | | array_flow.rb:1387:23:1387:23 | y | array_flow.rb:1389:14:1389:14 | y | provenance | | -| array_flow.rb:1392:10:1392:10 | c [element] | array_flow.rb:1392:10:1392:13 | ...[...] | provenance | | -| array_flow.rb:1393:10:1393:10 | c [element] | array_flow.rb:1393:10:1393:13 | ...[...] | provenance | | -| array_flow.rb:1397:5:1397:5 | a [element 2] | array_flow.rb:1398:9:1398:9 | a [element 2] | provenance | | -| array_flow.rb:1397:9:1397:27 | call to [] [element 2] | array_flow.rb:1397:5:1397:5 | a [element 2] | provenance | | -| array_flow.rb:1397:16:1397:26 | call to source | array_flow.rb:1397:9:1397:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1398:5:1398:5 | b [element] | array_flow.rb:1399:10:1399:10 | b [element] | provenance | | -| array_flow.rb:1398:5:1398:5 | b [element] | array_flow.rb:1400:10:1400:10 | b [element] | provenance | | -| array_flow.rb:1398:9:1398:9 | [post] a [element] | array_flow.rb:1401:10:1401:10 | a [element] | provenance | | -| array_flow.rb:1398:9:1398:9 | [post] a [element] | array_flow.rb:1402:10:1402:10 | a [element] | provenance | | -| array_flow.rb:1398:9:1398:9 | a [element 2] | array_flow.rb:1398:9:1398:9 | [post] a [element] | provenance | | -| array_flow.rb:1398:9:1398:9 | a [element 2] | array_flow.rb:1398:9:1398:15 | call to sort! [element] | provenance | | -| array_flow.rb:1398:9:1398:15 | call to sort! [element] | array_flow.rb:1398:5:1398:5 | b [element] | provenance | | -| array_flow.rb:1399:10:1399:10 | b [element] | array_flow.rb:1399:10:1399:13 | ...[...] | provenance | | -| array_flow.rb:1400:10:1400:10 | b [element] | array_flow.rb:1400:10:1400:13 | ...[...] | provenance | | -| array_flow.rb:1401:10:1401:10 | a [element] | array_flow.rb:1401:10:1401:13 | ...[...] | provenance | | -| array_flow.rb:1402:10:1402:10 | a [element] | array_flow.rb:1402:10:1402:13 | ...[...] | provenance | | -| array_flow.rb:1404:5:1404:5 | a [element 2] | array_flow.rb:1405:9:1405:9 | a [element 2] | provenance | | -| array_flow.rb:1404:9:1404:27 | call to [] [element 2] | array_flow.rb:1404:5:1404:5 | a [element 2] | provenance | | -| array_flow.rb:1404:16:1404:26 | call to source | array_flow.rb:1404:9:1404:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1405:5:1405:5 | b [element] | array_flow.rb:1410:10:1410:10 | b [element] | provenance | | -| array_flow.rb:1405:5:1405:5 | b [element] | array_flow.rb:1411:10:1411:10 | b [element] | provenance | | -| array_flow.rb:1405:9:1405:9 | [post] a [element] | array_flow.rb:1412:10:1412:10 | a [element] | provenance | | -| array_flow.rb:1405:9:1405:9 | [post] a [element] | array_flow.rb:1413:10:1413:10 | a [element] | provenance | | -| array_flow.rb:1405:9:1405:9 | a [element 2] | array_flow.rb:1405:9:1405:9 | [post] a [element] | provenance | | -| array_flow.rb:1405:9:1405:9 | a [element 2] | array_flow.rb:1405:9:1409:7 | call to sort! [element] | provenance | | -| array_flow.rb:1405:9:1405:9 | a [element 2] | array_flow.rb:1405:21:1405:21 | x | provenance | | -| array_flow.rb:1405:9:1405:9 | a [element 2] | array_flow.rb:1405:24:1405:24 | y | provenance | | -| array_flow.rb:1405:9:1409:7 | call to sort! [element] | array_flow.rb:1405:5:1405:5 | b [element] | provenance | | +| array_flow.rb:1392:10:1392:10 | c : [collection] [element] | array_flow.rb:1392:10:1392:13 | ...[...] | provenance | | +| array_flow.rb:1393:10:1393:10 | c : [collection] [element] | array_flow.rb:1393:10:1393:13 | ...[...] | provenance | | +| array_flow.rb:1397:5:1397:5 | a : Array [element 2] | array_flow.rb:1398:9:1398:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1397:9:1397:27 | call to [] : Array [element 2] | array_flow.rb:1397:5:1397:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1397:16:1397:26 | call to source | array_flow.rb:1397:9:1397:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1398:5:1398:5 | b : [collection] [element] | array_flow.rb:1399:10:1399:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1398:5:1398:5 | b : [collection] [element] | array_flow.rb:1400:10:1400:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1398:9:1398:9 | [post] a : [collection] [element] | array_flow.rb:1401:10:1401:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1398:9:1398:9 | [post] a : [collection] [element] | array_flow.rb:1402:10:1402:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1398:9:1398:9 | a : Array [element 2] | array_flow.rb:1398:9:1398:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1398:9:1398:9 | a : Array [element 2] | array_flow.rb:1398:9:1398:15 | call to sort! : [collection] [element] | provenance | | +| array_flow.rb:1398:9:1398:15 | call to sort! : [collection] [element] | array_flow.rb:1398:5:1398:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1399:10:1399:10 | b : [collection] [element] | array_flow.rb:1399:10:1399:13 | ...[...] | provenance | | +| array_flow.rb:1400:10:1400:10 | b : [collection] [element] | array_flow.rb:1400:10:1400:13 | ...[...] | provenance | | +| array_flow.rb:1401:10:1401:10 | a : [collection] [element] | array_flow.rb:1401:10:1401:13 | ...[...] | provenance | | +| array_flow.rb:1402:10:1402:10 | a : [collection] [element] | array_flow.rb:1402:10:1402:13 | ...[...] | provenance | | +| array_flow.rb:1404:5:1404:5 | a : Array [element 2] | array_flow.rb:1405:9:1405:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1404:9:1404:27 | call to [] : Array [element 2] | array_flow.rb:1404:5:1404:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1404:16:1404:26 | call to source | array_flow.rb:1404:9:1404:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1405:5:1405:5 | b : [collection] [element] | array_flow.rb:1410:10:1410:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1405:5:1405:5 | b : [collection] [element] | array_flow.rb:1411:10:1411:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1405:9:1405:9 | [post] a : [collection] [element] | array_flow.rb:1412:10:1412:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1405:9:1405:9 | [post] a : [collection] [element] | array_flow.rb:1413:10:1413:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1405:9:1405:9 | a : Array [element 2] | array_flow.rb:1405:9:1405:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1405:9:1405:9 | a : Array [element 2] | array_flow.rb:1405:9:1409:7 | call to sort! : [collection] [element] | provenance | | +| array_flow.rb:1405:9:1405:9 | a : Array [element 2] | array_flow.rb:1405:21:1405:21 | x | provenance | | +| array_flow.rb:1405:9:1405:9 | a : Array [element 2] | array_flow.rb:1405:24:1405:24 | y | provenance | | +| array_flow.rb:1405:9:1409:7 | call to sort! : [collection] [element] | array_flow.rb:1405:5:1405:5 | b : [collection] [element] | provenance | | | array_flow.rb:1405:21:1405:21 | x | array_flow.rb:1406:14:1406:14 | x | provenance | | | array_flow.rb:1405:24:1405:24 | y | array_flow.rb:1407:14:1407:14 | y | provenance | | -| array_flow.rb:1410:10:1410:10 | b [element] | array_flow.rb:1410:10:1410:13 | ...[...] | provenance | | -| array_flow.rb:1411:10:1411:10 | b [element] | array_flow.rb:1411:10:1411:13 | ...[...] | provenance | | -| array_flow.rb:1412:10:1412:10 | a [element] | array_flow.rb:1412:10:1412:13 | ...[...] | provenance | | -| array_flow.rb:1413:10:1413:10 | a [element] | array_flow.rb:1413:10:1413:13 | ...[...] | provenance | | -| array_flow.rb:1417:5:1417:5 | a [element 2] | array_flow.rb:1418:9:1418:9 | a [element 2] | provenance | | -| array_flow.rb:1417:9:1417:27 | call to [] [element 2] | array_flow.rb:1417:5:1417:5 | a [element 2] | provenance | | -| array_flow.rb:1417:16:1417:26 | call to source | array_flow.rb:1417:9:1417:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1418:5:1418:5 | b [element] | array_flow.rb:1422:10:1422:10 | b [element] | provenance | | -| array_flow.rb:1418:5:1418:5 | b [element] | array_flow.rb:1423:10:1423:10 | b [element] | provenance | | -| array_flow.rb:1418:9:1418:9 | a [element 2] | array_flow.rb:1418:9:1421:7 | call to sort_by [element] | provenance | | -| array_flow.rb:1418:9:1418:9 | a [element 2] | array_flow.rb:1418:23:1418:23 | x | provenance | | -| array_flow.rb:1418:9:1421:7 | call to sort_by [element] | array_flow.rb:1418:5:1418:5 | b [element] | provenance | | +| array_flow.rb:1410:10:1410:10 | b : [collection] [element] | array_flow.rb:1410:10:1410:13 | ...[...] | provenance | | +| array_flow.rb:1411:10:1411:10 | b : [collection] [element] | array_flow.rb:1411:10:1411:13 | ...[...] | provenance | | +| array_flow.rb:1412:10:1412:10 | a : [collection] [element] | array_flow.rb:1412:10:1412:13 | ...[...] | provenance | | +| array_flow.rb:1413:10:1413:10 | a : [collection] [element] | array_flow.rb:1413:10:1413:13 | ...[...] | provenance | | +| array_flow.rb:1417:5:1417:5 | a : Array [element 2] | array_flow.rb:1418:9:1418:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1417:9:1417:27 | call to [] : Array [element 2] | array_flow.rb:1417:5:1417:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1417:16:1417:26 | call to source | array_flow.rb:1417:9:1417:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1418:5:1418:5 | b : [collection] [element] | array_flow.rb:1422:10:1422:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1418:5:1418:5 | b : [collection] [element] | array_flow.rb:1423:10:1423:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1418:9:1418:9 | a : Array [element 2] | array_flow.rb:1418:9:1421:7 | call to sort_by : [collection] [element] | provenance | | +| array_flow.rb:1418:9:1418:9 | a : Array [element 2] | array_flow.rb:1418:23:1418:23 | x | provenance | | +| array_flow.rb:1418:9:1421:7 | call to sort_by : [collection] [element] | array_flow.rb:1418:5:1418:5 | b : [collection] [element] | provenance | | | array_flow.rb:1418:23:1418:23 | x | array_flow.rb:1419:14:1419:14 | x | provenance | | -| array_flow.rb:1422:10:1422:10 | b [element] | array_flow.rb:1422:10:1422:13 | ...[...] | provenance | | -| array_flow.rb:1423:10:1423:10 | b [element] | array_flow.rb:1423:10:1423:13 | ...[...] | provenance | | -| array_flow.rb:1427:5:1427:5 | a [element 2] | array_flow.rb:1428:9:1428:9 | a [element 2] | provenance | | -| array_flow.rb:1427:9:1427:27 | call to [] [element 2] | array_flow.rb:1427:5:1427:5 | a [element 2] | provenance | | -| array_flow.rb:1427:16:1427:26 | call to source | array_flow.rb:1427:9:1427:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1428:5:1428:5 | b [element] | array_flow.rb:1434:10:1434:10 | b [element] | provenance | | -| array_flow.rb:1428:5:1428:5 | b [element] | array_flow.rb:1435:10:1435:10 | b [element] | provenance | | -| array_flow.rb:1428:9:1428:9 | [post] a [element] | array_flow.rb:1432:10:1432:10 | a [element] | provenance | | -| array_flow.rb:1428:9:1428:9 | [post] a [element] | array_flow.rb:1433:10:1433:10 | a [element] | provenance | | -| array_flow.rb:1428:9:1428:9 | a [element 2] | array_flow.rb:1428:9:1428:9 | [post] a [element] | provenance | | -| array_flow.rb:1428:9:1428:9 | a [element 2] | array_flow.rb:1428:9:1431:7 | call to sort_by! [element] | provenance | | -| array_flow.rb:1428:9:1428:9 | a [element 2] | array_flow.rb:1428:24:1428:24 | x | provenance | | -| array_flow.rb:1428:9:1431:7 | call to sort_by! [element] | array_flow.rb:1428:5:1428:5 | b [element] | provenance | | +| array_flow.rb:1422:10:1422:10 | b : [collection] [element] | array_flow.rb:1422:10:1422:13 | ...[...] | provenance | | +| array_flow.rb:1423:10:1423:10 | b : [collection] [element] | array_flow.rb:1423:10:1423:13 | ...[...] | provenance | | +| array_flow.rb:1427:5:1427:5 | a : Array [element 2] | array_flow.rb:1428:9:1428:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1427:9:1427:27 | call to [] : Array [element 2] | array_flow.rb:1427:5:1427:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1427:16:1427:26 | call to source | array_flow.rb:1427:9:1427:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1428:5:1428:5 | b : [collection] [element] | array_flow.rb:1434:10:1434:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1428:5:1428:5 | b : [collection] [element] | array_flow.rb:1435:10:1435:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1428:9:1428:9 | [post] a : [collection] [element] | array_flow.rb:1432:10:1432:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1428:9:1428:9 | [post] a : [collection] [element] | array_flow.rb:1433:10:1433:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1428:9:1428:9 | a : Array [element 2] | array_flow.rb:1428:9:1428:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1428:9:1428:9 | a : Array [element 2] | array_flow.rb:1428:9:1431:7 | call to sort_by! : [collection] [element] | provenance | | +| array_flow.rb:1428:9:1428:9 | a : Array [element 2] | array_flow.rb:1428:24:1428:24 | x | provenance | | +| array_flow.rb:1428:9:1431:7 | call to sort_by! : [collection] [element] | array_flow.rb:1428:5:1428:5 | b : [collection] [element] | provenance | | | array_flow.rb:1428:24:1428:24 | x | array_flow.rb:1429:14:1429:14 | x | provenance | | -| array_flow.rb:1432:10:1432:10 | a [element] | array_flow.rb:1432:10:1432:13 | ...[...] | provenance | | -| array_flow.rb:1433:10:1433:10 | a [element] | array_flow.rb:1433:10:1433:13 | ...[...] | provenance | | -| array_flow.rb:1434:10:1434:10 | b [element] | array_flow.rb:1434:10:1434:13 | ...[...] | provenance | | -| array_flow.rb:1435:10:1435:10 | b [element] | array_flow.rb:1435:10:1435:13 | ...[...] | provenance | | -| array_flow.rb:1439:5:1439:5 | a [element 2] | array_flow.rb:1440:9:1440:9 | a [element 2] | provenance | | -| array_flow.rb:1439:9:1439:27 | call to [] [element 2] | array_flow.rb:1439:5:1439:5 | a [element 2] | provenance | | -| array_flow.rb:1439:16:1439:26 | call to source | array_flow.rb:1439:9:1439:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1440:9:1440:9 | a [element 2] | array_flow.rb:1440:19:1440:19 | x | provenance | | +| array_flow.rb:1432:10:1432:10 | a : [collection] [element] | array_flow.rb:1432:10:1432:13 | ...[...] | provenance | | +| array_flow.rb:1433:10:1433:10 | a : [collection] [element] | array_flow.rb:1433:10:1433:13 | ...[...] | provenance | | +| array_flow.rb:1434:10:1434:10 | b : [collection] [element] | array_flow.rb:1434:10:1434:13 | ...[...] | provenance | | +| array_flow.rb:1435:10:1435:10 | b : [collection] [element] | array_flow.rb:1435:10:1435:13 | ...[...] | provenance | | +| array_flow.rb:1439:5:1439:5 | a : Array [element 2] | array_flow.rb:1440:9:1440:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1439:9:1439:27 | call to [] : Array [element 2] | array_flow.rb:1439:5:1439:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1439:16:1439:26 | call to source | array_flow.rb:1439:9:1439:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1440:9:1440:9 | a : Array [element 2] | array_flow.rb:1440:19:1440:19 | x | provenance | | | array_flow.rb:1440:19:1440:19 | x | array_flow.rb:1441:14:1441:14 | x | provenance | | -| array_flow.rb:1447:5:1447:5 | a [element 2] | array_flow.rb:1448:9:1448:9 | a [element 2] | provenance | | -| array_flow.rb:1447:5:1447:5 | a [element 2] | array_flow.rb:1453:9:1453:9 | a [element 2] | provenance | | -| array_flow.rb:1447:5:1447:5 | a [element 2] | array_flow.rb:1459:9:1459:9 | a [element 2] | provenance | | -| array_flow.rb:1447:5:1447:5 | a [element 2] | array_flow.rb:1466:9:1466:9 | a [element 2] | provenance | | -| array_flow.rb:1447:5:1447:5 | a [element 3] | array_flow.rb:1448:9:1448:9 | a [element 3] | provenance | | -| array_flow.rb:1447:5:1447:5 | a [element 3] | array_flow.rb:1459:9:1459:9 | a [element 3] | provenance | | -| array_flow.rb:1447:9:1447:44 | call to [] [element 2] | array_flow.rb:1447:5:1447:5 | a [element 2] | provenance | | -| array_flow.rb:1447:9:1447:44 | call to [] [element 3] | array_flow.rb:1447:5:1447:5 | a [element 3] | provenance | | -| array_flow.rb:1447:16:1447:28 | call to source | array_flow.rb:1447:9:1447:44 | call to [] [element 2] | provenance | | -| array_flow.rb:1447:31:1447:43 | call to source | array_flow.rb:1447:9:1447:44 | call to [] [element 3] | provenance | | -| array_flow.rb:1448:5:1448:5 | b [element 2] | array_flow.rb:1451:10:1451:10 | b [element 2] | provenance | | -| array_flow.rb:1448:5:1448:5 | b [element 3] | array_flow.rb:1452:10:1452:10 | b [element 3] | provenance | | -| array_flow.rb:1448:9:1448:9 | a [element 2] | array_flow.rb:1448:9:1448:17 | call to take [element 2] | provenance | | -| array_flow.rb:1448:9:1448:9 | a [element 3] | array_flow.rb:1448:9:1448:17 | call to take [element 3] | provenance | | -| array_flow.rb:1448:9:1448:17 | call to take [element 2] | array_flow.rb:1448:5:1448:5 | b [element 2] | provenance | | -| array_flow.rb:1448:9:1448:17 | call to take [element 3] | array_flow.rb:1448:5:1448:5 | b [element 3] | provenance | | -| array_flow.rb:1451:10:1451:10 | b [element 2] | array_flow.rb:1451:10:1451:13 | ...[...] | provenance | | -| array_flow.rb:1452:10:1452:10 | b [element 3] | array_flow.rb:1452:10:1452:13 | ...[...] | provenance | | -| array_flow.rb:1453:5:1453:5 | b [element 2] | array_flow.rb:1456:10:1456:10 | b [element 2] | provenance | | -| array_flow.rb:1453:5:1453:5 | b [element 2] | array_flow.rb:1458:10:1458:10 | b [element 2] | provenance | | -| array_flow.rb:1453:9:1453:9 | a [element 2] | array_flow.rb:1453:9:1453:17 | call to take [element 2] | provenance | | -| array_flow.rb:1453:9:1453:17 | call to take [element 2] | array_flow.rb:1453:5:1453:5 | b [element 2] | provenance | | -| array_flow.rb:1456:10:1456:10 | b [element 2] | array_flow.rb:1456:10:1456:13 | ...[...] | provenance | | -| array_flow.rb:1458:10:1458:10 | b [element 2] | array_flow.rb:1458:10:1458:13 | ...[...] | provenance | | -| array_flow.rb:1459:5:1459:5 | b [element 2] | array_flow.rb:1462:10:1462:10 | b [element 2] | provenance | | -| array_flow.rb:1459:5:1459:5 | b [element 2] | array_flow.rb:1464:10:1464:10 | b [element 2] | provenance | | -| array_flow.rb:1459:5:1459:5 | b [element 3] | array_flow.rb:1463:10:1463:10 | b [element 3] | provenance | | -| array_flow.rb:1459:5:1459:5 | b [element 3] | array_flow.rb:1464:10:1464:10 | b [element 3] | provenance | | -| array_flow.rb:1459:9:1459:9 | a [element 2] | array_flow.rb:1459:9:1459:19 | call to take [element 2] | provenance | | -| array_flow.rb:1459:9:1459:9 | a [element 3] | array_flow.rb:1459:9:1459:19 | call to take [element 3] | provenance | | -| array_flow.rb:1459:9:1459:19 | call to take [element 2] | array_flow.rb:1459:5:1459:5 | b [element 2] | provenance | | -| array_flow.rb:1459:9:1459:19 | call to take [element 3] | array_flow.rb:1459:5:1459:5 | b [element 3] | provenance | | -| array_flow.rb:1462:10:1462:10 | b [element 2] | array_flow.rb:1462:10:1462:13 | ...[...] | provenance | | -| array_flow.rb:1463:10:1463:10 | b [element 3] | array_flow.rb:1463:10:1463:13 | ...[...] | provenance | | -| array_flow.rb:1464:10:1464:10 | b [element 2] | array_flow.rb:1464:10:1464:13 | ...[...] | provenance | | -| array_flow.rb:1464:10:1464:10 | b [element 3] | array_flow.rb:1464:10:1464:13 | ...[...] | provenance | | -| array_flow.rb:1465:5:1465:5 | [post] a [element] | array_flow.rb:1466:9:1466:9 | a [element] | provenance | | -| array_flow.rb:1465:12:1465:24 | call to source | array_flow.rb:1465:5:1465:5 | [post] a [element] | provenance | | -| array_flow.rb:1466:5:1466:5 | b [element 2] | array_flow.rb:1467:10:1467:10 | b [element 2] | provenance | | -| array_flow.rb:1466:5:1466:5 | b [element] | array_flow.rb:1467:10:1467:10 | b [element] | provenance | | -| array_flow.rb:1466:9:1466:9 | a [element 2] | array_flow.rb:1466:9:1466:17 | call to take [element 2] | provenance | | -| array_flow.rb:1466:9:1466:9 | a [element] | array_flow.rb:1466:9:1466:17 | call to take [element] | provenance | | -| array_flow.rb:1466:9:1466:17 | call to take [element 2] | array_flow.rb:1466:5:1466:5 | b [element 2] | provenance | | -| array_flow.rb:1466:9:1466:17 | call to take [element] | array_flow.rb:1466:5:1466:5 | b [element] | provenance | | -| array_flow.rb:1467:10:1467:10 | b [element 2] | array_flow.rb:1467:10:1467:13 | ...[...] | provenance | | -| array_flow.rb:1467:10:1467:10 | b [element] | array_flow.rb:1467:10:1467:13 | ...[...] | provenance | | -| array_flow.rb:1471:5:1471:5 | a [element 2] | array_flow.rb:1472:9:1472:9 | a [element 2] | provenance | | -| array_flow.rb:1471:9:1471:27 | call to [] [element 2] | array_flow.rb:1471:5:1471:5 | a [element 2] | provenance | | -| array_flow.rb:1471:16:1471:26 | call to source | array_flow.rb:1471:9:1471:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1472:5:1472:5 | b [element 2] | array_flow.rb:1478:10:1478:10 | b [element 2] | provenance | | -| array_flow.rb:1472:9:1472:9 | a [element 2] | array_flow.rb:1472:9:1475:7 | call to take_while [element 2] | provenance | | -| array_flow.rb:1472:9:1472:9 | a [element 2] | array_flow.rb:1472:26:1472:26 | x | provenance | | -| array_flow.rb:1472:9:1475:7 | call to take_while [element 2] | array_flow.rb:1472:5:1472:5 | b [element 2] | provenance | | +| array_flow.rb:1447:5:1447:5 | a : Array [element 2] | array_flow.rb:1448:9:1448:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1447:5:1447:5 | a : Array [element 2] | array_flow.rb:1453:9:1453:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1447:5:1447:5 | a : Array [element 2] | array_flow.rb:1459:9:1459:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1447:5:1447:5 | a : Array [element 2] | array_flow.rb:1466:9:1466:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1447:5:1447:5 | a : Array [element 3] | array_flow.rb:1448:9:1448:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1447:5:1447:5 | a : Array [element 3] | array_flow.rb:1459:9:1459:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1447:9:1447:44 | call to [] : Array [element 2] | array_flow.rb:1447:5:1447:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1447:9:1447:44 | call to [] : Array [element 3] | array_flow.rb:1447:5:1447:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1447:16:1447:28 | call to source | array_flow.rb:1447:9:1447:44 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1447:31:1447:43 | call to source | array_flow.rb:1447:9:1447:44 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1448:5:1448:5 | b : Array [element 2] | array_flow.rb:1451:10:1451:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1448:5:1448:5 | b : Array [element 3] | array_flow.rb:1452:10:1452:10 | b : Array [element 3] | provenance | | +| array_flow.rb:1448:9:1448:9 | a : Array [element 2] | array_flow.rb:1448:9:1448:17 | call to take : Array [element 2] | provenance | | +| array_flow.rb:1448:9:1448:9 | a : Array [element 3] | array_flow.rb:1448:9:1448:17 | call to take : Array [element 3] | provenance | | +| array_flow.rb:1448:9:1448:17 | call to take : Array [element 2] | array_flow.rb:1448:5:1448:5 | b : Array [element 2] | provenance | | +| array_flow.rb:1448:9:1448:17 | call to take : Array [element 3] | array_flow.rb:1448:5:1448:5 | b : Array [element 3] | provenance | | +| array_flow.rb:1451:10:1451:10 | b : Array [element 2] | array_flow.rb:1451:10:1451:13 | ...[...] | provenance | | +| array_flow.rb:1452:10:1452:10 | b : Array [element 3] | array_flow.rb:1452:10:1452:13 | ...[...] | provenance | | +| array_flow.rb:1453:5:1453:5 | b : Array [element 2] | array_flow.rb:1456:10:1456:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1453:5:1453:5 | b : Array [element 2] | array_flow.rb:1458:10:1458:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1453:9:1453:9 | a : Array [element 2] | array_flow.rb:1453:9:1453:17 | call to take : Array [element 2] | provenance | | +| array_flow.rb:1453:9:1453:17 | call to take : Array [element 2] | array_flow.rb:1453:5:1453:5 | b : Array [element 2] | provenance | | +| array_flow.rb:1456:10:1456:10 | b : Array [element 2] | array_flow.rb:1456:10:1456:13 | ...[...] | provenance | | +| array_flow.rb:1458:10:1458:10 | b : Array [element 2] | array_flow.rb:1458:10:1458:13 | ...[...] | provenance | | +| array_flow.rb:1459:5:1459:5 | b : Array [element 2] | array_flow.rb:1462:10:1462:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1459:5:1459:5 | b : Array [element 2] | array_flow.rb:1464:10:1464:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1459:5:1459:5 | b : Array [element 3] | array_flow.rb:1463:10:1463:10 | b : Array [element 3] | provenance | | +| array_flow.rb:1459:5:1459:5 | b : Array [element 3] | array_flow.rb:1464:10:1464:10 | b : Array [element 3] | provenance | | +| array_flow.rb:1459:9:1459:9 | a : Array [element 2] | array_flow.rb:1459:9:1459:19 | call to take : Array [element 2] | provenance | | +| array_flow.rb:1459:9:1459:9 | a : Array [element 3] | array_flow.rb:1459:9:1459:19 | call to take : Array [element 3] | provenance | | +| array_flow.rb:1459:9:1459:19 | call to take : Array [element 2] | array_flow.rb:1459:5:1459:5 | b : Array [element 2] | provenance | | +| array_flow.rb:1459:9:1459:19 | call to take : Array [element 3] | array_flow.rb:1459:5:1459:5 | b : Array [element 3] | provenance | | +| array_flow.rb:1462:10:1462:10 | b : Array [element 2] | array_flow.rb:1462:10:1462:13 | ...[...] | provenance | | +| array_flow.rb:1463:10:1463:10 | b : Array [element 3] | array_flow.rb:1463:10:1463:13 | ...[...] | provenance | | +| array_flow.rb:1464:10:1464:10 | b : Array [element 2] | array_flow.rb:1464:10:1464:13 | ...[...] | provenance | | +| array_flow.rb:1464:10:1464:10 | b : Array [element 3] | array_flow.rb:1464:10:1464:13 | ...[...] | provenance | | +| array_flow.rb:1465:5:1465:5 | [post] a : [collection] [element] | array_flow.rb:1466:9:1466:9 | a : [collection] [element] | provenance | | +| array_flow.rb:1465:12:1465:24 | call to source | array_flow.rb:1465:5:1465:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1466:5:1466:5 | b : Array [element 2] | array_flow.rb:1467:10:1467:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1466:5:1466:5 | b : [collection] [element] | array_flow.rb:1467:10:1467:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1466:9:1466:9 | a : Array [element 2] | array_flow.rb:1466:9:1466:17 | call to take : Array [element 2] | provenance | | +| array_flow.rb:1466:9:1466:9 | a : [collection] [element] | array_flow.rb:1466:9:1466:17 | call to take : [collection] [element] | provenance | | +| array_flow.rb:1466:9:1466:17 | call to take : Array [element 2] | array_flow.rb:1466:5:1466:5 | b : Array [element 2] | provenance | | +| array_flow.rb:1466:9:1466:17 | call to take : [collection] [element] | array_flow.rb:1466:5:1466:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1467:10:1467:10 | b : Array [element 2] | array_flow.rb:1467:10:1467:13 | ...[...] | provenance | | +| array_flow.rb:1467:10:1467:10 | b : [collection] [element] | array_flow.rb:1467:10:1467:13 | ...[...] | provenance | | +| array_flow.rb:1471:5:1471:5 | a : Array [element 2] | array_flow.rb:1472:9:1472:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1471:9:1471:27 | call to [] : Array [element 2] | array_flow.rb:1471:5:1471:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1471:16:1471:26 | call to source | array_flow.rb:1471:9:1471:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1472:5:1472:5 | b : Array [element 2] | array_flow.rb:1478:10:1478:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1472:9:1472:9 | a : Array [element 2] | array_flow.rb:1472:9:1475:7 | call to take_while : Array [element 2] | provenance | | +| array_flow.rb:1472:9:1472:9 | a : Array [element 2] | array_flow.rb:1472:26:1472:26 | x | provenance | | +| array_flow.rb:1472:9:1475:7 | call to take_while : Array [element 2] | array_flow.rb:1472:5:1472:5 | b : Array [element 2] | provenance | | | array_flow.rb:1472:26:1472:26 | x | array_flow.rb:1473:14:1473:14 | x | provenance | | -| array_flow.rb:1478:10:1478:10 | b [element 2] | array_flow.rb:1478:10:1478:13 | ...[...] | provenance | | -| array_flow.rb:1484:5:1484:5 | a [element 3] | array_flow.rb:1485:9:1485:9 | a [element 3] | provenance | | -| array_flow.rb:1484:9:1484:30 | call to [] [element 3] | array_flow.rb:1484:5:1484:5 | a [element 3] | provenance | | -| array_flow.rb:1484:19:1484:29 | call to source | array_flow.rb:1484:9:1484:30 | call to [] [element 3] | provenance | | -| array_flow.rb:1485:5:1485:5 | b [element 3] | array_flow.rb:1486:10:1486:10 | b [element 3] | provenance | | -| array_flow.rb:1485:9:1485:9 | a [element 3] | array_flow.rb:1485:9:1485:14 | call to to_a [element 3] | provenance | | -| array_flow.rb:1485:9:1485:14 | call to to_a [element 3] | array_flow.rb:1485:5:1485:5 | b [element 3] | provenance | | -| array_flow.rb:1486:10:1486:10 | b [element 3] | array_flow.rb:1486:10:1486:13 | ...[...] | provenance | | -| array_flow.rb:1490:5:1490:5 | a [element 2] | array_flow.rb:1491:9:1491:9 | a [element 2] | provenance | | -| array_flow.rb:1490:9:1490:27 | call to [] [element 2] | array_flow.rb:1490:5:1490:5 | a [element 2] | provenance | | -| array_flow.rb:1490:16:1490:26 | call to source | array_flow.rb:1490:9:1490:27 | call to [] [element 2] | provenance | | -| array_flow.rb:1491:5:1491:5 | b [element 2] | array_flow.rb:1494:10:1494:10 | b [element 2] | provenance | | -| array_flow.rb:1491:9:1491:9 | a [element 2] | array_flow.rb:1491:9:1491:16 | call to to_ary [element 2] | provenance | | -| array_flow.rb:1491:9:1491:16 | call to to_ary [element 2] | array_flow.rb:1491:5:1491:5 | b [element 2] | provenance | | -| array_flow.rb:1494:10:1494:10 | b [element 2] | array_flow.rb:1494:10:1494:13 | ...[...] | provenance | | -| array_flow.rb:1507:5:1507:5 | a [element 0, element 1] | array_flow.rb:1508:9:1508:9 | a [element 0, element 1] | provenance | | -| array_flow.rb:1507:5:1507:5 | a [element 1, element 1] | array_flow.rb:1508:9:1508:9 | a [element 1, element 1] | provenance | | -| array_flow.rb:1507:5:1507:5 | a [element 2, element 1] | array_flow.rb:1508:9:1508:9 | a [element 2, element 1] | provenance | | -| array_flow.rb:1507:9:1507:68 | call to [] [element 0, element 1] | array_flow.rb:1507:5:1507:5 | a [element 0, element 1] | provenance | | -| array_flow.rb:1507:9:1507:68 | call to [] [element 1, element 1] | array_flow.rb:1507:5:1507:5 | a [element 1, element 1] | provenance | | -| array_flow.rb:1507:9:1507:68 | call to [] [element 2, element 1] | array_flow.rb:1507:5:1507:5 | a [element 2, element 1] | provenance | | -| array_flow.rb:1507:10:1507:27 | call to [] [element 1] | array_flow.rb:1507:9:1507:68 | call to [] [element 0, element 1] | provenance | | -| array_flow.rb:1507:14:1507:26 | call to source | array_flow.rb:1507:10:1507:27 | call to [] [element 1] | provenance | | -| array_flow.rb:1507:30:1507:47 | call to [] [element 1] | array_flow.rb:1507:9:1507:68 | call to [] [element 1, element 1] | provenance | | -| array_flow.rb:1507:34:1507:46 | call to source | array_flow.rb:1507:30:1507:47 | call to [] [element 1] | provenance | | -| array_flow.rb:1507:50:1507:67 | call to [] [element 1] | array_flow.rb:1507:9:1507:68 | call to [] [element 2, element 1] | provenance | | -| array_flow.rb:1507:54:1507:66 | call to source | array_flow.rb:1507:50:1507:67 | call to [] [element 1] | provenance | | -| array_flow.rb:1508:5:1508:5 | b [element 1, element 0] | array_flow.rb:1512:10:1512:10 | b [element 1, element 0] | provenance | | -| array_flow.rb:1508:5:1508:5 | b [element 1, element 1] | array_flow.rb:1513:10:1513:10 | b [element 1, element 1] | provenance | | -| array_flow.rb:1508:5:1508:5 | b [element 1, element 2] | array_flow.rb:1514:10:1514:10 | b [element 1, element 2] | provenance | | -| array_flow.rb:1508:9:1508:9 | a [element 0, element 1] | array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 0] | provenance | | -| array_flow.rb:1508:9:1508:9 | a [element 1, element 1] | array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 1] | provenance | | -| array_flow.rb:1508:9:1508:9 | a [element 2, element 1] | array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 2] | provenance | | -| array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 0] | array_flow.rb:1508:5:1508:5 | b [element 1, element 0] | provenance | | -| array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 1] | array_flow.rb:1508:5:1508:5 | b [element 1, element 1] | provenance | | -| array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 2] | array_flow.rb:1508:5:1508:5 | b [element 1, element 2] | provenance | | -| array_flow.rb:1512:10:1512:10 | b [element 1, element 0] | array_flow.rb:1512:10:1512:13 | ...[...] [element 0] | provenance | | +| array_flow.rb:1478:10:1478:10 | b : Array [element 2] | array_flow.rb:1478:10:1478:13 | ...[...] | provenance | | +| array_flow.rb:1484:5:1484:5 | a : Array [element 3] | array_flow.rb:1485:9:1485:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1484:9:1484:30 | call to [] : Array [element 3] | array_flow.rb:1484:5:1484:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1484:19:1484:29 | call to source | array_flow.rb:1484:9:1484:30 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1485:5:1485:5 | b : Array [element 3] | array_flow.rb:1486:10:1486:10 | b : Array [element 3] | provenance | | +| array_flow.rb:1485:9:1485:9 | a : Array [element 3] | array_flow.rb:1485:9:1485:14 | call to to_a : Array [element 3] | provenance | | +| array_flow.rb:1485:9:1485:14 | call to to_a : Array [element 3] | array_flow.rb:1485:5:1485:5 | b : Array [element 3] | provenance | | +| array_flow.rb:1486:10:1486:10 | b : Array [element 3] | array_flow.rb:1486:10:1486:13 | ...[...] | provenance | | +| array_flow.rb:1490:5:1490:5 | a : Array [element 2] | array_flow.rb:1491:9:1491:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1490:9:1490:27 | call to [] : Array [element 2] | array_flow.rb:1490:5:1490:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1490:16:1490:26 | call to source | array_flow.rb:1490:9:1490:27 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1491:5:1491:5 | b : Array [element 2] | array_flow.rb:1494:10:1494:10 | b : Array [element 2] | provenance | | +| array_flow.rb:1491:9:1491:9 | a : Array [element 2] | array_flow.rb:1491:9:1491:16 | call to to_ary : Array [element 2] | provenance | | +| array_flow.rb:1491:9:1491:16 | call to to_ary : Array [element 2] | array_flow.rb:1491:5:1491:5 | b : Array [element 2] | provenance | | +| array_flow.rb:1494:10:1494:10 | b : Array [element 2] | array_flow.rb:1494:10:1494:13 | ...[...] | provenance | | +| array_flow.rb:1507:5:1507:5 | a : Array [element 0, element 1] | array_flow.rb:1508:9:1508:9 | a : Array [element 0, element 1] | provenance | | +| array_flow.rb:1507:5:1507:5 | a : Array [element 1, element 1] | array_flow.rb:1508:9:1508:9 | a : Array [element 1, element 1] | provenance | | +| array_flow.rb:1507:5:1507:5 | a : Array [element 2, element 1] | array_flow.rb:1508:9:1508:9 | a : Array [element 2, element 1] | provenance | | +| array_flow.rb:1507:9:1507:68 | call to [] : Array [element 0, element 1] | array_flow.rb:1507:5:1507:5 | a : Array [element 0, element 1] | provenance | | +| array_flow.rb:1507:9:1507:68 | call to [] : Array [element 1, element 1] | array_flow.rb:1507:5:1507:5 | a : Array [element 1, element 1] | provenance | | +| array_flow.rb:1507:9:1507:68 | call to [] : Array [element 2, element 1] | array_flow.rb:1507:5:1507:5 | a : Array [element 2, element 1] | provenance | | +| array_flow.rb:1507:10:1507:27 | call to [] : Array [element 1] | array_flow.rb:1507:9:1507:68 | call to [] : Array [element 0, element 1] | provenance | | +| array_flow.rb:1507:14:1507:26 | call to source | array_flow.rb:1507:10:1507:27 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1507:30:1507:47 | call to [] : Array [element 1] | array_flow.rb:1507:9:1507:68 | call to [] : Array [element 1, element 1] | provenance | | +| array_flow.rb:1507:34:1507:46 | call to source | array_flow.rb:1507:30:1507:47 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1507:50:1507:67 | call to [] : Array [element 1] | array_flow.rb:1507:9:1507:68 | call to [] : Array [element 2, element 1] | provenance | | +| array_flow.rb:1507:54:1507:66 | call to source | array_flow.rb:1507:50:1507:67 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 0] | array_flow.rb:1512:10:1512:10 | b : [collection] [element 1, element 0] | provenance | | +| array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 1] | array_flow.rb:1513:10:1513:10 | b : [collection] [element 1, element 1] | provenance | | +| array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 2] | array_flow.rb:1514:10:1514:10 | b : [collection] [element 1, element 2] | provenance | | +| array_flow.rb:1508:9:1508:9 | a : Array [element 0, element 1] | array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 0] | provenance | | +| array_flow.rb:1508:9:1508:9 | a : Array [element 1, element 1] | array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 1] | provenance | | +| array_flow.rb:1508:9:1508:9 | a : Array [element 2, element 1] | array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 2] | provenance | | +| array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 0] | array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 0] | provenance | | +| array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 1] | array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 1] | provenance | | +| array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 2] | array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 2] | provenance | | +| array_flow.rb:1512:10:1512:10 | b : [collection] [element 1, element 0] | array_flow.rb:1512:10:1512:13 | ...[...] [element 0] | provenance | | | array_flow.rb:1512:10:1512:13 | ...[...] [element 0] | array_flow.rb:1512:10:1512:16 | ...[...] | provenance | | -| array_flow.rb:1513:10:1513:10 | b [element 1, element 1] | array_flow.rb:1513:10:1513:13 | ...[...] [element 1] | provenance | | +| array_flow.rb:1513:10:1513:10 | b : [collection] [element 1, element 1] | array_flow.rb:1513:10:1513:13 | ...[...] [element 1] | provenance | | | array_flow.rb:1513:10:1513:13 | ...[...] [element 1] | array_flow.rb:1513:10:1513:16 | ...[...] | provenance | | -| array_flow.rb:1514:10:1514:10 | b [element 1, element 2] | array_flow.rb:1514:10:1514:13 | ...[...] [element 2] | provenance | | +| array_flow.rb:1514:10:1514:10 | b : [collection] [element 1, element 2] | array_flow.rb:1514:10:1514:13 | ...[...] [element 2] | provenance | | | array_flow.rb:1514:10:1514:13 | ...[...] [element 2] | array_flow.rb:1514:10:1514:16 | ...[...] | provenance | | -| array_flow.rb:1518:5:1518:5 | a [element 2] | array_flow.rb:1521:9:1521:9 | a [element 2] | provenance | | -| array_flow.rb:1518:9:1518:29 | call to [] [element 2] | array_flow.rb:1518:5:1518:5 | a [element 2] | provenance | | -| array_flow.rb:1518:16:1518:28 | call to source | array_flow.rb:1518:9:1518:29 | call to [] [element 2] | provenance | | -| array_flow.rb:1519:5:1519:5 | b [element 1] | array_flow.rb:1521:17:1521:17 | b [element 1] | provenance | | -| array_flow.rb:1519:9:1519:26 | call to [] [element 1] | array_flow.rb:1519:5:1519:5 | b [element 1] | provenance | | -| array_flow.rb:1519:13:1519:25 | call to source | array_flow.rb:1519:9:1519:26 | call to [] [element 1] | provenance | | -| array_flow.rb:1520:5:1520:5 | c [element 1] | array_flow.rb:1521:20:1521:20 | c [element 1] | provenance | | -| array_flow.rb:1520:9:1520:26 | call to [] [element 1] | array_flow.rb:1520:5:1520:5 | c [element 1] | provenance | | -| array_flow.rb:1520:13:1520:25 | call to source | array_flow.rb:1520:9:1520:26 | call to [] [element 1] | provenance | | -| array_flow.rb:1521:5:1521:5 | d [element] | array_flow.rb:1522:10:1522:10 | d [element] | provenance | | -| array_flow.rb:1521:5:1521:5 | d [element] | array_flow.rb:1523:10:1523:10 | d [element] | provenance | | -| array_flow.rb:1521:5:1521:5 | d [element] | array_flow.rb:1524:10:1524:10 | d [element] | provenance | | -| array_flow.rb:1521:9:1521:9 | a [element 2] | array_flow.rb:1521:9:1521:21 | call to union [element] | provenance | | -| array_flow.rb:1521:9:1521:21 | call to union [element] | array_flow.rb:1521:5:1521:5 | d [element] | provenance | | -| array_flow.rb:1521:17:1521:17 | b [element 1] | array_flow.rb:1521:9:1521:21 | call to union [element] | provenance | | -| array_flow.rb:1521:20:1521:20 | c [element 1] | array_flow.rb:1521:9:1521:21 | call to union [element] | provenance | | -| array_flow.rb:1522:10:1522:10 | d [element] | array_flow.rb:1522:10:1522:13 | ...[...] | provenance | | -| array_flow.rb:1523:10:1523:10 | d [element] | array_flow.rb:1523:10:1523:13 | ...[...] | provenance | | -| array_flow.rb:1524:10:1524:10 | d [element] | array_flow.rb:1524:10:1524:13 | ...[...] | provenance | | -| array_flow.rb:1528:5:1528:5 | a [element 3] | array_flow.rb:1530:9:1530:9 | a [element 3] | provenance | | -| array_flow.rb:1528:5:1528:5 | a [element 3] | array_flow.rb:1534:9:1534:9 | a [element 3] | provenance | | -| array_flow.rb:1528:5:1528:5 | a [element 4] | array_flow.rb:1530:9:1530:9 | a [element 4] | provenance | | -| array_flow.rb:1528:5:1528:5 | a [element 4] | array_flow.rb:1534:9:1534:9 | a [element 4] | provenance | | -| array_flow.rb:1528:9:1528:47 | call to [] [element 3] | array_flow.rb:1528:5:1528:5 | a [element 3] | provenance | | -| array_flow.rb:1528:9:1528:47 | call to [] [element 4] | array_flow.rb:1528:5:1528:5 | a [element 4] | provenance | | -| array_flow.rb:1528:19:1528:31 | call to source | array_flow.rb:1528:9:1528:47 | call to [] [element 3] | provenance | | -| array_flow.rb:1528:34:1528:46 | call to source | array_flow.rb:1528:9:1528:47 | call to [] [element 4] | provenance | | -| array_flow.rb:1530:5:1530:5 | b [element] | array_flow.rb:1531:10:1531:10 | b [element] | provenance | | -| array_flow.rb:1530:5:1530:5 | b [element] | array_flow.rb:1532:10:1532:10 | b [element] | provenance | | -| array_flow.rb:1530:9:1530:9 | a [element 3] | array_flow.rb:1530:9:1530:14 | call to uniq [element] | provenance | | -| array_flow.rb:1530:9:1530:9 | a [element 4] | array_flow.rb:1530:9:1530:14 | call to uniq [element] | provenance | | -| array_flow.rb:1530:9:1530:14 | call to uniq [element] | array_flow.rb:1530:5:1530:5 | b [element] | provenance | | -| array_flow.rb:1531:10:1531:10 | b [element] | array_flow.rb:1531:10:1531:13 | ...[...] | provenance | | -| array_flow.rb:1532:10:1532:10 | b [element] | array_flow.rb:1532:10:1532:13 | ...[...] | provenance | | -| array_flow.rb:1534:5:1534:5 | c [element] | array_flow.rb:1538:10:1538:10 | c [element] | provenance | | -| array_flow.rb:1534:9:1534:9 | a [element 3] | array_flow.rb:1534:9:1537:7 | call to uniq [element] | provenance | | -| array_flow.rb:1534:9:1534:9 | a [element 3] | array_flow.rb:1534:20:1534:20 | x | provenance | | -| array_flow.rb:1534:9:1534:9 | a [element 4] | array_flow.rb:1534:9:1537:7 | call to uniq [element] | provenance | | -| array_flow.rb:1534:9:1534:9 | a [element 4] | array_flow.rb:1534:20:1534:20 | x | provenance | | -| array_flow.rb:1534:9:1537:7 | call to uniq [element] | array_flow.rb:1534:5:1534:5 | c [element] | provenance | | +| array_flow.rb:1518:5:1518:5 | a : Array [element 2] | array_flow.rb:1521:9:1521:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1518:9:1518:29 | call to [] : Array [element 2] | array_flow.rb:1518:5:1518:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1518:16:1518:28 | call to source | array_flow.rb:1518:9:1518:29 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1519:5:1519:5 | b : Array [element 1] | array_flow.rb:1521:17:1521:17 | b : Array [element 1] | provenance | | +| array_flow.rb:1519:9:1519:26 | call to [] : Array [element 1] | array_flow.rb:1519:5:1519:5 | b : Array [element 1] | provenance | | +| array_flow.rb:1519:13:1519:25 | call to source | array_flow.rb:1519:9:1519:26 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1520:5:1520:5 | c : Array [element 1] | array_flow.rb:1521:20:1521:20 | c : Array [element 1] | provenance | | +| array_flow.rb:1520:9:1520:26 | call to [] : Array [element 1] | array_flow.rb:1520:5:1520:5 | c : Array [element 1] | provenance | | +| array_flow.rb:1520:13:1520:25 | call to source | array_flow.rb:1520:9:1520:26 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1521:5:1521:5 | d : [collection] [element] | array_flow.rb:1522:10:1522:10 | d : [collection] [element] | provenance | | +| array_flow.rb:1521:5:1521:5 | d : [collection] [element] | array_flow.rb:1523:10:1523:10 | d : [collection] [element] | provenance | | +| array_flow.rb:1521:5:1521:5 | d : [collection] [element] | array_flow.rb:1524:10:1524:10 | d : [collection] [element] | provenance | | +| array_flow.rb:1521:9:1521:9 | a : Array [element 2] | array_flow.rb:1521:9:1521:21 | call to union : [collection] [element] | provenance | | +| array_flow.rb:1521:9:1521:21 | call to union : [collection] [element] | array_flow.rb:1521:5:1521:5 | d : [collection] [element] | provenance | | +| array_flow.rb:1521:17:1521:17 | b : Array [element 1] | array_flow.rb:1521:9:1521:21 | call to union : [collection] [element] | provenance | | +| array_flow.rb:1521:20:1521:20 | c : Array [element 1] | array_flow.rb:1521:9:1521:21 | call to union : [collection] [element] | provenance | | +| array_flow.rb:1522:10:1522:10 | d : [collection] [element] | array_flow.rb:1522:10:1522:13 | ...[...] | provenance | | +| array_flow.rb:1523:10:1523:10 | d : [collection] [element] | array_flow.rb:1523:10:1523:13 | ...[...] | provenance | | +| array_flow.rb:1524:10:1524:10 | d : [collection] [element] | array_flow.rb:1524:10:1524:13 | ...[...] | provenance | | +| array_flow.rb:1528:5:1528:5 | a : Array [element 3] | array_flow.rb:1530:9:1530:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1528:5:1528:5 | a : Array [element 3] | array_flow.rb:1534:9:1534:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1528:5:1528:5 | a : Array [element 4] | array_flow.rb:1530:9:1530:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1528:5:1528:5 | a : Array [element 4] | array_flow.rb:1534:9:1534:9 | a : Array [element 4] | provenance | | +| array_flow.rb:1528:9:1528:47 | call to [] : Array [element 3] | array_flow.rb:1528:5:1528:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1528:9:1528:47 | call to [] : Array [element 4] | array_flow.rb:1528:5:1528:5 | a : Array [element 4] | provenance | | +| array_flow.rb:1528:19:1528:31 | call to source | array_flow.rb:1528:9:1528:47 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1528:34:1528:46 | call to source | array_flow.rb:1528:9:1528:47 | call to [] : Array [element 4] | provenance | | +| array_flow.rb:1530:5:1530:5 | b : [collection] [element] | array_flow.rb:1531:10:1531:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1530:5:1530:5 | b : [collection] [element] | array_flow.rb:1532:10:1532:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1530:9:1530:9 | a : Array [element 3] | array_flow.rb:1530:9:1530:14 | call to uniq : [collection] [element] | provenance | | +| array_flow.rb:1530:9:1530:9 | a : Array [element 4] | array_flow.rb:1530:9:1530:14 | call to uniq : [collection] [element] | provenance | | +| array_flow.rb:1530:9:1530:14 | call to uniq : [collection] [element] | array_flow.rb:1530:5:1530:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1531:10:1531:10 | b : [collection] [element] | array_flow.rb:1531:10:1531:13 | ...[...] | provenance | | +| array_flow.rb:1532:10:1532:10 | b : [collection] [element] | array_flow.rb:1532:10:1532:13 | ...[...] | provenance | | +| array_flow.rb:1534:5:1534:5 | c : [collection] [element] | array_flow.rb:1538:10:1538:10 | c : [collection] [element] | provenance | | +| array_flow.rb:1534:9:1534:9 | a : Array [element 3] | array_flow.rb:1534:9:1537:7 | call to uniq : [collection] [element] | provenance | | +| array_flow.rb:1534:9:1534:9 | a : Array [element 3] | array_flow.rb:1534:20:1534:20 | x | provenance | | +| array_flow.rb:1534:9:1534:9 | a : Array [element 4] | array_flow.rb:1534:9:1537:7 | call to uniq : [collection] [element] | provenance | | +| array_flow.rb:1534:9:1534:9 | a : Array [element 4] | array_flow.rb:1534:20:1534:20 | x | provenance | | +| array_flow.rb:1534:9:1537:7 | call to uniq : [collection] [element] | array_flow.rb:1534:5:1534:5 | c : [collection] [element] | provenance | | | array_flow.rb:1534:20:1534:20 | x | array_flow.rb:1535:14:1535:14 | x | provenance | | -| array_flow.rb:1538:10:1538:10 | c [element] | array_flow.rb:1538:10:1538:13 | ...[...] | provenance | | -| array_flow.rb:1542:5:1542:5 | a [element 2] | array_flow.rb:1543:9:1543:9 | a [element 2] | provenance | | -| array_flow.rb:1542:5:1542:5 | a [element 3] | array_flow.rb:1543:9:1543:9 | a [element 3] | provenance | | -| array_flow.rb:1542:9:1542:44 | call to [] [element 2] | array_flow.rb:1542:5:1542:5 | a [element 2] | provenance | | -| array_flow.rb:1542:9:1542:44 | call to [] [element 3] | array_flow.rb:1542:5:1542:5 | a [element 3] | provenance | | -| array_flow.rb:1542:16:1542:28 | call to source | array_flow.rb:1542:9:1542:44 | call to [] [element 2] | provenance | | -| array_flow.rb:1542:31:1542:43 | call to source | array_flow.rb:1542:9:1542:44 | call to [] [element 3] | provenance | | -| array_flow.rb:1543:5:1543:5 | b [element] | array_flow.rb:1544:10:1544:10 | b [element] | provenance | | -| array_flow.rb:1543:5:1543:5 | b [element] | array_flow.rb:1545:10:1545:10 | b [element] | provenance | | -| array_flow.rb:1543:9:1543:9 | [post] a [element] | array_flow.rb:1546:10:1546:10 | a [element] | provenance | | -| array_flow.rb:1543:9:1543:9 | [post] a [element] | array_flow.rb:1547:10:1547:10 | a [element] | provenance | | -| array_flow.rb:1543:9:1543:9 | a [element 2] | array_flow.rb:1543:9:1543:9 | [post] a [element] | provenance | | -| array_flow.rb:1543:9:1543:9 | a [element 2] | array_flow.rb:1543:9:1543:15 | call to uniq! [element] | provenance | | -| array_flow.rb:1543:9:1543:9 | a [element 3] | array_flow.rb:1543:9:1543:9 | [post] a [element] | provenance | | -| array_flow.rb:1543:9:1543:9 | a [element 3] | array_flow.rb:1543:9:1543:15 | call to uniq! [element] | provenance | | -| array_flow.rb:1543:9:1543:15 | call to uniq! [element] | array_flow.rb:1543:5:1543:5 | b [element] | provenance | | -| array_flow.rb:1544:10:1544:10 | b [element] | array_flow.rb:1544:10:1544:13 | ...[...] | provenance | | -| array_flow.rb:1545:10:1545:10 | b [element] | array_flow.rb:1545:10:1545:13 | ...[...] | provenance | | -| array_flow.rb:1546:10:1546:10 | a [element] | array_flow.rb:1546:10:1546:13 | ...[...] | provenance | | -| array_flow.rb:1547:10:1547:10 | a [element] | array_flow.rb:1547:10:1547:13 | ...[...] | provenance | | -| array_flow.rb:1549:5:1549:5 | a [element 2] | array_flow.rb:1550:9:1550:9 | a [element 2] | provenance | | -| array_flow.rb:1549:5:1549:5 | a [element 3] | array_flow.rb:1550:9:1550:9 | a [element 3] | provenance | | -| array_flow.rb:1549:9:1549:44 | call to [] [element 2] | array_flow.rb:1549:5:1549:5 | a [element 2] | provenance | | -| array_flow.rb:1549:9:1549:44 | call to [] [element 3] | array_flow.rb:1549:5:1549:5 | a [element 3] | provenance | | -| array_flow.rb:1549:16:1549:28 | call to source | array_flow.rb:1549:9:1549:44 | call to [] [element 2] | provenance | | -| array_flow.rb:1549:31:1549:43 | call to source | array_flow.rb:1549:9:1549:44 | call to [] [element 3] | provenance | | -| array_flow.rb:1550:5:1550:5 | b [element] | array_flow.rb:1554:10:1554:10 | b [element] | provenance | | -| array_flow.rb:1550:5:1550:5 | b [element] | array_flow.rb:1555:10:1555:10 | b [element] | provenance | | -| array_flow.rb:1550:9:1550:9 | [post] a [element] | array_flow.rb:1556:10:1556:10 | a [element] | provenance | | -| array_flow.rb:1550:9:1550:9 | [post] a [element] | array_flow.rb:1557:10:1557:10 | a [element] | provenance | | -| array_flow.rb:1550:9:1550:9 | a [element 2] | array_flow.rb:1550:9:1550:9 | [post] a [element] | provenance | | -| array_flow.rb:1550:9:1550:9 | a [element 2] | array_flow.rb:1550:9:1553:7 | call to uniq! [element] | provenance | | -| array_flow.rb:1550:9:1550:9 | a [element 2] | array_flow.rb:1550:21:1550:21 | x | provenance | | -| array_flow.rb:1550:9:1550:9 | a [element 3] | array_flow.rb:1550:9:1550:9 | [post] a [element] | provenance | | -| array_flow.rb:1550:9:1550:9 | a [element 3] | array_flow.rb:1550:9:1553:7 | call to uniq! [element] | provenance | | -| array_flow.rb:1550:9:1550:9 | a [element 3] | array_flow.rb:1550:21:1550:21 | x | provenance | | -| array_flow.rb:1550:9:1553:7 | call to uniq! [element] | array_flow.rb:1550:5:1550:5 | b [element] | provenance | | +| array_flow.rb:1538:10:1538:10 | c : [collection] [element] | array_flow.rb:1538:10:1538:13 | ...[...] | provenance | | +| array_flow.rb:1542:5:1542:5 | a : Array [element 2] | array_flow.rb:1543:9:1543:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1542:5:1542:5 | a : Array [element 3] | array_flow.rb:1543:9:1543:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1542:9:1542:44 | call to [] : Array [element 2] | array_flow.rb:1542:5:1542:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1542:9:1542:44 | call to [] : Array [element 3] | array_flow.rb:1542:5:1542:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1542:16:1542:28 | call to source | array_flow.rb:1542:9:1542:44 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1542:31:1542:43 | call to source | array_flow.rb:1542:9:1542:44 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1543:5:1543:5 | b : [collection] [element] | array_flow.rb:1544:10:1544:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1543:5:1543:5 | b : [collection] [element] | array_flow.rb:1545:10:1545:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1543:9:1543:9 | [post] a : [collection] [element] | array_flow.rb:1546:10:1546:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1543:9:1543:9 | [post] a : [collection] [element] | array_flow.rb:1547:10:1547:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1543:9:1543:9 | a : Array [element 2] | array_flow.rb:1543:9:1543:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1543:9:1543:9 | a : Array [element 2] | array_flow.rb:1543:9:1543:15 | call to uniq! : [collection] [element] | provenance | | +| array_flow.rb:1543:9:1543:9 | a : Array [element 3] | array_flow.rb:1543:9:1543:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1543:9:1543:9 | a : Array [element 3] | array_flow.rb:1543:9:1543:15 | call to uniq! : [collection] [element] | provenance | | +| array_flow.rb:1543:9:1543:15 | call to uniq! : [collection] [element] | array_flow.rb:1543:5:1543:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1544:10:1544:10 | b : [collection] [element] | array_flow.rb:1544:10:1544:13 | ...[...] | provenance | | +| array_flow.rb:1545:10:1545:10 | b : [collection] [element] | array_flow.rb:1545:10:1545:13 | ...[...] | provenance | | +| array_flow.rb:1546:10:1546:10 | a : [collection] [element] | array_flow.rb:1546:10:1546:13 | ...[...] | provenance | | +| array_flow.rb:1547:10:1547:10 | a : [collection] [element] | array_flow.rb:1547:10:1547:13 | ...[...] | provenance | | +| array_flow.rb:1549:5:1549:5 | a : Array [element 2] | array_flow.rb:1550:9:1550:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1549:5:1549:5 | a : Array [element 3] | array_flow.rb:1550:9:1550:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1549:9:1549:44 | call to [] : Array [element 2] | array_flow.rb:1549:5:1549:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1549:9:1549:44 | call to [] : Array [element 3] | array_flow.rb:1549:5:1549:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1549:16:1549:28 | call to source | array_flow.rb:1549:9:1549:44 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1549:31:1549:43 | call to source | array_flow.rb:1549:9:1549:44 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1550:5:1550:5 | b : [collection] [element] | array_flow.rb:1554:10:1554:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1550:5:1550:5 | b : [collection] [element] | array_flow.rb:1555:10:1555:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1550:9:1550:9 | [post] a : [collection] [element] | array_flow.rb:1556:10:1556:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1550:9:1550:9 | [post] a : [collection] [element] | array_flow.rb:1557:10:1557:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1550:9:1550:9 | a : Array [element 2] | array_flow.rb:1550:9:1550:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1550:9:1550:9 | a : Array [element 2] | array_flow.rb:1550:9:1553:7 | call to uniq! : [collection] [element] | provenance | | +| array_flow.rb:1550:9:1550:9 | a : Array [element 2] | array_flow.rb:1550:21:1550:21 | x | provenance | | +| array_flow.rb:1550:9:1550:9 | a : Array [element 3] | array_flow.rb:1550:9:1550:9 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1550:9:1550:9 | a : Array [element 3] | array_flow.rb:1550:9:1553:7 | call to uniq! : [collection] [element] | provenance | | +| array_flow.rb:1550:9:1550:9 | a : Array [element 3] | array_flow.rb:1550:21:1550:21 | x | provenance | | +| array_flow.rb:1550:9:1553:7 | call to uniq! : [collection] [element] | array_flow.rb:1550:5:1550:5 | b : [collection] [element] | provenance | | | array_flow.rb:1550:21:1550:21 | x | array_flow.rb:1551:14:1551:14 | x | provenance | | -| array_flow.rb:1554:10:1554:10 | b [element] | array_flow.rb:1554:10:1554:13 | ...[...] | provenance | | -| array_flow.rb:1555:10:1555:10 | b [element] | array_flow.rb:1555:10:1555:13 | ...[...] | provenance | | -| array_flow.rb:1556:10:1556:10 | a [element] | array_flow.rb:1556:10:1556:13 | ...[...] | provenance | | -| array_flow.rb:1557:10:1557:10 | a [element] | array_flow.rb:1557:10:1557:13 | ...[...] | provenance | | -| array_flow.rb:1561:5:1561:5 | a [element 2] | array_flow.rb:1562:5:1562:5 | a [element 2] | provenance | | -| array_flow.rb:1561:9:1561:29 | call to [] [element 2] | array_flow.rb:1561:5:1561:5 | a [element 2] | provenance | | -| array_flow.rb:1561:16:1561:28 | call to source | array_flow.rb:1561:9:1561:29 | call to [] [element 2] | provenance | | -| array_flow.rb:1562:5:1562:5 | [post] a [element 2] | array_flow.rb:1565:10:1565:10 | a [element 2] | provenance | | -| array_flow.rb:1562:5:1562:5 | [post] a [element 5] | array_flow.rb:1568:10:1568:10 | a [element 5] | provenance | | -| array_flow.rb:1562:5:1562:5 | a [element 2] | array_flow.rb:1562:5:1562:5 | [post] a [element 5] | provenance | | -| array_flow.rb:1562:21:1562:33 | call to source | array_flow.rb:1562:5:1562:5 | [post] a [element 2] | provenance | | -| array_flow.rb:1565:10:1565:10 | a [element 2] | array_flow.rb:1565:10:1565:13 | ...[...] | provenance | | -| array_flow.rb:1568:10:1568:10 | a [element 5] | array_flow.rb:1568:10:1568:13 | ...[...] | provenance | | -| array_flow.rb:1572:5:1572:5 | a [element 1] | array_flow.rb:1574:9:1574:9 | a [element 1] | provenance | | -| array_flow.rb:1572:5:1572:5 | a [element 1] | array_flow.rb:1580:9:1580:9 | a [element 1] | provenance | | -| array_flow.rb:1572:5:1572:5 | a [element 1] | array_flow.rb:1584:9:1584:9 | a [element 1] | provenance | | -| array_flow.rb:1572:5:1572:5 | a [element 1] | array_flow.rb:1588:9:1588:9 | a [element 1] | provenance | | -| array_flow.rb:1572:5:1572:5 | a [element 3] | array_flow.rb:1580:9:1580:9 | a [element 3] | provenance | | -| array_flow.rb:1572:5:1572:5 | a [element 3] | array_flow.rb:1584:9:1584:9 | a [element 3] | provenance | | -| array_flow.rb:1572:5:1572:5 | a [element 3] | array_flow.rb:1588:9:1588:9 | a [element 3] | provenance | | -| array_flow.rb:1572:9:1572:44 | call to [] [element 1] | array_flow.rb:1572:5:1572:5 | a [element 1] | provenance | | -| array_flow.rb:1572:9:1572:44 | call to [] [element 3] | array_flow.rb:1572:5:1572:5 | a [element 3] | provenance | | -| array_flow.rb:1572:13:1572:25 | call to source | array_flow.rb:1572:9:1572:44 | call to [] [element 1] | provenance | | -| array_flow.rb:1572:31:1572:43 | call to source | array_flow.rb:1572:9:1572:44 | call to [] [element 3] | provenance | | -| array_flow.rb:1574:5:1574:5 | b [element 1] | array_flow.rb:1576:10:1576:10 | b [element 1] | provenance | | -| array_flow.rb:1574:5:1574:5 | b [element 3] | array_flow.rb:1578:10:1578:10 | b [element 3] | provenance | | -| array_flow.rb:1574:9:1574:9 | a [element 1] | array_flow.rb:1574:9:1574:31 | call to values_at [element 1] | provenance | | -| array_flow.rb:1574:9:1574:9 | a [element 1] | array_flow.rb:1574:9:1574:31 | call to values_at [element 3] | provenance | | -| array_flow.rb:1574:9:1574:31 | call to values_at [element 1] | array_flow.rb:1574:5:1574:5 | b [element 1] | provenance | | -| array_flow.rb:1574:9:1574:31 | call to values_at [element 3] | array_flow.rb:1574:5:1574:5 | b [element 3] | provenance | | -| array_flow.rb:1576:10:1576:10 | b [element 1] | array_flow.rb:1576:10:1576:13 | ...[...] | provenance | | -| array_flow.rb:1578:10:1578:10 | b [element 3] | array_flow.rb:1578:10:1578:13 | ...[...] | provenance | | -| array_flow.rb:1580:5:1580:5 | b [element] | array_flow.rb:1581:10:1581:10 | b [element] | provenance | | -| array_flow.rb:1580:5:1580:5 | b [element] | array_flow.rb:1582:10:1582:10 | b [element] | provenance | | -| array_flow.rb:1580:9:1580:9 | a [element 1] | array_flow.rb:1580:9:1580:25 | call to values_at [element] | provenance | | -| array_flow.rb:1580:9:1580:9 | a [element 3] | array_flow.rb:1580:9:1580:25 | call to values_at [element] | provenance | | -| array_flow.rb:1580:9:1580:25 | call to values_at [element] | array_flow.rb:1580:5:1580:5 | b [element] | provenance | | -| array_flow.rb:1581:10:1581:10 | b [element] | array_flow.rb:1581:10:1581:13 | ...[...] | provenance | | -| array_flow.rb:1582:10:1582:10 | b [element] | array_flow.rb:1582:10:1582:13 | ...[...] | provenance | | -| array_flow.rb:1584:5:1584:5 | b [element] | array_flow.rb:1585:10:1585:10 | b [element] | provenance | | -| array_flow.rb:1584:5:1584:5 | b [element] | array_flow.rb:1586:10:1586:10 | b [element] | provenance | | -| array_flow.rb:1584:9:1584:9 | a [element 1] | array_flow.rb:1584:9:1584:26 | call to values_at [element] | provenance | | -| array_flow.rb:1584:9:1584:9 | a [element 3] | array_flow.rb:1584:9:1584:26 | call to values_at [element] | provenance | | -| array_flow.rb:1584:9:1584:26 | call to values_at [element] | array_flow.rb:1584:5:1584:5 | b [element] | provenance | | -| array_flow.rb:1585:10:1585:10 | b [element] | array_flow.rb:1585:10:1585:13 | ...[...] | provenance | | -| array_flow.rb:1586:10:1586:10 | b [element] | array_flow.rb:1586:10:1586:13 | ...[...] | provenance | | -| array_flow.rb:1588:5:1588:5 | b [element 1] | array_flow.rb:1590:10:1590:10 | b [element 1] | provenance | | -| array_flow.rb:1588:5:1588:5 | b [element] | array_flow.rb:1589:10:1589:10 | b [element] | provenance | | -| array_flow.rb:1588:5:1588:5 | b [element] | array_flow.rb:1590:10:1590:10 | b [element] | provenance | | -| array_flow.rb:1588:5:1588:5 | b [element] | array_flow.rb:1591:10:1591:10 | b [element] | provenance | | -| array_flow.rb:1588:5:1588:5 | b [element] | array_flow.rb:1592:10:1592:10 | b [element] | provenance | | -| array_flow.rb:1588:9:1588:9 | a [element 1] | array_flow.rb:1588:9:1588:28 | call to values_at [element] | provenance | | -| array_flow.rb:1588:9:1588:9 | a [element 3] | array_flow.rb:1588:9:1588:28 | call to values_at [element 1] | provenance | | -| array_flow.rb:1588:9:1588:9 | a [element 3] | array_flow.rb:1588:9:1588:28 | call to values_at [element] | provenance | | -| array_flow.rb:1588:9:1588:28 | call to values_at [element 1] | array_flow.rb:1588:5:1588:5 | b [element 1] | provenance | | -| array_flow.rb:1588:9:1588:28 | call to values_at [element] | array_flow.rb:1588:5:1588:5 | b [element] | provenance | | -| array_flow.rb:1589:10:1589:10 | b [element] | array_flow.rb:1589:10:1589:13 | ...[...] | provenance | | -| array_flow.rb:1590:10:1590:10 | b [element 1] | array_flow.rb:1590:10:1590:13 | ...[...] | provenance | | -| array_flow.rb:1590:10:1590:10 | b [element] | array_flow.rb:1590:10:1590:13 | ...[...] | provenance | | -| array_flow.rb:1591:10:1591:10 | b [element] | array_flow.rb:1591:10:1591:13 | ...[...] | provenance | | -| array_flow.rb:1592:10:1592:10 | b [element] | array_flow.rb:1592:10:1592:13 | ...[...] | provenance | | -| array_flow.rb:1596:5:1596:5 | a [element 2] | array_flow.rb:1599:9:1599:9 | a [element 2] | provenance | | -| array_flow.rb:1596:5:1596:5 | a [element 2] | array_flow.rb:1604:5:1604:5 | a [element 2] | provenance | | -| array_flow.rb:1596:9:1596:29 | call to [] [element 2] | array_flow.rb:1596:5:1596:5 | a [element 2] | provenance | | -| array_flow.rb:1596:16:1596:28 | call to source | array_flow.rb:1596:9:1596:29 | call to [] [element 2] | provenance | | -| array_flow.rb:1597:5:1597:5 | b [element 1] | array_flow.rb:1599:15:1599:15 | b [element 1] | provenance | | -| array_flow.rb:1597:5:1597:5 | b [element 1] | array_flow.rb:1604:11:1604:11 | b [element 1] | provenance | | -| array_flow.rb:1597:9:1597:29 | call to [] [element 1] | array_flow.rb:1597:5:1597:5 | b [element 1] | provenance | | -| array_flow.rb:1597:13:1597:25 | call to source | array_flow.rb:1597:9:1597:29 | call to [] [element 1] | provenance | | -| array_flow.rb:1598:5:1598:5 | c [element 0] | array_flow.rb:1599:18:1599:18 | c [element 0] | provenance | | -| array_flow.rb:1598:5:1598:5 | c [element 0] | array_flow.rb:1604:14:1604:14 | c [element 0] | provenance | | -| array_flow.rb:1598:9:1598:29 | call to [] [element 0] | array_flow.rb:1598:5:1598:5 | c [element 0] | provenance | | -| array_flow.rb:1598:10:1598:22 | call to source | array_flow.rb:1598:9:1598:29 | call to [] [element 0] | provenance | | -| array_flow.rb:1599:5:1599:5 | d [element 0, element 2] | array_flow.rb:1601:10:1601:10 | d [element 0, element 2] | provenance | | -| array_flow.rb:1599:5:1599:5 | d [element 1, element 1] | array_flow.rb:1602:10:1602:10 | d [element 1, element 1] | provenance | | -| array_flow.rb:1599:5:1599:5 | d [element 2, element 0] | array_flow.rb:1603:10:1603:10 | d [element 2, element 0] | provenance | | -| array_flow.rb:1599:9:1599:9 | a [element 2] | array_flow.rb:1599:9:1599:19 | call to zip [element 2, element 0] | provenance | | -| array_flow.rb:1599:9:1599:19 | call to zip [element 0, element 2] | array_flow.rb:1599:5:1599:5 | d [element 0, element 2] | provenance | | -| array_flow.rb:1599:9:1599:19 | call to zip [element 1, element 1] | array_flow.rb:1599:5:1599:5 | d [element 1, element 1] | provenance | | -| array_flow.rb:1599:9:1599:19 | call to zip [element 2, element 0] | array_flow.rb:1599:5:1599:5 | d [element 2, element 0] | provenance | | -| array_flow.rb:1599:15:1599:15 | b [element 1] | array_flow.rb:1599:9:1599:19 | call to zip [element 1, element 1] | provenance | | -| array_flow.rb:1599:18:1599:18 | c [element 0] | array_flow.rb:1599:9:1599:19 | call to zip [element 0, element 2] | provenance | | -| array_flow.rb:1601:10:1601:10 | d [element 0, element 2] | array_flow.rb:1601:10:1601:13 | ...[...] [element 2] | provenance | | +| array_flow.rb:1554:10:1554:10 | b : [collection] [element] | array_flow.rb:1554:10:1554:13 | ...[...] | provenance | | +| array_flow.rb:1555:10:1555:10 | b : [collection] [element] | array_flow.rb:1555:10:1555:13 | ...[...] | provenance | | +| array_flow.rb:1556:10:1556:10 | a : [collection] [element] | array_flow.rb:1556:10:1556:13 | ...[...] | provenance | | +| array_flow.rb:1557:10:1557:10 | a : [collection] [element] | array_flow.rb:1557:10:1557:13 | ...[...] | provenance | | +| array_flow.rb:1561:5:1561:5 | a : Array [element 2] | array_flow.rb:1562:5:1562:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1561:9:1561:29 | call to [] : Array [element 2] | array_flow.rb:1561:5:1561:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1561:16:1561:28 | call to source | array_flow.rb:1561:9:1561:29 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1562:5:1562:5 | [post] a : [collection] [element 2] | array_flow.rb:1565:10:1565:10 | a : [collection] [element 2] | provenance | | +| array_flow.rb:1562:5:1562:5 | [post] a : [collection] [element 5] | array_flow.rb:1568:10:1568:10 | a : [collection] [element 5] | provenance | | +| array_flow.rb:1562:5:1562:5 | a : Array [element 2] | array_flow.rb:1562:5:1562:5 | [post] a : [collection] [element 5] | provenance | | +| array_flow.rb:1562:21:1562:33 | call to source | array_flow.rb:1562:5:1562:5 | [post] a : [collection] [element 2] | provenance | | +| array_flow.rb:1565:10:1565:10 | a : [collection] [element 2] | array_flow.rb:1565:10:1565:13 | ...[...] | provenance | | +| array_flow.rb:1568:10:1568:10 | a : [collection] [element 5] | array_flow.rb:1568:10:1568:13 | ...[...] | provenance | | +| array_flow.rb:1572:5:1572:5 | a : Array [element 1] | array_flow.rb:1574:9:1574:9 | a : Array [element 1] | provenance | | +| array_flow.rb:1572:5:1572:5 | a : Array [element 1] | array_flow.rb:1580:9:1580:9 | a : Array [element 1] | provenance | | +| array_flow.rb:1572:5:1572:5 | a : Array [element 1] | array_flow.rb:1584:9:1584:9 | a : Array [element 1] | provenance | | +| array_flow.rb:1572:5:1572:5 | a : Array [element 1] | array_flow.rb:1588:9:1588:9 | a : Array [element 1] | provenance | | +| array_flow.rb:1572:5:1572:5 | a : Array [element 3] | array_flow.rb:1580:9:1580:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1572:5:1572:5 | a : Array [element 3] | array_flow.rb:1584:9:1584:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1572:5:1572:5 | a : Array [element 3] | array_flow.rb:1588:9:1588:9 | a : Array [element 3] | provenance | | +| array_flow.rb:1572:9:1572:44 | call to [] : Array [element 1] | array_flow.rb:1572:5:1572:5 | a : Array [element 1] | provenance | | +| array_flow.rb:1572:9:1572:44 | call to [] : Array [element 3] | array_flow.rb:1572:5:1572:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1572:13:1572:25 | call to source | array_flow.rb:1572:9:1572:44 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1572:31:1572:43 | call to source | array_flow.rb:1572:9:1572:44 | call to [] : Array [element 3] | provenance | | +| array_flow.rb:1574:5:1574:5 | b : [collection] [element 1] | array_flow.rb:1576:10:1576:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1574:5:1574:5 | b : [collection] [element 3] | array_flow.rb:1578:10:1578:10 | b : [collection] [element 3] | provenance | | +| array_flow.rb:1574:9:1574:9 | a : Array [element 1] | array_flow.rb:1574:9:1574:31 | call to values_at : [collection] [element 1] | provenance | | +| array_flow.rb:1574:9:1574:9 | a : Array [element 1] | array_flow.rb:1574:9:1574:31 | call to values_at : [collection] [element 3] | provenance | | +| array_flow.rb:1574:9:1574:31 | call to values_at : [collection] [element 1] | array_flow.rb:1574:5:1574:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1574:9:1574:31 | call to values_at : [collection] [element 3] | array_flow.rb:1574:5:1574:5 | b : [collection] [element 3] | provenance | | +| array_flow.rb:1576:10:1576:10 | b : [collection] [element 1] | array_flow.rb:1576:10:1576:13 | ...[...] | provenance | | +| array_flow.rb:1578:10:1578:10 | b : [collection] [element 3] | array_flow.rb:1578:10:1578:13 | ...[...] | provenance | | +| array_flow.rb:1580:5:1580:5 | b : [collection] [element] | array_flow.rb:1581:10:1581:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1580:5:1580:5 | b : [collection] [element] | array_flow.rb:1582:10:1582:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1580:9:1580:9 | a : Array [element 1] | array_flow.rb:1580:9:1580:25 | call to values_at : [collection] [element] | provenance | | +| array_flow.rb:1580:9:1580:9 | a : Array [element 3] | array_flow.rb:1580:9:1580:25 | call to values_at : [collection] [element] | provenance | | +| array_flow.rb:1580:9:1580:25 | call to values_at : [collection] [element] | array_flow.rb:1580:5:1580:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1581:10:1581:10 | b : [collection] [element] | array_flow.rb:1581:10:1581:13 | ...[...] | provenance | | +| array_flow.rb:1582:10:1582:10 | b : [collection] [element] | array_flow.rb:1582:10:1582:13 | ...[...] | provenance | | +| array_flow.rb:1584:5:1584:5 | b : [collection] [element] | array_flow.rb:1585:10:1585:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1584:5:1584:5 | b : [collection] [element] | array_flow.rb:1586:10:1586:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1584:9:1584:9 | a : Array [element 1] | array_flow.rb:1584:9:1584:26 | call to values_at : [collection] [element] | provenance | | +| array_flow.rb:1584:9:1584:9 | a : Array [element 3] | array_flow.rb:1584:9:1584:26 | call to values_at : [collection] [element] | provenance | | +| array_flow.rb:1584:9:1584:26 | call to values_at : [collection] [element] | array_flow.rb:1584:5:1584:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1585:10:1585:10 | b : [collection] [element] | array_flow.rb:1585:10:1585:13 | ...[...] | provenance | | +| array_flow.rb:1586:10:1586:10 | b : [collection] [element] | array_flow.rb:1586:10:1586:13 | ...[...] | provenance | | +| array_flow.rb:1588:5:1588:5 | b : [collection] [element 1] | array_flow.rb:1590:10:1590:10 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1588:5:1588:5 | b : [collection] [element] | array_flow.rb:1589:10:1589:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1588:5:1588:5 | b : [collection] [element] | array_flow.rb:1590:10:1590:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1588:5:1588:5 | b : [collection] [element] | array_flow.rb:1591:10:1591:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1588:5:1588:5 | b : [collection] [element] | array_flow.rb:1592:10:1592:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1588:9:1588:9 | a : Array [element 1] | array_flow.rb:1588:9:1588:28 | call to values_at : [collection] [element] | provenance | | +| array_flow.rb:1588:9:1588:9 | a : Array [element 3] | array_flow.rb:1588:9:1588:28 | call to values_at : [collection] [element 1] | provenance | | +| array_flow.rb:1588:9:1588:9 | a : Array [element 3] | array_flow.rb:1588:9:1588:28 | call to values_at : [collection] [element] | provenance | | +| array_flow.rb:1588:9:1588:28 | call to values_at : [collection] [element 1] | array_flow.rb:1588:5:1588:5 | b : [collection] [element 1] | provenance | | +| array_flow.rb:1588:9:1588:28 | call to values_at : [collection] [element] | array_flow.rb:1588:5:1588:5 | b : [collection] [element] | provenance | | +| array_flow.rb:1589:10:1589:10 | b : [collection] [element] | array_flow.rb:1589:10:1589:13 | ...[...] | provenance | | +| array_flow.rb:1590:10:1590:10 | b : [collection] [element 1] | array_flow.rb:1590:10:1590:13 | ...[...] | provenance | | +| array_flow.rb:1590:10:1590:10 | b : [collection] [element] | array_flow.rb:1590:10:1590:13 | ...[...] | provenance | | +| array_flow.rb:1591:10:1591:10 | b : [collection] [element] | array_flow.rb:1591:10:1591:13 | ...[...] | provenance | | +| array_flow.rb:1592:10:1592:10 | b : [collection] [element] | array_flow.rb:1592:10:1592:13 | ...[...] | provenance | | +| array_flow.rb:1596:5:1596:5 | a : Array [element 2] | array_flow.rb:1599:9:1599:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1596:5:1596:5 | a : Array [element 2] | array_flow.rb:1604:5:1604:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1596:9:1596:29 | call to [] : Array [element 2] | array_flow.rb:1596:5:1596:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1596:16:1596:28 | call to source | array_flow.rb:1596:9:1596:29 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1597:5:1597:5 | b : Array [element 1] | array_flow.rb:1599:15:1599:15 | b : Array [element 1] | provenance | | +| array_flow.rb:1597:5:1597:5 | b : Array [element 1] | array_flow.rb:1604:11:1604:11 | b : Array [element 1] | provenance | | +| array_flow.rb:1597:9:1597:29 | call to [] : Array [element 1] | array_flow.rb:1597:5:1597:5 | b : Array [element 1] | provenance | | +| array_flow.rb:1597:13:1597:25 | call to source | array_flow.rb:1597:9:1597:29 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1598:5:1598:5 | c : Array [element 0] | array_flow.rb:1599:18:1599:18 | c : Array [element 0] | provenance | | +| array_flow.rb:1598:5:1598:5 | c : Array [element 0] | array_flow.rb:1604:14:1604:14 | c : Array [element 0] | provenance | | +| array_flow.rb:1598:9:1598:29 | call to [] : Array [element 0] | array_flow.rb:1598:5:1598:5 | c : Array [element 0] | provenance | | +| array_flow.rb:1598:10:1598:22 | call to source | array_flow.rb:1598:9:1598:29 | call to [] : Array [element 0] | provenance | | +| array_flow.rb:1599:5:1599:5 | d : [collection] [element 0, element 2] | array_flow.rb:1601:10:1601:10 | d : [collection] [element 0, element 2] | provenance | | +| array_flow.rb:1599:5:1599:5 | d : [collection] [element 1, element 1] | array_flow.rb:1602:10:1602:10 | d : [collection] [element 1, element 1] | provenance | | +| array_flow.rb:1599:5:1599:5 | d : [collection] [element 2, element 0] | array_flow.rb:1603:10:1603:10 | d : [collection] [element 2, element 0] | provenance | | +| array_flow.rb:1599:9:1599:9 | a : Array [element 2] | array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 2, element 0] | provenance | | +| array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 0, element 2] | array_flow.rb:1599:5:1599:5 | d : [collection] [element 0, element 2] | provenance | | +| array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 1, element 1] | array_flow.rb:1599:5:1599:5 | d : [collection] [element 1, element 1] | provenance | | +| array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 2, element 0] | array_flow.rb:1599:5:1599:5 | d : [collection] [element 2, element 0] | provenance | | +| array_flow.rb:1599:15:1599:15 | b : Array [element 1] | array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 1, element 1] | provenance | | +| array_flow.rb:1599:18:1599:18 | c : Array [element 0] | array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 0, element 2] | provenance | | +| array_flow.rb:1601:10:1601:10 | d : [collection] [element 0, element 2] | array_flow.rb:1601:10:1601:13 | ...[...] [element 2] | provenance | | | array_flow.rb:1601:10:1601:13 | ...[...] [element 2] | array_flow.rb:1601:10:1601:16 | ...[...] | provenance | | -| array_flow.rb:1602:10:1602:10 | d [element 1, element 1] | array_flow.rb:1602:10:1602:13 | ...[...] [element 1] | provenance | | +| array_flow.rb:1602:10:1602:10 | d : [collection] [element 1, element 1] | array_flow.rb:1602:10:1602:13 | ...[...] [element 1] | provenance | | | array_flow.rb:1602:10:1602:13 | ...[...] [element 1] | array_flow.rb:1602:10:1602:16 | ...[...] | provenance | | -| array_flow.rb:1603:10:1603:10 | d [element 2, element 0] | array_flow.rb:1603:10:1603:13 | ...[...] [element 0] | provenance | | +| array_flow.rb:1603:10:1603:10 | d : [collection] [element 2, element 0] | array_flow.rb:1603:10:1603:13 | ...[...] [element 0] | provenance | | | array_flow.rb:1603:10:1603:13 | ...[...] [element 0] | array_flow.rb:1603:10:1603:16 | ...[...] | provenance | | -| array_flow.rb:1604:5:1604:5 | a [element 2] | array_flow.rb:1604:21:1604:21 | x [element 0] | provenance | | -| array_flow.rb:1604:11:1604:11 | b [element 1] | array_flow.rb:1604:21:1604:21 | x [element 1] | provenance | | -| array_flow.rb:1604:14:1604:14 | c [element 0] | array_flow.rb:1604:21:1604:21 | x [element 2] | provenance | | -| array_flow.rb:1604:21:1604:21 | x [element 0] | array_flow.rb:1605:14:1605:14 | x [element 0] | provenance | | -| array_flow.rb:1604:21:1604:21 | x [element 1] | array_flow.rb:1606:14:1606:14 | x [element 1] | provenance | | -| array_flow.rb:1604:21:1604:21 | x [element 2] | array_flow.rb:1607:14:1607:14 | x [element 2] | provenance | | -| array_flow.rb:1605:14:1605:14 | x [element 0] | array_flow.rb:1605:14:1605:17 | ...[...] | provenance | | -| array_flow.rb:1606:14:1606:14 | x [element 1] | array_flow.rb:1606:14:1606:17 | ...[...] | provenance | | -| array_flow.rb:1607:14:1607:14 | x [element 2] | array_flow.rb:1607:14:1607:17 | ...[...] | provenance | | -| array_flow.rb:1612:5:1612:5 | a [element 2] | array_flow.rb:1614:9:1614:9 | a [element 2] | provenance | | -| array_flow.rb:1612:9:1612:29 | call to [] [element 2] | array_flow.rb:1612:5:1612:5 | a [element 2] | provenance | | -| array_flow.rb:1612:16:1612:28 | call to source | array_flow.rb:1612:9:1612:29 | call to [] [element 2] | provenance | | -| array_flow.rb:1613:5:1613:5 | b [element 1] | array_flow.rb:1614:13:1614:13 | b [element 1] | provenance | | -| array_flow.rb:1613:9:1613:26 | call to [] [element 1] | array_flow.rb:1613:5:1613:5 | b [element 1] | provenance | | -| array_flow.rb:1613:13:1613:25 | call to source | array_flow.rb:1613:9:1613:26 | call to [] [element 1] | provenance | | -| array_flow.rb:1614:5:1614:5 | c [element] | array_flow.rb:1615:10:1615:10 | c [element] | provenance | | -| array_flow.rb:1614:5:1614:5 | c [element] | array_flow.rb:1616:10:1616:10 | c [element] | provenance | | -| array_flow.rb:1614:5:1614:5 | c [element] | array_flow.rb:1617:10:1617:10 | c [element] | provenance | | -| array_flow.rb:1614:9:1614:9 | a [element 2] | array_flow.rb:1614:9:1614:13 | ... \| ... [element] | provenance | | -| array_flow.rb:1614:9:1614:13 | ... \| ... [element] | array_flow.rb:1614:5:1614:5 | c [element] | provenance | | -| array_flow.rb:1614:13:1614:13 | b [element 1] | array_flow.rb:1614:9:1614:13 | ... \| ... [element] | provenance | | -| array_flow.rb:1615:10:1615:10 | c [element] | array_flow.rb:1615:10:1615:13 | ...[...] | provenance | | -| array_flow.rb:1616:10:1616:10 | c [element] | array_flow.rb:1616:10:1616:13 | ...[...] | provenance | | -| array_flow.rb:1617:10:1617:10 | c [element] | array_flow.rb:1617:10:1617:13 | ...[...] | provenance | | -| array_flow.rb:1622:5:1622:5 | [post] a [element, element 0] | array_flow.rb:1623:10:1623:10 | a [element, element 0] | provenance | | -| array_flow.rb:1622:5:1622:5 | [post] a [element, element 0] | array_flow.rb:1626:10:1626:10 | a [element, element 0] | provenance | | -| array_flow.rb:1622:5:1622:5 | [post] a [element, element 0] | array_flow.rb:1627:10:1627:10 | a [element, element 0] | provenance | | -| array_flow.rb:1622:5:1622:8 | [post] ...[...] [element 0] | array_flow.rb:1622:5:1622:5 | [post] a [element, element 0] | provenance | | -| array_flow.rb:1622:15:1622:27 | call to source | array_flow.rb:1622:5:1622:8 | [post] ...[...] [element 0] | provenance | | -| array_flow.rb:1623:10:1623:10 | a [element, element 0] | array_flow.rb:1623:10:1623:13 | ...[...] [element 0] | provenance | | +| array_flow.rb:1604:5:1604:5 | a : Array [element 2] | array_flow.rb:1604:21:1604:21 | x : [collection] [element 0] | provenance | | +| array_flow.rb:1604:11:1604:11 | b : Array [element 1] | array_flow.rb:1604:21:1604:21 | x : [collection] [element 1] | provenance | | +| array_flow.rb:1604:14:1604:14 | c : Array [element 0] | array_flow.rb:1604:21:1604:21 | x : [collection] [element 2] | provenance | | +| array_flow.rb:1604:21:1604:21 | x : [collection] [element 0] | array_flow.rb:1605:14:1605:14 | x : [collection] [element 0] | provenance | | +| array_flow.rb:1604:21:1604:21 | x : [collection] [element 1] | array_flow.rb:1606:14:1606:14 | x : [collection] [element 1] | provenance | | +| array_flow.rb:1604:21:1604:21 | x : [collection] [element 2] | array_flow.rb:1607:14:1607:14 | x : [collection] [element 2] | provenance | | +| array_flow.rb:1605:14:1605:14 | x : [collection] [element 0] | array_flow.rb:1605:14:1605:17 | ...[...] | provenance | | +| array_flow.rb:1606:14:1606:14 | x : [collection] [element 1] | array_flow.rb:1606:14:1606:17 | ...[...] | provenance | | +| array_flow.rb:1607:14:1607:14 | x : [collection] [element 2] | array_flow.rb:1607:14:1607:17 | ...[...] | provenance | | +| array_flow.rb:1612:5:1612:5 | a : Array [element 2] | array_flow.rb:1614:9:1614:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1612:9:1612:29 | call to [] : Array [element 2] | array_flow.rb:1612:5:1612:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1612:16:1612:28 | call to source | array_flow.rb:1612:9:1612:29 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1613:5:1613:5 | b : Array [element 1] | array_flow.rb:1614:13:1614:13 | b : Array [element 1] | provenance | | +| array_flow.rb:1613:9:1613:26 | call to [] : Array [element 1] | array_flow.rb:1613:5:1613:5 | b : Array [element 1] | provenance | | +| array_flow.rb:1613:13:1613:25 | call to source | array_flow.rb:1613:9:1613:26 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1614:5:1614:5 | c : [collection] [element] | array_flow.rb:1615:10:1615:10 | c : [collection] [element] | provenance | | +| array_flow.rb:1614:5:1614:5 | c : [collection] [element] | array_flow.rb:1616:10:1616:10 | c : [collection] [element] | provenance | | +| array_flow.rb:1614:5:1614:5 | c : [collection] [element] | array_flow.rb:1617:10:1617:10 | c : [collection] [element] | provenance | | +| array_flow.rb:1614:9:1614:9 | a : Array [element 2] | array_flow.rb:1614:9:1614:13 | ... \| ... : [collection] [element] | provenance | | +| array_flow.rb:1614:9:1614:13 | ... \| ... : [collection] [element] | array_flow.rb:1614:5:1614:5 | c : [collection] [element] | provenance | | +| array_flow.rb:1614:13:1614:13 | b : Array [element 1] | array_flow.rb:1614:9:1614:13 | ... \| ... : [collection] [element] | provenance | | +| array_flow.rb:1615:10:1615:10 | c : [collection] [element] | array_flow.rb:1615:10:1615:13 | ...[...] | provenance | | +| array_flow.rb:1616:10:1616:10 | c : [collection] [element] | array_flow.rb:1616:10:1616:13 | ...[...] | provenance | | +| array_flow.rb:1617:10:1617:10 | c : [collection] [element] | array_flow.rb:1617:10:1617:13 | ...[...] | provenance | | +| array_flow.rb:1622:5:1622:5 | [post] a : [collection] [element, element 0] | array_flow.rb:1623:10:1623:10 | a : [collection] [element, element 0] | provenance | | +| array_flow.rb:1622:5:1622:5 | [post] a : [collection] [element, element 0] | array_flow.rb:1626:10:1626:10 | a : [collection] [element, element 0] | provenance | | +| array_flow.rb:1622:5:1622:5 | [post] a : [collection] [element, element 0] | array_flow.rb:1627:10:1627:10 | a : [collection] [element, element 0] | provenance | | +| array_flow.rb:1622:5:1622:8 | [post] ...[...] : [collection] [element 0] | array_flow.rb:1622:5:1622:5 | [post] a : [collection] [element, element 0] | provenance | | +| array_flow.rb:1622:15:1622:27 | call to source | array_flow.rb:1622:5:1622:8 | [post] ...[...] : [collection] [element 0] | provenance | | +| array_flow.rb:1623:10:1623:10 | a : [collection] [element, element 0] | array_flow.rb:1623:10:1623:13 | ...[...] [element 0] | provenance | | | array_flow.rb:1623:10:1623:13 | ...[...] [element 0] | array_flow.rb:1623:10:1623:16 | ...[...] | provenance | | -| array_flow.rb:1625:5:1625:5 | [post] a [element 1, element 0] | array_flow.rb:1626:10:1626:10 | a [element 1, element 0] | provenance | | -| array_flow.rb:1625:5:1625:8 | [post] ...[...] [element 0] | array_flow.rb:1625:5:1625:5 | [post] a [element 1, element 0] | provenance | | -| array_flow.rb:1625:15:1625:27 | call to source | array_flow.rb:1625:5:1625:8 | [post] ...[...] [element 0] | provenance | | -| array_flow.rb:1626:10:1626:10 | a [element 1, element 0] | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | provenance | | -| array_flow.rb:1626:10:1626:10 | a [element, element 0] | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | provenance | | +| array_flow.rb:1625:5:1625:5 | [post] a : [collection] [element 1, element 0] | array_flow.rb:1626:10:1626:10 | a : [collection] [element 1, element 0] | provenance | | +| array_flow.rb:1625:5:1625:8 | [post] ...[...] : [collection] [element 0] | array_flow.rb:1625:5:1625:5 | [post] a : [collection] [element 1, element 0] | provenance | | +| array_flow.rb:1625:15:1625:27 | call to source | array_flow.rb:1625:5:1625:8 | [post] ...[...] : [collection] [element 0] | provenance | | +| array_flow.rb:1626:10:1626:10 | a : [collection] [element 1, element 0] | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | provenance | | +| array_flow.rb:1626:10:1626:10 | a : [collection] [element, element 0] | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | provenance | | | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | array_flow.rb:1626:10:1626:16 | ...[...] | provenance | | -| array_flow.rb:1627:10:1627:10 | a [element, element 0] | array_flow.rb:1627:10:1627:13 | ...[...] [element 0] | provenance | | +| array_flow.rb:1627:10:1627:10 | a : [collection] [element, element 0] | array_flow.rb:1627:10:1627:13 | ...[...] [element 0] | provenance | | | array_flow.rb:1627:10:1627:13 | ...[...] [element 0] | array_flow.rb:1627:10:1627:16 | ...[...] | provenance | | -| array_flow.rb:1632:5:1632:5 | [post] a [element 0] | array_flow.rb:1641:10:1641:10 | a [element 0] | provenance | | -| array_flow.rb:1632:5:1632:5 | [post] a [element 0] | array_flow.rb:1643:10:1643:10 | a [element 0] | provenance | | -| array_flow.rb:1632:12:1632:24 | call to source | array_flow.rb:1632:5:1632:5 | [post] a [element 0] | provenance | | -| array_flow.rb:1634:5:1634:5 | [post] a [element] | array_flow.rb:1639:10:1639:10 | a [element] | provenance | | -| array_flow.rb:1634:5:1634:5 | [post] a [element] | array_flow.rb:1641:10:1641:10 | a [element] | provenance | | -| array_flow.rb:1634:5:1634:5 | [post] a [element] | array_flow.rb:1643:10:1643:10 | a [element] | provenance | | -| array_flow.rb:1634:16:1634:28 | call to source | array_flow.rb:1634:5:1634:5 | [post] a [element] | provenance | | -| array_flow.rb:1636:5:1636:5 | [post] a [element] | array_flow.rb:1639:10:1639:10 | a [element] | provenance | | -| array_flow.rb:1636:5:1636:5 | [post] a [element] | array_flow.rb:1641:10:1641:10 | a [element] | provenance | | -| array_flow.rb:1636:5:1636:5 | [post] a [element] | array_flow.rb:1643:10:1643:10 | a [element] | provenance | | -| array_flow.rb:1636:14:1636:26 | call to source | array_flow.rb:1636:5:1636:5 | [post] a [element] | provenance | | -| array_flow.rb:1638:5:1638:5 | [post] a [element] | array_flow.rb:1639:10:1639:10 | a [element] | provenance | | -| array_flow.rb:1638:5:1638:5 | [post] a [element] | array_flow.rb:1641:10:1641:10 | a [element] | provenance | | -| array_flow.rb:1638:5:1638:5 | [post] a [element] | array_flow.rb:1643:10:1643:10 | a [element] | provenance | | -| array_flow.rb:1638:16:1638:28 | call to source | array_flow.rb:1638:5:1638:5 | [post] a [element] | provenance | | -| array_flow.rb:1639:10:1639:10 | a [element] | array_flow.rb:1639:10:1639:13 | ...[...] | provenance | | -| array_flow.rb:1641:10:1641:10 | a [element 0] | array_flow.rb:1641:10:1641:17 | ...[...] | provenance | | -| array_flow.rb:1641:10:1641:10 | a [element] | array_flow.rb:1641:10:1641:17 | ...[...] | provenance | | -| array_flow.rb:1643:10:1643:10 | a [element 0] | array_flow.rb:1643:10:1643:15 | ...[...] | provenance | | -| array_flow.rb:1643:10:1643:10 | a [element] | array_flow.rb:1643:10:1643:15 | ...[...] | provenance | | -| array_flow.rb:1647:5:1647:5 | a [element 1] | array_flow.rb:1649:10:1649:10 | a [element 1] | provenance | | -| array_flow.rb:1647:5:1647:5 | a [element 1] | array_flow.rb:1651:10:1651:10 | a [element 1] | provenance | | -| array_flow.rb:1647:9:1647:32 | ...[...] [element 1] | array_flow.rb:1647:5:1647:5 | a [element 1] | provenance | | -| array_flow.rb:1647:18:1647:28 | call to source | array_flow.rb:1647:9:1647:32 | ...[...] [element 1] | provenance | | -| array_flow.rb:1649:10:1649:10 | a [element 1] | array_flow.rb:1649:10:1649:13 | ...[...] | provenance | | -| array_flow.rb:1651:10:1651:10 | a [element 1] | array_flow.rb:1651:10:1651:13 | ...[...] | provenance | | -| array_flow.rb:1668:9:1668:10 | a2 [element 1] | array_flow.rb:1670:14:1670:15 | a2 [element 1] | provenance | | -| array_flow.rb:1668:9:1668:10 | a2 [element 1] | array_flow.rb:1672:14:1672:15 | a2 [element 1] | provenance | | -| array_flow.rb:1668:14:1668:41 | ...[...] [element 1] | array_flow.rb:1668:9:1668:10 | a2 [element 1] | provenance | | -| array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1668:14:1668:41 | ...[...] [element 1] | provenance | | -| array_flow.rb:1670:14:1670:15 | a2 [element 1] | array_flow.rb:1670:14:1670:18 | ...[...] | provenance | | -| array_flow.rb:1672:14:1672:15 | a2 [element 1] | array_flow.rb:1672:14:1672:18 | ...[...] | provenance | | -| array_flow.rb:1677:5:1677:5 | a [element 2] | array_flow.rb:1678:9:1678:9 | a [element 2] | provenance | | -| array_flow.rb:1677:9:1677:29 | call to [] [element 2] | array_flow.rb:1677:5:1677:5 | a [element 2] | provenance | | -| array_flow.rb:1677:16:1677:28 | call to source | array_flow.rb:1677:9:1677:29 | call to [] [element 2] | provenance | | -| array_flow.rb:1678:5:1678:5 | b [element] | array_flow.rb:1681:10:1681:10 | b [element] | provenance | | -| array_flow.rb:1678:9:1678:9 | a [element 2] | array_flow.rb:1678:9:1680:7 | call to map [element] | provenance | | -| array_flow.rb:1678:9:1678:9 | a [element 2] | array_flow.rb:1678:19:1678:19 | x | provenance | | -| array_flow.rb:1678:9:1680:7 | call to map [element] | array_flow.rb:1678:5:1678:5 | b [element] | provenance | | +| array_flow.rb:1632:5:1632:5 | [post] a : [collection] [element 0] | array_flow.rb:1641:10:1641:10 | a : [collection] [element 0] | provenance | | +| array_flow.rb:1632:5:1632:5 | [post] a : [collection] [element 0] | array_flow.rb:1643:10:1643:10 | a : [collection] [element 0] | provenance | | +| array_flow.rb:1632:12:1632:24 | call to source | array_flow.rb:1632:5:1632:5 | [post] a : [collection] [element 0] | provenance | | +| array_flow.rb:1634:5:1634:5 | [post] a : [collection] [element] | array_flow.rb:1639:10:1639:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1634:5:1634:5 | [post] a : [collection] [element] | array_flow.rb:1641:10:1641:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1634:5:1634:5 | [post] a : [collection] [element] | array_flow.rb:1643:10:1643:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1634:16:1634:28 | call to source | array_flow.rb:1634:5:1634:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1636:5:1636:5 | [post] a : [collection] [element] | array_flow.rb:1639:10:1639:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1636:5:1636:5 | [post] a : [collection] [element] | array_flow.rb:1641:10:1641:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1636:5:1636:5 | [post] a : [collection] [element] | array_flow.rb:1643:10:1643:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1636:14:1636:26 | call to source | array_flow.rb:1636:5:1636:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1638:5:1638:5 | [post] a : [collection] [element] | array_flow.rb:1639:10:1639:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1638:5:1638:5 | [post] a : [collection] [element] | array_flow.rb:1641:10:1641:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1638:5:1638:5 | [post] a : [collection] [element] | array_flow.rb:1643:10:1643:10 | a : [collection] [element] | provenance | | +| array_flow.rb:1638:16:1638:28 | call to source | array_flow.rb:1638:5:1638:5 | [post] a : [collection] [element] | provenance | | +| array_flow.rb:1639:10:1639:10 | a : [collection] [element] | array_flow.rb:1639:10:1639:13 | ...[...] | provenance | | +| array_flow.rb:1641:10:1641:10 | a : [collection] [element 0] | array_flow.rb:1641:10:1641:17 | ...[...] | provenance | | +| array_flow.rb:1641:10:1641:10 | a : [collection] [element] | array_flow.rb:1641:10:1641:17 | ...[...] | provenance | | +| array_flow.rb:1643:10:1643:10 | a : [collection] [element 0] | array_flow.rb:1643:10:1643:15 | ...[...] | provenance | | +| array_flow.rb:1643:10:1643:10 | a : [collection] [element] | array_flow.rb:1643:10:1643:15 | ...[...] | provenance | | +| array_flow.rb:1647:5:1647:5 | a : Array [element 1] | array_flow.rb:1649:10:1649:10 | a : Array [element 1] | provenance | | +| array_flow.rb:1647:5:1647:5 | a : Array [element 1] | array_flow.rb:1651:10:1651:10 | a : Array [element 1] | provenance | | +| array_flow.rb:1647:9:1647:32 | ...[...] : Array [element 1] | array_flow.rb:1647:5:1647:5 | a : Array [element 1] | provenance | | +| array_flow.rb:1647:18:1647:28 | call to source | array_flow.rb:1647:9:1647:32 | ...[...] : Array [element 1] | provenance | | +| array_flow.rb:1649:10:1649:10 | a : Array [element 1] | array_flow.rb:1649:10:1649:13 | ...[...] | provenance | | +| array_flow.rb:1651:10:1651:10 | a : Array [element 1] | array_flow.rb:1651:10:1651:13 | ...[...] | provenance | | +| array_flow.rb:1668:9:1668:10 | a2 : Array [element 1] | array_flow.rb:1670:14:1670:15 | a2 : Array [element 1] | provenance | | +| array_flow.rb:1668:9:1668:10 | a2 : Array [element 1] | array_flow.rb:1672:14:1672:15 | a2 : Array [element 1] | provenance | | +| array_flow.rb:1668:14:1668:41 | ...[...] : Array [element 1] | array_flow.rb:1668:9:1668:10 | a2 : Array [element 1] | provenance | | +| array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1668:14:1668:41 | ...[...] : Array [element 1] | provenance | | +| array_flow.rb:1670:14:1670:15 | a2 : Array [element 1] | array_flow.rb:1670:14:1670:18 | ...[...] | provenance | | +| array_flow.rb:1672:14:1672:15 | a2 : Array [element 1] | array_flow.rb:1672:14:1672:18 | ...[...] | provenance | | +| array_flow.rb:1677:5:1677:5 | a : Array [element 2] | array_flow.rb:1678:9:1678:9 | a : Array [element 2] | provenance | | +| array_flow.rb:1677:9:1677:29 | call to [] : Array [element 2] | array_flow.rb:1677:5:1677:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1677:16:1677:28 | call to source | array_flow.rb:1677:9:1677:29 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1678:5:1678:5 | b : [collection] [element] | array_flow.rb:1681:10:1681:10 | b : [collection] [element] | provenance | | +| array_flow.rb:1678:9:1678:9 | a : Array [element 2] | array_flow.rb:1678:9:1680:7 | call to map : [collection] [element] | provenance | | +| array_flow.rb:1678:9:1678:9 | a : Array [element 2] | array_flow.rb:1678:19:1678:19 | x | provenance | | +| array_flow.rb:1678:9:1680:7 | call to map : [collection] [element] | array_flow.rb:1678:5:1678:5 | b : [collection] [element] | provenance | | | array_flow.rb:1678:19:1678:19 | x | array_flow.rb:1679:9:1679:9 | x | provenance | | -| array_flow.rb:1681:10:1681:10 | b [element] | array_flow.rb:1681:10:1681:13 | ...[...] | provenance | | -| array_flow.rb:1685:5:1685:5 | a [element 2] | array_flow.rb:1686:18:1686:18 | a [element 2] | provenance | | -| array_flow.rb:1685:5:1685:5 | a [element 3] | array_flow.rb:1686:18:1686:18 | a [element 3] | provenance | | -| array_flow.rb:1685:9:1685:44 | call to [] [element 2] | array_flow.rb:1685:5:1685:5 | a [element 2] | provenance | | -| array_flow.rb:1685:9:1685:44 | call to [] [element 3] | array_flow.rb:1685:5:1685:5 | a [element 3] | provenance | | -| array_flow.rb:1685:16:1685:28 | call to source | array_flow.rb:1685:9:1685:44 | call to [] [element 2] | provenance | | -| array_flow.rb:1685:31:1685:43 | call to source | array_flow.rb:1685:9:1685:44 | call to [] [element 3] | provenance | | +| array_flow.rb:1681:10:1681:10 | b : [collection] [element] | array_flow.rb:1681:10:1681:13 | ...[...] | provenance | | +| array_flow.rb:1685:5:1685:5 | a : Array [element 2] | array_flow.rb:1686:18:1686:18 | a : Array [element 2] | provenance | | +| array_flow.rb:1685:5:1685:5 | a : Array [element 3] | array_flow.rb:1686:18:1686:18 | a : Array [element 3] | provenance | | +| array_flow.rb:1685:9:1685:44 | call to [] : Array [element 2] | array_flow.rb:1685:5:1685:5 | a : Array [element 2] | provenance | | +| array_flow.rb:1685:9:1685:44 | call to [] : Array [element 3] | array_flow.rb:1685:5:1685:5 | a : Array [element 3] | provenance | | +| array_flow.rb:1685:16:1685:28 | call to source | array_flow.rb:1685:9:1685:44 | call to [] : Array [element 2] | provenance | | +| array_flow.rb:1685:31:1685:43 | call to source | array_flow.rb:1685:9:1685:44 | call to [] : Array [element 3] | provenance | | | array_flow.rb:1686:11:1686:11 | z | array_flow.rb:1689:10:1689:10 | z | provenance | | | array_flow.rb:1686:14:1686:14 | w | array_flow.rb:1690:10:1690:10 | w | provenance | | -| array_flow.rb:1686:18:1686:18 | a [element 2] | array_flow.rb:1686:11:1686:11 | z | provenance | | -| array_flow.rb:1686:18:1686:18 | a [element 3] | array_flow.rb:1686:14:1686:14 | w | provenance | | -| array_flow.rb:1693:10:1693:14 | *args [element 1] | array_flow.rb:1694:17:1694:20 | args [element 1] | provenance | | -| array_flow.rb:1694:16:1694:20 | * ... [element 1] | array_flow.rb:1694:5:1694:21 | call to [] [element 1] | provenance | | -| array_flow.rb:1694:17:1694:20 | args [element 1] | array_flow.rb:1694:16:1694:20 | * ... [element 1] | provenance | | +| array_flow.rb:1686:18:1686:18 | a : Array [element 2] | array_flow.rb:1686:11:1686:11 | z | provenance | | +| array_flow.rb:1686:18:1686:18 | a : Array [element 3] | array_flow.rb:1686:14:1686:14 | w | provenance | | +| array_flow.rb:1693:10:1693:14 | *args : Array [element 1] | array_flow.rb:1694:17:1694:20 | args : Array [element 1] | provenance | | +| array_flow.rb:1694:16:1694:20 | * ... : Array [element 1] | array_flow.rb:1694:5:1694:21 | call to [] : Array [element 1] | provenance | | +| array_flow.rb:1694:17:1694:20 | args : Array [element 1] | array_flow.rb:1694:16:1694:20 | * ... : Array [element 1] | provenance | | | array_flow.rb:1697:13:1697:13 | y | array_flow.rb:1699:10:1699:10 | y | provenance | | -| array_flow.rb:1704:5:1704:5 | a [element 1] | array_flow.rb:1705:11:1705:11 | a [element 1] | provenance | | -| array_flow.rb:1704:9:1704:31 | call to m141 [element 1] | array_flow.rb:1704:5:1704:5 | a [element 1] | provenance | | -| array_flow.rb:1704:17:1704:27 | call to source | array_flow.rb:1693:10:1693:14 | *args [element 1] | provenance | | -| array_flow.rb:1704:17:1704:27 | call to source | array_flow.rb:1704:9:1704:31 | call to m141 [element 1] | provenance | | -| array_flow.rb:1705:10:1705:11 | * ... [element 1] | array_flow.rb:1697:13:1697:13 | y | provenance | | -| array_flow.rb:1705:11:1705:11 | a [element 1] | array_flow.rb:1705:10:1705:11 | * ... [element 1] | provenance | | +| array_flow.rb:1704:5:1704:5 | a : Array [element 1] | array_flow.rb:1705:11:1705:11 | a : Array [element 1] | provenance | | +| array_flow.rb:1704:9:1704:31 | call to m141 : Array [element 1] | array_flow.rb:1704:5:1704:5 | a : Array [element 1] | provenance | | +| array_flow.rb:1704:17:1704:27 | call to source | array_flow.rb:1693:10:1693:14 | *args : Array [element 1] | provenance | | +| array_flow.rb:1704:17:1704:27 | call to source | array_flow.rb:1704:9:1704:31 | call to m141 : Array [element 1] | provenance | | +| array_flow.rb:1705:10:1705:11 | * ... : Array [element 1] | array_flow.rb:1697:13:1697:13 | y | provenance | | +| array_flow.rb:1705:11:1705:11 | a : Array [element 1] | array_flow.rb:1705:10:1705:11 | * ... : Array [element 1] | provenance | | nodes -| array_flow.rb:2:5:2:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:2:9:2:20 | * ... [element 0] | semmle.label | * ... [element 0] | +| array_flow.rb:2:5:2:5 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | +| array_flow.rb:2:9:2:20 | * ... : [collection] [element 0] | semmle.label | * ... : [collection] [element 0] | | array_flow.rb:2:10:2:20 | call to source | semmle.label | call to source | -| array_flow.rb:3:10:3:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:3:10:3:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | | array_flow.rb:3:10:3:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:5:10:5:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:5:10:5:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:9:5:9:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:9:9:9:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:9:5:9:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:9:9:9:25 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:9:13:9:21 | call to source | semmle.label | call to source | -| array_flow.rb:11:10:11:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:11:10:11:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:11:10:11:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:13:10:13:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:13:10:13:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:17:5:17:5 | a [element] | semmle.label | a [element] | -| array_flow.rb:17:9:17:33 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:17:5:17:5 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| array_flow.rb:17:9:17:33 | call to new : [collection] [element] | semmle.label | call to new : [collection] [element] | | array_flow.rb:17:22:17:32 | call to source | semmle.label | call to source | -| array_flow.rb:18:10:18:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:18:10:18:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:18:10:18:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:19:10:19:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:19:10:19:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:21:5:21:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:21:9:21:20 | call to new [element] | semmle.label | call to new [element] | -| array_flow.rb:21:19:21:19 | a [element] | semmle.label | a [element] | -| array_flow.rb:22:10:22:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:21:5:21:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:21:9:21:20 | call to new : [collection] [element] | semmle.label | call to new : [collection] [element] | +| array_flow.rb:21:19:21:19 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| array_flow.rb:22:10:22:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:22:10:22:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:23:10:23:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:23:10:23:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:25:5:25:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:25:9:27:7 | call to new [element] | semmle.label | call to new [element] | +| array_flow.rb:25:5:25:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:25:9:27:7 | call to new : [collection] [element] | semmle.label | call to new : [collection] [element] | | array_flow.rb:26:9:26:19 | call to source | semmle.label | call to source | -| array_flow.rb:28:10:28:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:28:10:28:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:28:10:28:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:29:10:29:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:29:10:29:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:33:5:33:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:33:9:33:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:33:5:33:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:33:9:33:22 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:33:10:33:18 | call to source | semmle.label | call to source | -| array_flow.rb:34:5:34:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | semmle.label | call to try_convert [element 0] | -| array_flow.rb:34:27:34:27 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:35:10:35:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:34:5:34:5 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:34:9:34:28 | call to try_convert : Array [element 0] | semmle.label | call to try_convert : Array [element 0] | +| array_flow.rb:34:27:34:27 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:35:10:35:10 | b : Array [element 0] | semmle.label | b : Array [element 0] | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:40:5:40:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:40:9:40:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:40:5:40:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:40:9:40:24 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:40:10:40:20 | call to source | semmle.label | call to source | -| array_flow.rb:41:5:41:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:41:9:41:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:41:5:41:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:41:9:41:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:41:16:41:26 | call to source | semmle.label | call to source | -| array_flow.rb:42:5:42:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:42:9:42:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:42:9:42:13 | ... & ... [element] | semmle.label | ... & ... [element] | -| array_flow.rb:42:13:42:13 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:43:10:43:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:42:5:42:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:42:9:42:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:42:9:42:13 | ... & ... : [collection] [element] | semmle.label | ... & ... : [collection] [element] | +| array_flow.rb:42:13:42:13 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:43:10:43:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:43:10:43:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:44:10:44:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:44:10:44:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:48:5:48:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:48:9:48:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:48:5:48:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:48:9:48:22 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:48:10:48:18 | call to source | semmle.label | call to source | -| array_flow.rb:49:5:49:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:49:9:49:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:49:9:49:13 | ... * ... [element] | semmle.label | ... * ... [element] | -| array_flow.rb:50:10:50:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:49:5:49:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:49:9:49:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:49:9:49:13 | ... * ... : [collection] [element] | semmle.label | ... * ... : [collection] [element] | +| array_flow.rb:50:10:50:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:50:10:50:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:51:10:51:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:51:10:51:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:55:5:55:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:55:9:55:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:55:5:55:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:55:9:55:24 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:55:10:55:20 | call to source | semmle.label | call to source | -| array_flow.rb:56:5:56:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:56:9:56:24 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:56:5:56:5 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:56:9:56:24 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:56:13:56:23 | call to source | semmle.label | call to source | -| array_flow.rb:57:5:57:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:57:5:57:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:57:9:57:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] | semmle.label | ... + ... [element 0] | -| array_flow.rb:57:9:57:13 | ... + ... [element] | semmle.label | ... + ... [element] | -| array_flow.rb:57:13:57:13 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:58:10:58:10 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:58:10:58:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:57:5:57:5 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:57:5:57:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:57:9:57:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... : Array [element 0] | semmle.label | ... + ... : Array [element 0] | +| array_flow.rb:57:9:57:13 | ... + ... : [collection] [element] | semmle.label | ... + ... : [collection] [element] | +| array_flow.rb:57:13:57:13 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:58:10:58:10 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:58:10:58:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:58:10:58:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:59:10:59:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:59:10:59:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:63:5:63:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:63:9:63:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:63:5:63:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:63:9:63:24 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:63:10:63:20 | call to source | semmle.label | call to source | -| array_flow.rb:65:5:65:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:65:9:65:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:65:9:65:13 | ... - ... [element] | semmle.label | ... - ... [element] | -| array_flow.rb:66:10:66:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:65:5:65:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:65:9:65:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:65:9:65:13 | ... - ... : [collection] [element] | semmle.label | ... - ... : [collection] [element] | +| array_flow.rb:66:10:66:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:66:10:66:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:67:10:67:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:67:10:67:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:71:5:71:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:71:9:71:24 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:71:5:71:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:71:9:71:24 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:71:10:71:20 | call to source | semmle.label | call to source | -| array_flow.rb:72:5:72:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:72:5:72:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:72:9:72:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:72:9:72:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] | semmle.label | ... << ... [element 0] | -| array_flow.rb:72:9:72:24 | ... << ... [element] | semmle.label | ... << ... [element] | +| array_flow.rb:72:5:72:5 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:72:5:72:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:72:9:72:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:72:9:72:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... : Array [element 0] | semmle.label | ... << ... : Array [element 0] | +| array_flow.rb:72:9:72:24 | ... << ... : [collection] [element] | semmle.label | ... << ... : [collection] [element] | | array_flow.rb:72:14:72:24 | call to source | semmle.label | call to source | -| array_flow.rb:73:10:73:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:73:10:73:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:73:10:73:10 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:73:10:73:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:73:10:73:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:74:10:74:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:74:10:74:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:74:10:74:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:75:10:75:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:75:10:75:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:75:10:75:10 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:75:10:75:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:75:10:75:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:76:10:76:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:76:10:76:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:80:5:80:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:80:9:80:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:80:5:80:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:80:9:80:25 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:80:13:80:21 | call to source | semmle.label | call to source | | array_flow.rb:81:8:81:8 | c | semmle.label | c | -| array_flow.rb:81:15:81:15 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:81:15:81:15 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:83:10:83:10 | c | semmle.label | c | -| array_flow.rb:88:5:88:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:88:9:88:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:88:5:88:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:88:9:88:26 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:88:13:88:22 | call to source | semmle.label | call to source | -| array_flow.rb:89:5:89:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:89:9:89:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:91:10:91:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:89:5:89:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:89:9:89:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:89:9:89:15 | ...[...] : [collection] [element 1] | semmle.label | ...[...] : [collection] [element 1] | +| array_flow.rb:91:10:91:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:91:10:91:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:92:10:92:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:92:10:92:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:96:5:96:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:96:9:96:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:96:5:96:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:96:9:96:26 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:96:13:96:22 | call to source | semmle.label | call to source | -| array_flow.rb:97:5:97:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:97:9:97:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:99:10:99:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:97:5:97:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:97:9:97:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:97:9:97:15 | ...[...] : [collection] [element 1] | semmle.label | ...[...] : [collection] [element 1] | +| array_flow.rb:99:10:99:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:99:10:99:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:101:10:101:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:101:10:101:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:103:5:103:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:103:9:103:39 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:103:5:103:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:103:9:103:39 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:103:13:103:24 | call to source | semmle.label | call to source | -| array_flow.rb:104:5:104:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:104:9:104:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:106:10:106:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:104:5:104:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:104:9:104:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:104:9:104:16 | ...[...] : [collection] [element 1] | semmle.label | ...[...] : [collection] [element 1] | +| array_flow.rb:106:10:106:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:109:5:109:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:109:5:109:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:109:9:109:42 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| array_flow.rb:109:9:109:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:109:5:109:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:109:5:109:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:109:9:109:42 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| array_flow.rb:109:9:109:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:109:13:109:24 | call to source | semmle.label | call to source | | array_flow.rb:109:30:109:41 | call to source | semmle.label | call to source | -| array_flow.rb:110:5:110:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:110:9:110:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:110:9:110:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:110:9:110:18 | ...[...] [element] | semmle.label | ...[...] [element] | -| array_flow.rb:111:10:111:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:110:5:110:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:110:9:110:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:110:9:110:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:110:9:110:18 | ...[...] : [collection] [element] | semmle.label | ...[...] : [collection] [element] | +| array_flow.rb:111:10:111:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:111:10:111:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:112:10:112:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:112:10:112:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:114:5:114:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:114:9:114:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:114:9:114:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:114:9:114:19 | ...[...] [element] | semmle.label | ...[...] [element] | -| array_flow.rb:115:10:115:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:114:5:114:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:114:9:114:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:114:9:114:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:114:9:114:19 | ...[...] : [collection] [element] | semmle.label | ...[...] : [collection] [element] | +| array_flow.rb:115:10:115:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:115:10:115:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:116:10:116:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:116:10:116:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:116:10:116:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:121:5:121:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:121:5:121:5 | [post] a : [collection] [element] : [collection] | semmle.label | [post] a : [collection] [element] : [collection] | | array_flow.rb:121:15:121:24 | call to source | semmle.label | call to source | -| array_flow.rb:122:10:122:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:122:10:122:10 | a : [collection] [element] : [collection] | semmle.label | a : [collection] [element] : [collection] | | array_flow.rb:122:10:122:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:123:10:123:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:123:10:123:10 | a : [collection] [element] : [collection] | semmle.label | a : [collection] [element] : [collection] | | array_flow.rb:123:10:123:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:124:10:124:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:124:10:124:10 | a : [collection] [element] : [collection] | semmle.label | a : [collection] [element] : [collection] | | array_flow.rb:124:10:124:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:129:5:129:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:129:15:129:32 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:129:5:129:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:129:15:129:32 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:129:19:129:28 | call to source | semmle.label | call to source | -| array_flow.rb:130:10:130:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:130:10:130:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:130:10:130:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:131:10:131:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:131:10:131:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:131:10:131:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:132:10:132:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:132:10:132:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:132:10:132:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:137:5:137:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:137:5:137:5 | [post] a : [collection] [element] : [collection] | semmle.label | [post] a : [collection] [element] : [collection] | | array_flow.rb:137:15:137:24 | call to source | semmle.label | call to source | -| array_flow.rb:138:10:138:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:138:10:138:10 | a : [collection] [element] : [collection] | semmle.label | a : [collection] [element] : [collection] | | array_flow.rb:138:10:138:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:139:10:139:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:139:10:139:10 | a : [collection] [element] : [collection] | semmle.label | a : [collection] [element] : [collection] | | array_flow.rb:139:10:139:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:140:10:140:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:140:10:140:10 | a : [collection] [element] : [collection] | semmle.label | a : [collection] [element] : [collection] | | array_flow.rb:140:10:140:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:145:5:145:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:145:15:145:32 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:145:5:145:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:145:15:145:32 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:145:19:145:28 | call to source | semmle.label | call to source | -| array_flow.rb:146:10:146:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:146:10:146:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:146:10:146:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:147:10:147:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:147:10:147:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:147:10:147:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:148:10:148:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:148:10:148:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:152:5:152:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:152:9:152:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:152:5:152:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:152:9:152:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:152:16:152:25 | call to source | semmle.label | call to source | -| array_flow.rb:153:5:153:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:153:5:153:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:153:16:153:16 | x | semmle.label | x | | array_flow.rb:154:14:154:14 | x | semmle.label | x | -| array_flow.rb:159:5:159:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:159:9:159:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:159:5:159:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:159:9:159:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:159:16:159:25 | call to source | semmle.label | call to source | -| array_flow.rb:160:5:160:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:160:5:160:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:160:16:160:16 | x | semmle.label | x | | array_flow.rb:161:14:161:14 | x | semmle.label | x | -| array_flow.rb:166:5:166:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:166:9:166:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:166:5:166:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:166:9:166:25 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:166:10:166:21 | call to source | semmle.label | call to source | -| array_flow.rb:167:5:167:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:167:5:167:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:167:9:167:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:167:9:167:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:167:9:167:44 | call to append [element 0] | semmle.label | call to append [element 0] | -| array_flow.rb:167:9:167:44 | call to append [element] | semmle.label | call to append [element] | +| array_flow.rb:167:5:167:5 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:167:5:167:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:167:9:167:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:167:9:167:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:167:9:167:44 | call to append : Array [element 0] | semmle.label | call to append : Array [element 0] | +| array_flow.rb:167:9:167:44 | call to append : [collection] [element] | semmle.label | call to append : [collection] [element] | | array_flow.rb:167:18:167:29 | call to source | semmle.label | call to source | | array_flow.rb:167:32:167:43 | call to source | semmle.label | call to source | -| array_flow.rb:168:10:168:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:168:10:168:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:168:10:168:10 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:168:10:168:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:168:10:168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:169:10:169:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:169:10:169:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:169:10:169:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:170:10:170:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:170:10:170:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:170:10:170:10 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:170:10:170:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:170:10:170:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:171:10:171:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:171:10:171:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:177:5:177:5 | c [element 1] | semmle.label | c [element 1] | -| array_flow.rb:177:9:177:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:177:5:177:5 | c : Array [element 1] | semmle.label | c : Array [element 1] | +| array_flow.rb:177:9:177:25 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:177:15:177:24 | call to source | semmle.label | call to source | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | -| array_flow.rb:178:9:178:17 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, element 1] | -| array_flow.rb:178:16:178:16 | c [element 1] | semmle.label | c [element 1] | +| array_flow.rb:178:5:178:5 | d : Array [element 2, element 1] | semmle.label | d : Array [element 2, element 1] | +| array_flow.rb:178:9:178:17 | call to [] : Array [element 2, element 1] | semmle.label | call to [] : Array [element 2, element 1] | +| array_flow.rb:178:16:178:16 | c : Array [element 1] | semmle.label | c : Array [element 1] | | array_flow.rb:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:179:11:179:11 | d : Array [element 2, element 1] | semmle.label | d : Array [element 2, element 1] | | array_flow.rb:179:11:179:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | | array_flow.rb:179:11:179:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:180:10:180:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | +| array_flow.rb:180:11:180:11 | d : Array [element 2, element 1] | semmle.label | d : Array [element 2, element 1] | | array_flow.rb:180:11:180:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | | array_flow.rb:180:11:180:25 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:184:5:184:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:184:9:184:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:184:5:184:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:184:9:184:26 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:184:13:184:22 | call to source | semmle.label | call to source | -| array_flow.rb:186:10:186:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:186:10:186:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:186:10:186:16 | call to at | semmle.label | call to at | -| array_flow.rb:188:10:188:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:188:10:188:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:188:10:188:16 | call to at | semmle.label | call to at | -| array_flow.rb:192:5:192:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:192:9:192:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:192:5:192:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:192:9:192:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:192:16:192:25 | call to source | semmle.label | call to source | | array_flow.rb:193:5:193:5 | b | semmle.label | b | -| array_flow.rb:193:9:193:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:193:9:193:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:193:9:195:7 | call to bsearch | semmle.label | call to bsearch | | array_flow.rb:193:23:193:23 | x | semmle.label | x | | array_flow.rb:194:14:194:14 | x | semmle.label | x | | array_flow.rb:196:10:196:10 | b | semmle.label | b | -| array_flow.rb:200:5:200:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:200:9:200:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:200:5:200:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:200:9:200:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:200:16:200:25 | call to source | semmle.label | call to source | -| array_flow.rb:201:9:201:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:201:9:201:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:201:29:201:29 | x | semmle.label | x | | array_flow.rb:202:14:202:14 | x | semmle.label | x | -| array_flow.rb:208:5:208:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:208:9:208:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:208:5:208:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:208:9:208:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:208:16:208:25 | call to source | semmle.label | call to source | -| array_flow.rb:209:5:209:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:209:5:209:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:209:17:209:17 | x | semmle.label | x | | array_flow.rb:210:14:210:14 | x | semmle.label | x | -| array_flow.rb:215:5:215:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:215:5:215:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:215:9:215:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:215:9:215:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:215:5:215:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:215:5:215:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:215:9:215:42 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:215:9:215:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:215:16:215:27 | call to source | semmle.label | call to source | | array_flow.rb:215:30:215:41 | call to source | semmle.label | call to source | -| array_flow.rb:216:9:216:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:216:9:216:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:216:9:216:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:216:9:216:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:216:27:216:27 | x | semmle.label | x | | array_flow.rb:216:30:216:30 | y | semmle.label | y | | array_flow.rb:217:14:217:14 | x | semmle.label | x | | array_flow.rb:218:14:218:14 | y | semmle.label | y | -| array_flow.rb:231:5:231:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:231:9:231:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:231:5:231:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:231:9:231:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:231:16:231:27 | call to source | semmle.label | call to source | -| array_flow.rb:232:5:232:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:232:9:232:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:232:9:235:7 | call to collect [element] | semmle.label | call to collect [element] | +| array_flow.rb:232:5:232:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:232:9:232:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:232:9:235:7 | call to collect : [collection] [element] | semmle.label | call to collect : [collection] [element] | | array_flow.rb:232:23:232:23 | x | semmle.label | x | | array_flow.rb:233:14:233:14 | x | semmle.label | x | | array_flow.rb:234:9:234:19 | call to source | semmle.label | call to source | -| array_flow.rb:236:10:236:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:236:10:236:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:240:5:240:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:240:9:240:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:240:5:240:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:240:9:240:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:240:16:240:27 | call to source | semmle.label | call to source | -| array_flow.rb:241:5:241:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:241:9:241:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:241:9:241:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:241:9:244:7 | call to collect! [element] | semmle.label | call to collect! [element] | +| array_flow.rb:241:5:241:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:241:9:241:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:241:9:241:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:241:9:244:7 | call to collect! : [collection] [element] | semmle.label | call to collect! : [collection] [element] | | array_flow.rb:241:24:241:24 | x | semmle.label | x | | array_flow.rb:242:14:242:14 | x | semmle.label | x | | array_flow.rb:243:9:243:19 | call to source | semmle.label | call to source | -| array_flow.rb:245:10:245:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:245:10:245:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:245:10:245:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:246:10:246:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:246:10:246:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:250:5:250:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:250:9:250:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:250:5:250:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:250:9:250:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:250:16:250:27 | call to source | semmle.label | call to source | -| array_flow.rb:251:5:251:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:251:9:251:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | +| array_flow.rb:251:5:251:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:251:9:251:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:251:9:254:7 | call to collect_concat : [collection] [element] | semmle.label | call to collect_concat : [collection] [element] | | array_flow.rb:251:30:251:30 | x | semmle.label | x | | array_flow.rb:252:14:252:14 | x | semmle.label | x | -| array_flow.rb:253:9:253:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:253:9:253:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:253:9:253:25 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:253:9:253:25 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:253:10:253:10 | x | semmle.label | x | | array_flow.rb:253:13:253:24 | call to source | semmle.label | call to source | -| array_flow.rb:255:10:255:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:255:10:255:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:256:5:256:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:256:9:256:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | +| array_flow.rb:256:5:256:5 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | +| array_flow.rb:256:9:256:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:256:9:259:7 | call to collect_concat : [collection] [element] : [collection] | semmle.label | call to collect_concat : [collection] [element] : [collection] | | array_flow.rb:256:30:256:30 | x | semmle.label | x | | array_flow.rb:257:14:257:14 | x | semmle.label | x | | array_flow.rb:258:9:258:20 | call to source | semmle.label | call to source | -| array_flow.rb:260:10:260:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:260:10:260:10 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | | array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:264:5:264:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:264:9:264:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:264:5:264:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:264:9:264:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:264:16:264:25 | call to source | semmle.label | call to source | -| array_flow.rb:265:5:265:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:265:9:265:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:265:9:267:7 | call to combination [element 2] | semmle.label | call to combination [element 2] | -| array_flow.rb:265:30:265:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:266:14:266:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:265:5:265:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:265:9:265:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:265:9:267:7 | call to combination : Array [element 2] | semmle.label | call to combination : Array [element 2] | +| array_flow.rb:265:30:265:30 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| array_flow.rb:266:14:266:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:266:14:266:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:269:10:269:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:269:10:269:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:273:5:273:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:273:9:273:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:273:5:273:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:273:9:273:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:273:16:273:25 | call to source | semmle.label | call to source | -| array_flow.rb:274:5:274:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:274:9:274:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:274:9:274:17 | call to compact [element] | semmle.label | call to compact [element] | -| array_flow.rb:275:10:275:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:274:5:274:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:274:9:274:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:274:9:274:17 | call to compact : [collection] [element] | semmle.label | call to compact : [collection] [element] | +| array_flow.rb:275:10:275:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:279:5:279:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:279:9:279:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:279:5:279:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:279:9:279:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:279:16:279:25 | call to source | semmle.label | call to source | -| array_flow.rb:280:5:280:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:280:9:280:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:280:9:280:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:280:9:280:18 | call to compact! [element] | semmle.label | call to compact! [element] | -| array_flow.rb:281:10:281:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:280:5:280:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:280:9:280:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:280:9:280:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:280:9:280:18 | call to compact! : [collection] [element] | semmle.label | call to compact! : [collection] [element] | +| array_flow.rb:281:10:281:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:282:10:282:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:282:10:282:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:286:5:286:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:286:9:286:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:286:5:286:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:286:9:286:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:286:16:286:27 | call to source | semmle.label | call to source | -| array_flow.rb:287:5:287:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:287:9:287:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:287:5:287:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:287:9:287:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:287:16:287:27 | call to source | semmle.label | call to source | -| array_flow.rb:288:5:288:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:288:14:288:14 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:289:10:289:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:288:5:288:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:288:14:288:14 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:289:10:289:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:289:10:289:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:290:10:290:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:290:10:290:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:290:10:290:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:290:10:290:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:294:5:294:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:294:9:294:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:294:5:294:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:294:9:294:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:294:16:294:25 | call to source | semmle.label | call to source | -| array_flow.rb:295:5:295:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:295:5:295:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:295:17:295:17 | x | semmle.label | x | | array_flow.rb:296:14:296:14 | x | semmle.label | x | -| array_flow.rb:301:5:301:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:301:9:301:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:301:5:301:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:301:9:301:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:301:16:301:25 | call to source | semmle.label | call to source | -| array_flow.rb:302:5:302:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:302:5:302:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:302:20:302:20 | x | semmle.label | x | | array_flow.rb:303:14:303:14 | x | semmle.label | x | -| array_flow.rb:308:5:308:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:308:9:308:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:308:5:308:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:308:9:308:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:308:16:308:25 | call to source | semmle.label | call to source | -| array_flow.rb:309:5:309:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:309:9:309:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | semmle.label | call to deconstruct [element 2] | -| array_flow.rb:312:10:312:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:309:5:309:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:309:9:309:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:309:9:309:21 | call to deconstruct : Array [element 2] | semmle.label | call to deconstruct : Array [element 2] | +| array_flow.rb:312:10:312:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:316:5:316:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:316:9:316:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:316:5:316:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:316:9:316:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:316:16:316:27 | call to source | semmle.label | call to source | | array_flow.rb:317:5:317:5 | b | semmle.label | b | -| array_flow.rb:317:9:317:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:317:9:317:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:317:9:317:36 | call to delete | semmle.label | call to delete | | array_flow.rb:317:23:317:34 | call to source | semmle.label | call to source | | array_flow.rb:318:10:318:10 | b | semmle.label | b | -| array_flow.rb:325:5:325:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:325:5:325:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:325:9:325:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:325:9:325:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:325:5:325:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:325:5:325:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:325:9:325:42 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:325:9:325:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:325:16:325:27 | call to source | semmle.label | call to source | | array_flow.rb:325:30:325:41 | call to source | semmle.label | call to source | | array_flow.rb:326:5:326:5 | b | semmle.label | b | -| array_flow.rb:326:9:326:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:326:9:326:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:326:9:326:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:326:9:326:9 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:326:9:326:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:326:9:326:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:326:9:326:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:327:10:327:10 | b | semmle.label | b | -| array_flow.rb:328:10:328:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:328:10:328:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | | array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:330:5:330:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:330:5:330:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:330:9:330:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:330:9:330:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:330:5:330:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:330:5:330:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:330:9:330:42 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:330:9:330:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:330:16:330:27 | call to source | semmle.label | call to source | | array_flow.rb:330:30:330:41 | call to source | semmle.label | call to source | | array_flow.rb:331:5:331:5 | b | semmle.label | b | -| array_flow.rb:331:9:331:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:331:9:331:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:331:9:331:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:331:9:331:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:331:9:331:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:331:9:331:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:331:9:331:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:332:10:332:10 | b | semmle.label | b | -| array_flow.rb:333:10:333:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:333:10:333:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:334:10:334:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:334:10:334:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:338:5:338:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:338:9:338:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:338:5:338:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:338:9:338:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:338:16:338:25 | call to source | semmle.label | call to source | -| array_flow.rb:339:5:339:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:339:9:339:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:339:9:339:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:339:9:341:7 | call to delete_if [element] | semmle.label | call to delete_if [element] | +| array_flow.rb:339:5:339:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:339:9:339:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:339:9:339:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:339:9:341:7 | call to delete_if : [collection] [element] | semmle.label | call to delete_if : [collection] [element] | | array_flow.rb:339:25:339:25 | x | semmle.label | x | | array_flow.rb:340:14:340:14 | x | semmle.label | x | -| array_flow.rb:342:10:342:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:342:10:342:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:342:10:342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:343:10:343:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:343:10:343:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:343:10:343:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:344:10:344:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:344:10:344:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:345:10:345:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:345:10:345:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:349:5:349:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:349:9:349:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:349:5:349:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:349:9:349:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:349:16:349:25 | call to source | semmle.label | call to source | -| array_flow.rb:350:5:350:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:350:9:350:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:350:9:350:25 | call to difference [element] | semmle.label | call to difference [element] | -| array_flow.rb:351:10:351:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:350:5:350:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:350:9:350:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:350:9:350:25 | call to difference : [collection] [element] | semmle.label | call to difference : [collection] [element] | +| array_flow.rb:351:10:351:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:355:5:355:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | -| array_flow.rb:355:9:355:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:355:9:355:47 | call to [] [element 3, element 1] | semmle.label | call to [] [element 3, element 1] | +| array_flow.rb:355:5:355:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:355:5:355:5 | a : Array [element 3, element 1] | semmle.label | a : Array [element 3, element 1] | +| array_flow.rb:355:9:355:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:355:9:355:47 | call to [] : Array [element 3, element 1] | semmle.label | call to [] : Array [element 3, element 1] | | array_flow.rb:355:16:355:27 | call to source | semmle.label | call to source | -| array_flow.rb:355:30:355:46 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:355:30:355:46 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:355:34:355:45 | call to source | semmle.label | call to source | -| array_flow.rb:357:10:357:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:357:10:357:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:357:10:357:17 | call to dig | semmle.label | call to dig | -| array_flow.rb:358:10:358:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:358:10:358:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:358:10:358:17 | call to dig | semmle.label | call to dig | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | +| array_flow.rb:360:10:360:10 | a : Array [element 3, element 1] | semmle.label | a : Array [element 3, element 1] | | array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | -| array_flow.rb:364:5:364:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:364:9:364:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:364:5:364:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:364:9:364:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:364:16:364:27 | call to source | semmle.label | call to source | | array_flow.rb:365:5:365:5 | b | semmle.label | b | -| array_flow.rb:365:9:365:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:365:9:365:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:365:9:367:7 | call to detect | semmle.label | call to detect | | array_flow.rb:365:23:365:34 | call to source | semmle.label | call to source | | array_flow.rb:365:43:365:43 | x | semmle.label | x | | array_flow.rb:366:14:366:14 | x | semmle.label | x | | array_flow.rb:368:10:368:10 | b | semmle.label | b | -| array_flow.rb:372:5:372:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:372:5:372:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:372:9:372:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:372:9:372:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:372:5:372:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:372:5:372:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:372:9:372:42 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:372:9:372:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:372:16:372:27 | call to source | semmle.label | call to source | | array_flow.rb:372:30:372:41 | call to source | semmle.label | call to source | -| array_flow.rb:373:5:373:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:373:9:373:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:373:9:373:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:373:9:373:17 | call to drop [element] | semmle.label | call to drop [element] | -| array_flow.rb:374:10:374:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:373:5:373:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:373:9:373:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:373:9:373:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:373:9:373:17 | call to drop : [collection] [element] | semmle.label | call to drop : [collection] [element] | +| array_flow.rb:374:10:374:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:375:5:375:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:375:5:375:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:375:9:375:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:375:9:375:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:375:9:375:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | -| array_flow.rb:375:9:375:17 | call to drop [element 2] | semmle.label | call to drop [element 2] | -| array_flow.rb:377:10:377:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:375:5:375:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:375:5:375:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:375:9:375:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:375:9:375:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:375:9:375:17 | call to drop : [collection] [element 1] | semmle.label | call to drop : [collection] [element 1] | +| array_flow.rb:375:9:375:17 | call to drop : [collection] [element 2] | semmle.label | call to drop : [collection] [element 2] | +| array_flow.rb:377:10:377:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:378:10:378:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:378:10:378:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:378:10:378:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:379:5:379:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:379:5:379:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:379:12:379:23 | call to source | semmle.label | call to source | -| array_flow.rb:380:5:380:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:380:5:380:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:380:9:380:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:380:9:380:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:380:9:380:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | -| array_flow.rb:380:9:380:17 | call to drop [element] | semmle.label | call to drop [element] | -| array_flow.rb:381:10:381:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:381:10:381:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:380:5:380:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:380:5:380:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:380:9:380:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:380:9:380:9 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| array_flow.rb:380:9:380:17 | call to drop : [collection] [element 1] | semmle.label | call to drop : [collection] [element 1] | +| array_flow.rb:380:9:380:17 | call to drop : [collection] [element] | semmle.label | call to drop : [collection] [element] | +| array_flow.rb:381:10:381:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:381:10:381:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:382:5:382:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:382:9:382:9 | b [element] | semmle.label | b [element] | -| array_flow.rb:382:9:382:19 | call to drop [element] | semmle.label | call to drop [element] | -| array_flow.rb:383:10:383:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:382:5:382:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:382:9:382:9 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:382:9:382:19 | call to drop : [collection] [element] | semmle.label | call to drop : [collection] [element] | +| array_flow.rb:383:10:383:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:387:5:387:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:387:5:387:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:387:9:387:42 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:387:9:387:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:387:5:387:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:387:5:387:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:387:9:387:42 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:387:9:387:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:387:16:387:27 | call to source | semmle.label | call to source | | array_flow.rb:387:30:387:41 | call to source | semmle.label | call to source | -| array_flow.rb:388:5:388:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:388:9:388:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:388:9:388:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:388:9:390:7 | call to drop_while [element] | semmle.label | call to drop_while [element] | +| array_flow.rb:388:5:388:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:388:9:388:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:388:9:388:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:388:9:390:7 | call to drop_while : [collection] [element] | semmle.label | call to drop_while : [collection] [element] | | array_flow.rb:388:26:388:26 | x | semmle.label | x | | array_flow.rb:389:14:389:14 | x | semmle.label | x | -| array_flow.rb:391:10:391:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:391:10:391:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:395:5:395:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:395:9:395:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:395:5:395:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:395:9:395:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:395:16:395:25 | call to source | semmle.label | call to source | -| array_flow.rb:396:5:396:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:396:9:396:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:396:9:398:7 | call to each [element 2] | semmle.label | call to each [element 2] | +| array_flow.rb:396:5:396:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:396:9:396:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:396:9:398:7 | call to each : Array [element 2] | semmle.label | call to each : Array [element 2] | | array_flow.rb:396:20:396:20 | x | semmle.label | x | | array_flow.rb:397:14:397:14 | x | semmle.label | x | -| array_flow.rb:399:10:399:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:399:10:399:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:403:5:403:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:403:9:403:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:403:5:403:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:403:9:403:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:403:16:403:25 | call to source | semmle.label | call to source | -| array_flow.rb:404:5:404:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:404:18:404:18 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:404:5:404:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:404:18:404:18 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:405:14:405:14 | x | semmle.label | x | | array_flow.rb:407:10:407:10 | x | semmle.label | x | -| array_flow.rb:408:10:408:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:408:10:408:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:412:5:412:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:412:9:412:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:412:5:412:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:412:9:412:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:412:16:412:25 | call to source | semmle.label | call to source | -| array_flow.rb:413:5:413:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:413:24:413:24 | x [element] | semmle.label | x [element] | +| array_flow.rb:413:5:413:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:413:24:413:24 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:414:14:414:19 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:414:15:414:15 | x [element] | semmle.label | x [element] | +| array_flow.rb:414:15:414:15 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:414:15:414:18 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:419:5:419:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:419:9:419:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:419:5:419:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:419:9:419:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:419:16:419:25 | call to source | semmle.label | call to source | -| array_flow.rb:420:5:420:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:420:9:420:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | semmle.label | call to each_entry [element 2] | +| array_flow.rb:420:5:420:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:420:9:420:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:420:9:422:7 | call to each_entry : Array [element 2] | semmle.label | call to each_entry : Array [element 2] | | array_flow.rb:420:26:420:26 | x | semmle.label | x | | array_flow.rb:421:14:421:14 | x | semmle.label | x | -| array_flow.rb:423:10:423:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:423:10:423:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:427:5:427:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:427:9:427:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:427:5:427:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:427:9:427:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:427:16:427:25 | call to source | semmle.label | call to source | -| array_flow.rb:428:5:428:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:428:9:428:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] | semmle.label | call to each_index [element 2] | -| array_flow.rb:431:10:431:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:428:5:428:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:428:9:428:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:428:9:430:7 | call to each_index : Array [element 2] | semmle.label | call to each_index : Array [element 2] | +| array_flow.rb:431:10:431:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:435:5:435:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:435:9:435:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:435:5:435:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:435:9:435:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:435:19:435:28 | call to source | semmle.label | call to source | -| array_flow.rb:436:5:436:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:436:25:436:25 | x [element] | semmle.label | x [element] | -| array_flow.rb:437:14:437:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:436:5:436:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:436:25:436:25 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| array_flow.rb:437:14:437:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:442:5:442:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:442:9:442:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:442:5:442:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:442:9:442:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:442:19:442:28 | call to source | semmle.label | call to source | -| array_flow.rb:443:5:443:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:443:9:443:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | semmle.label | call to each_with_index [element 3] | +| array_flow.rb:443:5:443:5 | b : Array [element 3] | semmle.label | b : Array [element 3] | +| array_flow.rb:443:9:443:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:443:9:446:7 | call to each_with_index : Array [element 3] | semmle.label | call to each_with_index : Array [element 3] | | array_flow.rb:443:31:443:31 | x | semmle.label | x | | array_flow.rb:444:14:444:14 | x | semmle.label | x | -| array_flow.rb:447:10:447:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:447:10:447:10 | b : Array [element 3] | semmle.label | b : Array [element 3] | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:451:5:451:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:451:9:451:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:451:5:451:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:451:9:451:31 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:451:19:451:30 | call to source | semmle.label | call to source | | array_flow.rb:452:5:452:5 | b | semmle.label | b | -| array_flow.rb:452:9:452:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:452:9:452:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:452:9:455:7 | call to each_with_object | semmle.label | call to each_with_object | | array_flow.rb:452:28:452:39 | call to source | semmle.label | call to source | | array_flow.rb:452:46:452:46 | x | semmle.label | x | @@ -2981,34 +2981,34 @@ nodes | array_flow.rb:453:14:453:14 | x | semmle.label | x | | array_flow.rb:454:14:454:14 | a | semmle.label | a | | array_flow.rb:456:10:456:10 | b | semmle.label | b | -| array_flow.rb:460:5:460:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:460:9:460:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:460:5:460:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:460:9:460:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:460:19:460:28 | call to source | semmle.label | call to source | -| array_flow.rb:461:5:461:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:461:9:461:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:461:9:461:17 | call to entries [element 3] | semmle.label | call to entries [element 3] | -| array_flow.rb:462:10:462:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:461:5:461:5 | b : Array [element 3] | semmle.label | b : Array [element 3] | +| array_flow.rb:461:9:461:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:461:9:461:17 | call to entries : Array [element 3] | semmle.label | call to entries : Array [element 3] | +| array_flow.rb:462:10:462:10 | b : Array [element 3] | semmle.label | b : Array [element 3] | | array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:466:5:466:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:466:5:466:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:466:9:466:45 | call to [] [element 3] | semmle.label | call to [] [element 3] | -| array_flow.rb:466:9:466:45 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:466:5:466:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:466:5:466:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:466:9:466:45 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | +| array_flow.rb:466:9:466:45 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:466:19:466:30 | call to source | semmle.label | call to source | | array_flow.rb:466:33:466:44 | call to source | semmle.label | call to source | | array_flow.rb:467:5:467:5 | b | semmle.label | b | -| array_flow.rb:467:9:467:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:467:9:467:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:467:9:467:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:467:9:467:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | | array_flow.rb:467:9:469:7 | call to fetch | semmle.label | call to fetch | | array_flow.rb:467:17:467:28 | call to source | semmle.label | call to source | | array_flow.rb:467:35:467:35 | x | semmle.label | x | | array_flow.rb:468:14:468:14 | x | semmle.label | x | | array_flow.rb:470:10:470:10 | b | semmle.label | b | | array_flow.rb:471:5:471:5 | b | semmle.label | b | -| array_flow.rb:471:9:471:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:471:9:471:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:471:9:471:18 | call to fetch | semmle.label | call to fetch | | array_flow.rb:472:10:472:10 | b | semmle.label | b | | array_flow.rb:473:5:473:5 | b | semmle.label | b | -| array_flow.rb:473:9:473:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:473:9:473:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:473:9:473:32 | call to fetch | semmle.label | call to fetch | | array_flow.rb:473:20:473:31 | call to source | semmle.label | call to source | | array_flow.rb:474:10:474:10 | b | semmle.label | b | @@ -3017,241 +3017,241 @@ nodes | array_flow.rb:475:22:475:33 | call to source | semmle.label | call to source | | array_flow.rb:476:10:476:10 | b | semmle.label | b | | array_flow.rb:477:5:477:5 | b | semmle.label | b | -| array_flow.rb:477:9:477:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:477:9:477:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:477:9:477:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:477:9:477:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | | array_flow.rb:477:9:477:32 | call to fetch | semmle.label | call to fetch | | array_flow.rb:477:20:477:31 | call to source | semmle.label | call to source | | array_flow.rb:478:10:478:10 | b | semmle.label | b | -| array_flow.rb:482:5:482:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:482:9:482:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:482:5:482:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:482:9:482:31 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:482:19:482:30 | call to source | semmle.label | call to source | -| array_flow.rb:483:5:483:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:483:5:483:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:483:12:483:23 | call to source | semmle.label | call to source | -| array_flow.rb:484:10:484:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:484:10:484:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:484:10:484:10 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:484:10:484:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:484:10:484:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:485:5:485:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:485:5:485:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:485:12:485:23 | call to source | semmle.label | call to source | -| array_flow.rb:486:10:486:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:486:10:486:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:486:10:486:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:487:5:487:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:487:5:487:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:488:9:488:20 | call to source | semmle.label | call to source | -| array_flow.rb:490:10:490:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:490:10:490:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:490:10:490:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:491:5:491:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:491:5:491:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:492:9:492:20 | call to source | semmle.label | call to source | -| array_flow.rb:494:10:494:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:494:10:494:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:498:5:498:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:498:9:498:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:498:5:498:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:498:9:498:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:498:19:498:28 | call to source | semmle.label | call to source | -| array_flow.rb:499:5:499:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:499:9:499:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:499:9:501:7 | call to filter [element] | semmle.label | call to filter [element] | +| array_flow.rb:499:5:499:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:499:9:499:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:499:9:501:7 | call to filter : [collection] [element] | semmle.label | call to filter : [collection] [element] | | array_flow.rb:499:22:499:22 | x | semmle.label | x | | array_flow.rb:500:14:500:14 | x | semmle.label | x | -| array_flow.rb:502:10:502:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:502:10:502:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:506:5:506:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:506:9:506:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:506:5:506:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:506:9:506:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:506:19:506:28 | call to source | semmle.label | call to source | -| array_flow.rb:507:5:507:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:507:9:507:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:507:9:510:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | +| array_flow.rb:507:5:507:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:507:9:507:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:507:9:510:7 | call to filter_map : [collection] [element] | semmle.label | call to filter_map : [collection] [element] | | array_flow.rb:507:26:507:26 | x | semmle.label | x | | array_flow.rb:508:14:508:14 | x | semmle.label | x | | array_flow.rb:509:9:509:9 | x | semmle.label | x | -| array_flow.rb:511:10:511:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:511:10:511:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:511:10:511:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:518:5:518:5 | d [element] | semmle.label | d [element] | -| array_flow.rb:518:9:520:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | +| array_flow.rb:518:5:518:5 | d : [collection] [element] | semmle.label | d : [collection] [element] | +| array_flow.rb:518:9:520:7 | call to filter_map : [collection] [element] | semmle.label | call to filter_map : [collection] [element] | | array_flow.rb:519:9:519:20 | call to source | semmle.label | call to source | -| array_flow.rb:521:10:521:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:521:10:521:10 | d : [collection] [element] | semmle.label | d : [collection] [element] | | array_flow.rb:521:10:521:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:525:5:525:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:525:9:525:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:525:5:525:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:525:9:525:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:525:19:525:28 | call to source | semmle.label | call to source | -| array_flow.rb:526:5:526:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:526:9:526:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:526:9:526:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:526:9:529:7 | call to filter! [element] | semmle.label | call to filter! [element] | +| array_flow.rb:526:5:526:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:526:9:526:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:526:9:526:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:526:9:529:7 | call to filter! : [collection] [element] | semmle.label | call to filter! : [collection] [element] | | array_flow.rb:526:23:526:23 | x | semmle.label | x | | array_flow.rb:527:14:527:14 | x | semmle.label | x | -| array_flow.rb:530:10:530:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:530:10:530:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:530:10:530:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:531:10:531:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:531:10:531:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:531:10:531:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:535:5:535:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:535:9:535:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:535:5:535:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:535:9:535:31 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:535:19:535:30 | call to source | semmle.label | call to source | | array_flow.rb:536:5:536:5 | b | semmle.label | b | -| array_flow.rb:536:9:536:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:536:9:536:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:536:9:538:7 | call to find | semmle.label | call to find | | array_flow.rb:536:21:536:32 | call to source | semmle.label | call to source | | array_flow.rb:536:41:536:41 | x | semmle.label | x | | array_flow.rb:537:14:537:14 | x | semmle.label | x | | array_flow.rb:539:10:539:10 | b | semmle.label | b | -| array_flow.rb:543:5:543:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:543:9:543:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:543:5:543:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:543:9:543:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:543:19:543:28 | call to source | semmle.label | call to source | -| array_flow.rb:544:5:544:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:544:9:544:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:544:9:546:7 | call to find_all [element] | semmle.label | call to find_all [element] | +| array_flow.rb:544:5:544:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:544:9:544:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:544:9:546:7 | call to find_all : [collection] [element] | semmle.label | call to find_all : [collection] [element] | | array_flow.rb:544:24:544:24 | x | semmle.label | x | | array_flow.rb:545:14:545:14 | x | semmle.label | x | -| array_flow.rb:547:10:547:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:547:10:547:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:547:10:547:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:551:5:551:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:551:9:551:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:551:5:551:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:551:9:551:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:551:19:551:28 | call to source | semmle.label | call to source | -| array_flow.rb:552:5:552:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:552:5:552:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:552:22:552:22 | x | semmle.label | x | | array_flow.rb:553:14:553:14 | x | semmle.label | x | -| array_flow.rb:558:5:558:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:558:5:558:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:558:9:558:42 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:558:9:558:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:558:5:558:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:558:5:558:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:558:9:558:42 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:558:9:558:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:558:10:558:21 | call to source | semmle.label | call to source | | array_flow.rb:558:30:558:41 | call to source | semmle.label | call to source | -| array_flow.rb:559:5:559:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:559:5:559:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:559:12:559:23 | call to source | semmle.label | call to source | -| array_flow.rb:560:10:560:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:560:10:560:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:560:10:560:10 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:560:10:560:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:560:10:560:16 | call to first | semmle.label | call to first | -| array_flow.rb:561:5:561:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:561:5:561:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:561:9:561:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:561:9:561:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:561:9:561:18 | call to first [element 0] | semmle.label | call to first [element 0] | -| array_flow.rb:561:9:561:18 | call to first [element] | semmle.label | call to first [element] | -| array_flow.rb:562:10:562:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:562:10:562:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:561:5:561:5 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:561:5:561:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:561:9:561:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:561:9:561:9 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| array_flow.rb:561:9:561:18 | call to first : Array [element 0] | semmle.label | call to first : Array [element 0] | +| array_flow.rb:561:9:561:18 | call to first : [collection] [element] | semmle.label | call to first : [collection] [element] | +| array_flow.rb:562:10:562:10 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:562:10:562:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:562:10:562:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:563:10:563:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:563:10:563:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:563:10:563:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:564:5:564:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:564:5:564:5 | c [element 3] | semmle.label | c [element 3] | -| array_flow.rb:564:5:564:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:564:9:564:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:564:9:564:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:564:9:564:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:564:9:564:18 | call to first [element 0] | semmle.label | call to first [element 0] | -| array_flow.rb:564:9:564:18 | call to first [element 3] | semmle.label | call to first [element 3] | -| array_flow.rb:564:9:564:18 | call to first [element] | semmle.label | call to first [element] | -| array_flow.rb:565:10:565:10 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:565:10:565:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:564:5:564:5 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:564:5:564:5 | c : Array [element 3] | semmle.label | c : Array [element 3] | +| array_flow.rb:564:5:564:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:564:9:564:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:564:9:564:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:564:9:564:9 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| array_flow.rb:564:9:564:18 | call to first : Array [element 0] | semmle.label | call to first : Array [element 0] | +| array_flow.rb:564:9:564:18 | call to first : Array [element 3] | semmle.label | call to first : Array [element 3] | +| array_flow.rb:564:9:564:18 | call to first : [collection] [element] | semmle.label | call to first : [collection] [element] | +| array_flow.rb:565:10:565:10 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:565:10:565:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:565:10:565:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:566:10:566:10 | c [element 3] | semmle.label | c [element 3] | -| array_flow.rb:566:10:566:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:566:10:566:10 | c : Array [element 3] | semmle.label | c : Array [element 3] | +| array_flow.rb:566:10:566:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:566:10:566:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:570:5:570:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:570:9:570:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:570:5:570:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:570:9:570:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:570:16:570:27 | call to source | semmle.label | call to source | -| array_flow.rb:571:5:571:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:571:9:571:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:571:9:574:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | +| array_flow.rb:571:5:571:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:571:9:571:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:571:9:574:7 | call to flat_map : [collection] [element] | semmle.label | call to flat_map : [collection] [element] | | array_flow.rb:571:24:571:24 | x | semmle.label | x | | array_flow.rb:572:14:572:14 | x | semmle.label | x | -| array_flow.rb:573:9:573:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:573:9:573:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:573:9:573:25 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:573:9:573:25 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:573:10:573:10 | x | semmle.label | x | | array_flow.rb:573:13:573:24 | call to source | semmle.label | call to source | -| array_flow.rb:575:10:575:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:575:10:575:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:576:5:576:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:576:9:576:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:576:9:579:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | +| array_flow.rb:576:5:576:5 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | +| array_flow.rb:576:9:576:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:576:9:579:7 | call to flat_map : [collection] [element] : [collection] | semmle.label | call to flat_map : [collection] [element] : [collection] | | array_flow.rb:576:24:576:24 | x | semmle.label | x | | array_flow.rb:577:14:577:14 | x | semmle.label | x | | array_flow.rb:578:9:578:20 | call to source | semmle.label | call to source | -| array_flow.rb:580:10:580:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:580:10:580:10 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | | array_flow.rb:580:10:580:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:584:5:584:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:584:9:584:31 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, element 1] | -| array_flow.rb:584:16:584:30 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:584:5:584:5 | a : Array [element 2, element 1] | semmle.label | a : Array [element 2, element 1] | +| array_flow.rb:584:9:584:31 | call to [] : Array [element 2, element 1] | semmle.label | call to [] : Array [element 2, element 1] | +| array_flow.rb:584:16:584:30 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:584:20:584:29 | call to source | semmle.label | call to source | -| array_flow.rb:585:5:585:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:585:9:585:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:585:9:585:17 | call to flatten [element] | semmle.label | call to flatten [element] | -| array_flow.rb:586:10:586:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:585:5:585:5 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | +| array_flow.rb:585:9:585:9 | a : Array [element 2, element 1] | semmle.label | a : Array [element 2, element 1] | +| array_flow.rb:585:9:585:17 | call to flatten : [collection] [element] : [collection] | semmle.label | call to flatten : [collection] [element] : [collection] | +| array_flow.rb:586:10:586:10 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | | array_flow.rb:586:10:586:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:590:5:590:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:590:9:590:31 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, element 1] | -| array_flow.rb:590:16:590:30 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:590:5:590:5 | a : Array [element 2, element 1] | semmle.label | a : Array [element 2, element 1] | +| array_flow.rb:590:9:590:31 | call to [] : Array [element 2, element 1] | semmle.label | call to [] : Array [element 2, element 1] | +| array_flow.rb:590:16:590:30 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:590:20:590:29 | call to source | semmle.label | call to source | -| array_flow.rb:591:10:591:10 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | +| array_flow.rb:591:10:591:10 | a : Array [element 2, element 1] | semmle.label | a : Array [element 2, element 1] | | array_flow.rb:591:10:591:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:591:10:591:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:592:5:592:5 | b [element, element 1] | semmle.label | b [element, element 1] | -| array_flow.rb:592:5:592:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:592:9:592:9 | [post] a [element, element 1] | semmle.label | [post] a [element, element 1] | -| array_flow.rb:592:9:592:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | semmle.label | call to flatten! [element, element 1] | -| array_flow.rb:592:9:592:18 | call to flatten! [element] | semmle.label | call to flatten! [element] | -| array_flow.rb:593:10:593:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:592:5:592:5 | b : [collection] [element, element 1] | semmle.label | b : [collection] [element, element 1] | +| array_flow.rb:592:5:592:5 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | +| array_flow.rb:592:9:592:9 | [post] a : [collection] [element, element 1] | semmle.label | [post] a : [collection] [element, element 1] | +| array_flow.rb:592:9:592:9 | [post] a : [collection] [element] : [collection] | semmle.label | [post] a : [collection] [element] : [collection] | +| array_flow.rb:592:9:592:9 | a : Array [element 2, element 1] | semmle.label | a : Array [element 2, element 1] | +| array_flow.rb:592:9:592:18 | call to flatten! : [collection] [element, element 1] | semmle.label | call to flatten! : [collection] [element, element 1] | +| array_flow.rb:592:9:592:18 | call to flatten! : [collection] [element] : [collection] | semmle.label | call to flatten! : [collection] [element] : [collection] | +| array_flow.rb:593:10:593:10 | a : [collection] [element] : [collection] | semmle.label | a : [collection] [element] : [collection] | | array_flow.rb:593:10:593:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:594:10:594:10 | a [element, element 1] | semmle.label | a [element, element 1] | +| array_flow.rb:594:10:594:10 | a : [collection] [element, element 1] | semmle.label | a : [collection] [element, element 1] | | array_flow.rb:594:10:594:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:594:10:594:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:595:10:595:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:595:10:595:10 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | | array_flow.rb:595:10:595:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:596:10:596:10 | b [element, element 1] | semmle.label | b [element, element 1] | +| array_flow.rb:596:10:596:10 | b : [collection] [element, element 1] | semmle.label | b : [collection] [element, element 1] | | array_flow.rb:596:10:596:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:596:10:596:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:600:5:600:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:600:9:600:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:600:5:600:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:600:9:600:31 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:600:19:600:30 | call to source | semmle.label | call to source | -| array_flow.rb:601:5:601:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:601:9:601:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:601:9:601:20 | call to grep [element] | semmle.label | call to grep [element] | -| array_flow.rb:602:10:602:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:601:5:601:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:601:9:601:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:601:9:601:20 | call to grep : [collection] [element] | semmle.label | call to grep : [collection] [element] | +| array_flow.rb:602:10:602:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:603:5:603:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:603:9:603:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:603:9:606:7 | call to grep [element] | semmle.label | call to grep [element] | +| array_flow.rb:603:5:603:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:603:9:603:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:603:9:606:7 | call to grep : [collection] [element] | semmle.label | call to grep : [collection] [element] | | array_flow.rb:603:26:603:26 | x | semmle.label | x | | array_flow.rb:604:14:604:14 | x | semmle.label | x | | array_flow.rb:605:9:605:20 | call to source | semmle.label | call to source | -| array_flow.rb:607:10:607:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:607:10:607:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:611:5:611:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:611:9:611:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:611:5:611:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:611:9:611:31 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:611:19:611:30 | call to source | semmle.label | call to source | -| array_flow.rb:612:5:612:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:612:9:612:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:612:9:612:21 | call to grep_v [element] | semmle.label | call to grep_v [element] | -| array_flow.rb:613:10:613:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:612:5:612:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:612:9:612:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:612:9:612:21 | call to grep_v : [collection] [element] | semmle.label | call to grep_v : [collection] [element] | +| array_flow.rb:613:10:613:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:613:10:613:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:614:5:614:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:614:9:614:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:614:9:617:7 | call to grep_v [element] | semmle.label | call to grep_v [element] | +| array_flow.rb:614:5:614:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:614:9:614:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:614:9:617:7 | call to grep_v : [collection] [element] | semmle.label | call to grep_v : [collection] [element] | | array_flow.rb:614:27:614:27 | x | semmle.label | x | | array_flow.rb:615:14:615:14 | x | semmle.label | x | | array_flow.rb:616:9:616:20 | call to source | semmle.label | call to source | -| array_flow.rb:618:10:618:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:618:10:618:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:618:10:618:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:622:5:622:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:622:9:622:31 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:622:5:622:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:622:9:622:31 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:622:19:622:30 | call to source | semmle.label | call to source | -| array_flow.rb:623:9:623:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:623:9:623:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:623:24:623:24 | x | semmle.label | x | | array_flow.rb:624:14:624:14 | x | semmle.label | x | -| array_flow.rb:631:5:631:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:631:9:631:29 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:631:5:631:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:631:9:631:29 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:631:19:631:28 | call to source | semmle.label | call to source | -| array_flow.rb:632:5:632:5 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:632:5:632:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:632:17:632:17 | x | semmle.label | x | | array_flow.rb:633:14:633:14 | x | semmle.label | x | -| array_flow.rb:638:5:638:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:638:5:638:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:638:9:638:39 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:638:9:638:39 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:638:5:638:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:638:5:638:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:638:9:638:39 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:638:9:638:39 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:638:10:638:21 | call to source | semmle.label | call to source | | array_flow.rb:638:27:638:38 | call to source | semmle.label | call to source | | array_flow.rb:639:5:639:5 | b | semmle.label | b | -| array_flow.rb:639:9:639:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:639:9:639:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:639:9:639:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:639:9:639:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:639:9:643:7 | call to inject | semmle.label | call to inject | | array_flow.rb:639:22:639:22 | x | semmle.label | x | | array_flow.rb:639:25:639:25 | y | semmle.label | y | @@ -3260,1622 +3260,1622 @@ nodes | array_flow.rb:642:9:642:19 | call to source | semmle.label | call to source | | array_flow.rb:644:10:644:10 | b | semmle.label | b | | array_flow.rb:645:5:645:5 | c | semmle.label | c | -| array_flow.rb:645:9:645:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:645:9:645:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:645:9:645:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:645:9:645:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:645:9:649:7 | call to inject | semmle.label | call to inject | | array_flow.rb:645:28:645:28 | y | semmle.label | y | | array_flow.rb:647:14:647:14 | y | semmle.label | y | | array_flow.rb:648:9:648:19 | call to source | semmle.label | call to source | | array_flow.rb:650:10:650:10 | c | semmle.label | c | -| array_flow.rb:655:5:655:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:655:9:655:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:655:5:655:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:655:9:655:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:655:16:655:27 | call to source | semmle.label | call to source | -| array_flow.rb:656:5:656:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:656:5:656:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:656:5:656:5 | b [element 4] | semmle.label | b [element 4] | -| array_flow.rb:656:9:656:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:656:9:656:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:656:9:656:9 | [post] a [element 4] | semmle.label | [post] a [element 4] | -| array_flow.rb:656:9:656:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:656:9:656:47 | call to insert [element 1] | semmle.label | call to insert [element 1] | -| array_flow.rb:656:9:656:47 | call to insert [element 2] | semmle.label | call to insert [element 2] | -| array_flow.rb:656:9:656:47 | call to insert [element 4] | semmle.label | call to insert [element 4] | +| array_flow.rb:656:5:656:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:656:5:656:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:656:5:656:5 | b : [collection] [element 4] | semmle.label | b : [collection] [element 4] | +| array_flow.rb:656:9:656:9 | [post] a : [collection] [element 1] | semmle.label | [post] a : [collection] [element 1] | +| array_flow.rb:656:9:656:9 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:656:9:656:9 | [post] a : [collection] [element 4] | semmle.label | [post] a : [collection] [element 4] | +| array_flow.rb:656:9:656:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:656:9:656:47 | call to insert : [collection] [element 1] | semmle.label | call to insert : [collection] [element 1] | +| array_flow.rb:656:9:656:47 | call to insert : [collection] [element 2] | semmle.label | call to insert : [collection] [element 2] | +| array_flow.rb:656:9:656:47 | call to insert : [collection] [element 4] | semmle.label | call to insert : [collection] [element 4] | | array_flow.rb:656:21:656:32 | call to source | semmle.label | call to source | | array_flow.rb:656:35:656:46 | call to source | semmle.label | call to source | -| array_flow.rb:658:10:658:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:658:10:658:10 | a : [collection] [element 1] | semmle.label | a : [collection] [element 1] | | array_flow.rb:658:10:658:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:659:10:659:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:659:10:659:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | | array_flow.rb:659:10:659:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:661:10:661:10 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:661:10:661:10 | a : [collection] [element 4] | semmle.label | a : [collection] [element 4] | | array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:663:10:663:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:663:10:663:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:663:10:663:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:664:10:664:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:664:10:664:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:664:10:664:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:666:10:666:10 | b [element 4] | semmle.label | b [element 4] | +| array_flow.rb:666:10:666:10 | b : [collection] [element 4] | semmle.label | b : [collection] [element 4] | | array_flow.rb:666:10:666:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:669:5:669:5 | c [element 2] | semmle.label | c [element 2] | -| array_flow.rb:669:9:669:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:669:5:669:5 | c : Array [element 2] | semmle.label | c : Array [element 2] | +| array_flow.rb:669:9:669:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:669:16:669:27 | call to source | semmle.label | call to source | -| array_flow.rb:670:5:670:5 | d [element] | semmle.label | d [element] | -| array_flow.rb:670:9:670:9 | [post] c [element] | semmle.label | [post] c [element] | -| array_flow.rb:670:9:670:9 | c [element 2] | semmle.label | c [element 2] | -| array_flow.rb:670:9:670:47 | call to insert [element] | semmle.label | call to insert [element] | +| array_flow.rb:670:5:670:5 | d : [collection] [element] | semmle.label | d : [collection] [element] | +| array_flow.rb:670:9:670:9 | [post] c : [collection] [element] | semmle.label | [post] c : [collection] [element] | +| array_flow.rb:670:9:670:9 | c : Array [element 2] | semmle.label | c : Array [element 2] | +| array_flow.rb:670:9:670:47 | call to insert : [collection] [element] | semmle.label | call to insert : [collection] [element] | | array_flow.rb:670:21:670:32 | call to source | semmle.label | call to source | | array_flow.rb:670:35:670:46 | call to source | semmle.label | call to source | -| array_flow.rb:671:10:671:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:671:10:671:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:671:10:671:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:672:10:672:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:672:10:672:10 | d : [collection] [element] | semmle.label | d : [collection] [element] | | array_flow.rb:672:10:672:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:683:5:683:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:683:9:683:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:683:5:683:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:683:9:683:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:683:16:683:27 | call to source | semmle.label | call to source | -| array_flow.rb:684:5:684:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:684:9:684:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:684:9:684:60 | call to intersection [element] | semmle.label | call to intersection [element] | -| array_flow.rb:684:24:684:43 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:684:5:684:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:684:9:684:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:684:9:684:60 | call to intersection : [collection] [element] | semmle.label | call to intersection : [collection] [element] | +| array_flow.rb:684:24:684:43 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:684:31:684:42 | call to source | semmle.label | call to source | -| array_flow.rb:684:46:684:59 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:684:46:684:59 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:684:47:684:58 | call to source | semmle.label | call to source | -| array_flow.rb:685:10:685:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:685:10:685:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:685:10:685:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:689:5:689:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:689:9:689:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:689:5:689:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:689:9:689:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:689:16:689:25 | call to source | semmle.label | call to source | -| array_flow.rb:690:5:690:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:690:9:690:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:690:9:690:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:690:9:693:7 | call to keep_if [element] | semmle.label | call to keep_if [element] | +| array_flow.rb:690:5:690:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:690:9:690:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:690:9:690:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:690:9:693:7 | call to keep_if : [collection] [element] | semmle.label | call to keep_if : [collection] [element] | | array_flow.rb:690:23:690:23 | x | semmle.label | x | | array_flow.rb:691:14:691:14 | x | semmle.label | x | -| array_flow.rb:694:10:694:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:694:10:694:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:694:10:694:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:695:10:695:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:695:10:695:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:695:10:695:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:699:5:699:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:699:9:699:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:699:5:699:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:699:9:699:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:699:16:699:27 | call to source | semmle.label | call to source | -| array_flow.rb:700:5:700:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:700:5:700:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:700:12:700:23 | call to source | semmle.label | call to source | -| array_flow.rb:701:10:701:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:701:10:701:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:701:10:701:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:701:10:701:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:701:10:701:15 | call to last | semmle.label | call to last | -| array_flow.rb:702:5:702:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:702:9:702:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:702:9:702:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:702:9:702:17 | call to last [element] | semmle.label | call to last [element] | -| array_flow.rb:703:10:703:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:702:5:702:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:702:9:702:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:702:9:702:9 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| array_flow.rb:702:9:702:17 | call to last : [collection] [element] | semmle.label | call to last : [collection] [element] | +| array_flow.rb:703:10:703:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:703:10:703:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:704:10:704:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:704:10:704:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:704:10:704:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:708:5:708:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:708:9:708:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:708:5:708:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:708:9:708:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:708:16:708:27 | call to source | semmle.label | call to source | -| array_flow.rb:709:5:709:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:709:9:709:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:709:9:712:7 | call to map [element] | semmle.label | call to map [element] | +| array_flow.rb:709:5:709:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:709:9:709:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:709:9:712:7 | call to map : [collection] [element] | semmle.label | call to map : [collection] [element] | | array_flow.rb:709:19:709:19 | x | semmle.label | x | | array_flow.rb:710:14:710:14 | x | semmle.label | x | | array_flow.rb:711:9:711:19 | call to source | semmle.label | call to source | -| array_flow.rb:713:10:713:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:713:10:713:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:713:10:713:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:717:5:717:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:717:9:717:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:717:5:717:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:717:9:717:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:717:16:717:27 | call to source | semmle.label | call to source | -| array_flow.rb:718:5:718:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:718:9:718:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:718:9:721:7 | call to map! [element] | semmle.label | call to map! [element] | +| array_flow.rb:718:5:718:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:718:9:718:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:718:9:721:7 | call to map! : [collection] [element] | semmle.label | call to map! : [collection] [element] | | array_flow.rb:718:20:718:20 | x | semmle.label | x | | array_flow.rb:719:14:719:14 | x | semmle.label | x | | array_flow.rb:720:9:720:19 | call to source | semmle.label | call to source | -| array_flow.rb:722:10:722:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:722:10:722:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:722:10:722:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:726:5:726:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:726:9:726:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:726:5:726:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:726:9:726:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:726:16:726:25 | call to source | semmle.label | call to source | | array_flow.rb:729:5:729:5 | b | semmle.label | b | -| array_flow.rb:729:9:729:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:729:9:729:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:729:9:729:13 | call to max | semmle.label | call to max | | array_flow.rb:730:10:730:10 | b | semmle.label | b | -| array_flow.rb:733:5:733:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:733:9:733:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:733:9:733:16 | call to max [element] | semmle.label | call to max [element] | -| array_flow.rb:734:10:734:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:733:5:733:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:733:9:733:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:733:9:733:16 | call to max : [collection] [element] | semmle.label | call to max : [collection] [element] | +| array_flow.rb:734:10:734:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:734:10:734:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:737:5:737:5 | d | semmle.label | d | -| array_flow.rb:737:9:737:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:737:9:737:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:737:9:741:7 | call to max | semmle.label | call to max | | array_flow.rb:737:19:737:19 | x | semmle.label | x | | array_flow.rb:737:22:737:22 | y | semmle.label | y | | array_flow.rb:738:14:738:14 | x | semmle.label | x | | array_flow.rb:739:14:739:14 | y | semmle.label | y | | array_flow.rb:742:10:742:10 | d | semmle.label | d | -| array_flow.rb:745:5:745:5 | e [element] | semmle.label | e [element] | -| array_flow.rb:745:9:745:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:745:9:749:7 | call to max [element] | semmle.label | call to max [element] | +| array_flow.rb:745:5:745:5 | e : [collection] [element] | semmle.label | e : [collection] [element] | +| array_flow.rb:745:9:745:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:745:9:749:7 | call to max : [collection] [element] | semmle.label | call to max : [collection] [element] | | array_flow.rb:745:22:745:22 | x | semmle.label | x | | array_flow.rb:745:25:745:25 | y | semmle.label | y | | array_flow.rb:746:14:746:14 | x | semmle.label | x | | array_flow.rb:747:14:747:14 | y | semmle.label | y | -| array_flow.rb:750:10:750:10 | e [element] | semmle.label | e [element] | +| array_flow.rb:750:10:750:10 | e : [collection] [element] | semmle.label | e : [collection] [element] | | array_flow.rb:750:10:750:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:754:5:754:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:754:9:754:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:754:5:754:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:754:9:754:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:754:16:754:25 | call to source | semmle.label | call to source | | array_flow.rb:757:5:757:5 | b | semmle.label | b | -| array_flow.rb:757:9:757:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:757:9:757:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:757:9:760:7 | call to max_by | semmle.label | call to max_by | | array_flow.rb:757:22:757:22 | x | semmle.label | x | | array_flow.rb:758:14:758:14 | x | semmle.label | x | | array_flow.rb:761:10:761:10 | b | semmle.label | b | -| array_flow.rb:764:5:764:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:764:9:764:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:764:9:767:7 | call to max_by [element] | semmle.label | call to max_by [element] | +| array_flow.rb:764:5:764:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:764:9:764:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:764:9:767:7 | call to max_by : [collection] [element] | semmle.label | call to max_by : [collection] [element] | | array_flow.rb:764:25:764:25 | x | semmle.label | x | | array_flow.rb:765:14:765:14 | x | semmle.label | x | -| array_flow.rb:768:10:768:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:768:10:768:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:768:10:768:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:772:5:772:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:772:9:772:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:772:5:772:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:772:9:772:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:772:16:772:25 | call to source | semmle.label | call to source | | array_flow.rb:775:5:775:5 | b | semmle.label | b | -| array_flow.rb:775:9:775:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:775:9:775:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:775:9:775:13 | call to min | semmle.label | call to min | | array_flow.rb:776:10:776:10 | b | semmle.label | b | -| array_flow.rb:779:5:779:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:779:9:779:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:779:9:779:16 | call to min [element] | semmle.label | call to min [element] | -| array_flow.rb:780:10:780:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:779:5:779:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:779:9:779:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:779:9:779:16 | call to min : [collection] [element] | semmle.label | call to min : [collection] [element] | +| array_flow.rb:780:10:780:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:780:10:780:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:783:5:783:5 | d | semmle.label | d | -| array_flow.rb:783:9:783:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:783:9:783:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:783:9:787:7 | call to min | semmle.label | call to min | | array_flow.rb:783:19:783:19 | x | semmle.label | x | | array_flow.rb:783:22:783:22 | y | semmle.label | y | | array_flow.rb:784:14:784:14 | x | semmle.label | x | | array_flow.rb:785:14:785:14 | y | semmle.label | y | | array_flow.rb:788:10:788:10 | d | semmle.label | d | -| array_flow.rb:791:5:791:5 | e [element] | semmle.label | e [element] | -| array_flow.rb:791:9:791:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:791:9:795:7 | call to min [element] | semmle.label | call to min [element] | +| array_flow.rb:791:5:791:5 | e : [collection] [element] | semmle.label | e : [collection] [element] | +| array_flow.rb:791:9:791:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:791:9:795:7 | call to min : [collection] [element] | semmle.label | call to min : [collection] [element] | | array_flow.rb:791:22:791:22 | x | semmle.label | x | | array_flow.rb:791:25:791:25 | y | semmle.label | y | | array_flow.rb:792:14:792:14 | x | semmle.label | x | | array_flow.rb:793:14:793:14 | y | semmle.label | y | -| array_flow.rb:796:10:796:10 | e [element] | semmle.label | e [element] | +| array_flow.rb:796:10:796:10 | e : [collection] [element] | semmle.label | e : [collection] [element] | | array_flow.rb:796:10:796:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:800:5:800:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:800:9:800:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:800:5:800:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:800:9:800:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:800:16:800:25 | call to source | semmle.label | call to source | | array_flow.rb:803:5:803:5 | b | semmle.label | b | -| array_flow.rb:803:9:803:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:803:9:803:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:803:9:806:7 | call to min_by | semmle.label | call to min_by | | array_flow.rb:803:22:803:22 | x | semmle.label | x | | array_flow.rb:804:14:804:14 | x | semmle.label | x | | array_flow.rb:807:10:807:10 | b | semmle.label | b | -| array_flow.rb:810:5:810:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:810:9:810:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:810:9:813:7 | call to min_by [element] | semmle.label | call to min_by [element] | +| array_flow.rb:810:5:810:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:810:9:810:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:810:9:813:7 | call to min_by : [collection] [element] | semmle.label | call to min_by : [collection] [element] | | array_flow.rb:810:25:810:25 | x | semmle.label | x | | array_flow.rb:811:14:811:14 | x | semmle.label | x | -| array_flow.rb:814:10:814:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:814:10:814:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:814:10:814:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:818:5:818:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:818:9:818:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:818:5:818:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:818:9:818:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:818:16:818:25 | call to source | semmle.label | call to source | -| array_flow.rb:820:5:820:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:820:9:820:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:820:9:820:16 | call to minmax [element] | semmle.label | call to minmax [element] | -| array_flow.rb:821:10:821:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:820:5:820:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:820:9:820:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:820:9:820:16 | call to minmax : [collection] [element] | semmle.label | call to minmax : [collection] [element] | +| array_flow.rb:821:10:821:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:821:10:821:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:822:10:822:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:822:10:822:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:822:10:822:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:824:5:824:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:824:9:824:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:824:9:828:7 | call to minmax [element] | semmle.label | call to minmax [element] | +| array_flow.rb:824:5:824:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:824:9:824:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:824:9:828:7 | call to minmax : [collection] [element] | semmle.label | call to minmax : [collection] [element] | | array_flow.rb:824:22:824:22 | x | semmle.label | x | | array_flow.rb:824:25:824:25 | y | semmle.label | y | | array_flow.rb:825:14:825:14 | x | semmle.label | x | | array_flow.rb:826:14:826:14 | y | semmle.label | y | -| array_flow.rb:829:10:829:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:829:10:829:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:830:10:830:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:830:10:830:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:830:10:830:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:834:5:834:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:834:9:834:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:834:5:834:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:834:9:834:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:834:16:834:25 | call to source | semmle.label | call to source | -| array_flow.rb:835:5:835:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:835:9:835:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:835:9:838:7 | call to minmax_by [element] | semmle.label | call to minmax_by [element] | +| array_flow.rb:835:5:835:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:835:9:835:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:835:9:838:7 | call to minmax_by : [collection] [element] | semmle.label | call to minmax_by : [collection] [element] | | array_flow.rb:835:25:835:25 | x | semmle.label | x | | array_flow.rb:836:14:836:14 | x | semmle.label | x | -| array_flow.rb:839:10:839:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:839:10:839:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:839:10:839:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:840:10:840:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:840:10:840:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:840:10:840:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:844:5:844:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:844:9:844:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:844:5:844:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:844:9:844:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:844:16:844:25 | call to source | semmle.label | call to source | -| array_flow.rb:845:5:845:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:845:5:845:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:845:17:845:17 | x | semmle.label | x | | array_flow.rb:846:14:846:14 | x | semmle.label | x | -| array_flow.rb:853:5:853:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:853:9:853:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:853:5:853:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:853:9:853:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:853:16:853:25 | call to source | semmle.label | call to source | -| array_flow.rb:854:5:854:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:854:5:854:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:854:16:854:16 | x | semmle.label | x | | array_flow.rb:855:14:855:14 | x | semmle.label | x | -| array_flow.rb:866:5:866:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:866:9:866:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:866:5:866:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:866:9:866:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:866:16:866:25 | call to source | semmle.label | call to source | -| array_flow.rb:867:5:867:5 | b [element, element] | semmle.label | b [element, element] | -| array_flow.rb:867:9:867:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:867:9:870:7 | call to partition [element, element] | semmle.label | call to partition [element, element] | +| array_flow.rb:867:5:867:5 | b : [collection] [element, element] | semmle.label | b : [collection] [element, element] | +| array_flow.rb:867:9:867:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:867:9:870:7 | call to partition : [collection] [element, element] | semmle.label | call to partition : [collection] [element, element] | | array_flow.rb:867:25:867:25 | x | semmle.label | x | | array_flow.rb:868:14:868:14 | x | semmle.label | x | -| array_flow.rb:871:10:871:10 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:871:10:871:10 | b : [collection] [element, element] | semmle.label | b : [collection] [element, element] | | array_flow.rb:871:10:871:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:871:10:871:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:872:10:872:10 | b [element, element] | semmle.label | b [element, element] | +| array_flow.rb:872:10:872:10 | b : [collection] [element, element] | semmle.label | b : [collection] [element, element] | | array_flow.rb:872:10:872:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:872:10:872:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:876:5:876:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:876:9:876:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:876:5:876:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:876:9:876:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:876:16:876:25 | call to source | semmle.label | call to source | -| array_flow.rb:878:5:878:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:878:9:878:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:878:9:882:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | -| array_flow.rb:878:27:878:27 | x [element] | semmle.label | x [element] | -| array_flow.rb:879:14:879:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:878:5:878:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:878:9:878:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:878:9:882:7 | call to permutation : Array [element 2] | semmle.label | call to permutation : Array [element 2] | +| array_flow.rb:878:27:878:27 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| array_flow.rb:879:14:879:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:879:14:879:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:880:14:880:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:880:14:880:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:880:14:880:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:881:14:881:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:881:14:881:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:881:14:881:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:884:10:884:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:884:10:884:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:884:10:884:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:886:5:886:5 | c [element 2] | semmle.label | c [element 2] | -| array_flow.rb:886:9:886:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:886:9:889:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | -| array_flow.rb:886:30:886:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:887:14:887:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:886:5:886:5 | c : Array [element 2] | semmle.label | c : Array [element 2] | +| array_flow.rb:886:9:886:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:886:9:889:7 | call to permutation : Array [element 2] | semmle.label | call to permutation : Array [element 2] | +| array_flow.rb:886:30:886:30 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| array_flow.rb:887:14:887:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:887:14:887:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:888:14:888:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:888:14:888:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:888:14:888:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:891:10:891:10 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:891:10:891:10 | c : Array [element 2] | semmle.label | c : Array [element 2] | | array_flow.rb:891:10:891:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:893:9:893:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:893:30:893:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:894:14:894:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:893:9:893:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:893:30:893:30 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| array_flow.rb:894:14:894:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:894:14:894:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:895:14:895:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:895:14:895:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:895:14:895:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:898:10:898:10 | c [element 2] | semmle.label | c [element 2] | +| array_flow.rb:898:10:898:10 | c : Array [element 2] | semmle.label | c : Array [element 2] | | array_flow.rb:898:10:898:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:905:5:905:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:905:5:905:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:905:9:905:42 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| array_flow.rb:905:9:905:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:905:5:905:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:905:5:905:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:905:9:905:42 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| array_flow.rb:905:9:905:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:905:13:905:24 | call to source | semmle.label | call to source | | array_flow.rb:905:30:905:41 | call to source | semmle.label | call to source | | array_flow.rb:906:5:906:5 | b | semmle.label | b | -| array_flow.rb:906:9:906:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:906:9:906:9 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:906:9:906:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:906:9:906:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:906:9:906:13 | call to pop | semmle.label | call to pop | | array_flow.rb:907:10:907:10 | b | semmle.label | b | -| array_flow.rb:909:10:909:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:909:10:909:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:911:10:911:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:911:10:911:10 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:911:10:911:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:913:5:913:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:913:5:913:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:913:9:913:42 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| array_flow.rb:913:9:913:42 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:913:5:913:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:913:5:913:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:913:9:913:42 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| array_flow.rb:913:9:913:42 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:913:13:913:24 | call to source | semmle.label | call to source | | array_flow.rb:913:30:913:41 | call to source | semmle.label | call to source | -| array_flow.rb:914:5:914:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:914:9:914:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:914:9:914:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:914:9:914:16 | call to pop [element] | semmle.label | call to pop [element] | -| array_flow.rb:915:10:915:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:914:5:914:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:914:9:914:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:914:9:914:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:914:9:914:16 | call to pop : [collection] [element] | semmle.label | call to pop : [collection] [element] | +| array_flow.rb:915:10:915:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:915:10:915:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:916:10:916:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:916:10:916:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:916:10:916:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:918:10:918:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:918:10:918:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:918:10:918:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:920:10:920:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:920:10:920:10 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:920:10:920:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:924:5:924:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:924:9:924:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:924:5:924:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:924:9:924:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:924:16:924:27 | call to source | semmle.label | call to source | -| array_flow.rb:925:5:925:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:925:5:925:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | -| array_flow.rb:925:5:925:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:925:5:925:5 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:925:5:925:5 | [post] a : [collection] [element 5] | semmle.label | [post] a : [collection] [element 5] | +| array_flow.rb:925:5:925:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:925:21:925:32 | call to source | semmle.label | call to source | -| array_flow.rb:928:10:928:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:928:10:928:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | | array_flow.rb:928:10:928:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:931:10:931:10 | a [element 5] | semmle.label | a [element 5] | +| array_flow.rb:931:10:931:10 | a : [collection] [element 5] | semmle.label | a : [collection] [element 5] | | array_flow.rb:931:10:931:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:935:5:935:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:935:9:935:28 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:935:5:935:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:935:9:935:28 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:935:16:935:27 | call to source | semmle.label | call to source | -| array_flow.rb:936:5:936:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:936:9:936:28 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:936:5:936:5 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:936:9:936:28 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:936:13:936:24 | call to source | semmle.label | call to source | -| array_flow.rb:937:5:937:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:937:9:937:28 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:937:5:937:5 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:937:9:937:28 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:937:10:937:21 | call to source | semmle.label | call to source | -| array_flow.rb:938:5:938:5 | d [element, element] | semmle.label | d [element, element] | -| array_flow.rb:938:9:938:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:938:9:938:22 | call to product [element, element] | semmle.label | call to product [element, element] | -| array_flow.rb:938:19:938:19 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:938:22:938:22 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:939:10:939:10 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:938:5:938:5 | d : [collection] [element, element] | semmle.label | d : [collection] [element, element] | +| array_flow.rb:938:9:938:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:938:9:938:22 | call to product : [collection] [element, element] | semmle.label | call to product : [collection] [element, element] | +| array_flow.rb:938:19:938:19 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:938:22:938:22 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:939:10:939:10 | d : [collection] [element, element] | semmle.label | d : [collection] [element, element] | | array_flow.rb:939:10:939:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:939:10:939:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:940:10:940:10 | d [element, element] | semmle.label | d [element, element] | +| array_flow.rb:940:10:940:10 | d : [collection] [element, element] | semmle.label | d : [collection] [element, element] | | array_flow.rb:940:10:940:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:940:10:940:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:944:5:944:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:944:9:944:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:944:5:944:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:944:9:944:25 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:944:10:944:21 | call to source | semmle.label | call to source | -| array_flow.rb:945:5:945:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:945:5:945:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:945:9:945:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:945:9:945:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:945:9:945:44 | call to append [element 0] | semmle.label | call to append [element 0] | -| array_flow.rb:945:9:945:44 | call to append [element] | semmle.label | call to append [element] | +| array_flow.rb:945:5:945:5 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:945:5:945:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:945:9:945:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:945:9:945:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:945:9:945:44 | call to append : Array [element 0] | semmle.label | call to append : Array [element 0] | +| array_flow.rb:945:9:945:44 | call to append : [collection] [element] | semmle.label | call to append : [collection] [element] | | array_flow.rb:945:18:945:29 | call to source | semmle.label | call to source | | array_flow.rb:945:32:945:43 | call to source | semmle.label | call to source | -| array_flow.rb:946:10:946:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:946:10:946:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:946:10:946:10 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:946:10:946:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:946:10:946:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:947:10:947:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:947:10:947:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:947:10:947:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:948:10:948:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:948:10:948:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:948:10:948:10 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:948:10:948:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:948:10:948:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:949:10:949:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:949:10:949:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:949:10:949:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:955:5:955:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:955:9:955:25 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:955:5:955:5 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:955:9:955:25 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:955:10:955:19 | call to source | semmle.label | call to source | -| array_flow.rb:956:5:956:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | -| array_flow.rb:956:9:956:17 | call to [] [element 2, element 0] | semmle.label | call to [] [element 2, element 0] | -| array_flow.rb:956:16:956:16 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:957:10:957:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:956:5:956:5 | d : Array [element 2, element 0] | semmle.label | d : Array [element 2, element 0] | +| array_flow.rb:956:9:956:17 | call to [] : Array [element 2, element 0] | semmle.label | call to [] : Array [element 2, element 0] | +| array_flow.rb:956:16:956:16 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:957:10:957:10 | d : Array [element 2, element 0] | semmle.label | d : Array [element 2, element 0] | | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | | array_flow.rb:957:10:957:25 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:958:10:958:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:958:10:958:10 | d : Array [element 2, element 0] | semmle.label | d : Array [element 2, element 0] | | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | | array_flow.rb:958:10:958:25 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:962:5:962:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:962:5:962:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:962:9:962:39 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:962:9:962:39 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:962:5:962:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:962:5:962:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:962:9:962:39 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:962:9:962:39 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:962:10:962:21 | call to source | semmle.label | call to source | | array_flow.rb:962:27:962:38 | call to source | semmle.label | call to source | -| array_flow.rb:963:9:963:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:963:9:963:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:963:9:963:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:963:9:963:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:963:22:963:22 | x | semmle.label | x | | array_flow.rb:963:25:963:25 | y | semmle.label | y | | array_flow.rb:964:14:964:14 | x | semmle.label | x | | array_flow.rb:965:14:965:14 | y | semmle.label | y | -| array_flow.rb:968:9:968:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:968:9:968:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:968:9:968:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:968:9:968:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:968:28:968:28 | y | semmle.label | y | | array_flow.rb:970:14:970:14 | y | semmle.label | y | -| array_flow.rb:976:5:976:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:976:9:976:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:976:5:976:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:976:9:976:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:976:16:976:25 | call to source | semmle.label | call to source | -| array_flow.rb:977:5:977:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:977:9:977:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:977:9:980:7 | call to reject [element] | semmle.label | call to reject [element] | +| array_flow.rb:977:5:977:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:977:9:977:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:977:9:980:7 | call to reject : [collection] [element] | semmle.label | call to reject : [collection] [element] | | array_flow.rb:977:22:977:22 | x | semmle.label | x | | array_flow.rb:978:14:978:14 | x | semmle.label | x | -| array_flow.rb:981:10:981:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:981:10:981:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:981:10:981:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:985:5:985:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:985:9:985:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:985:5:985:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:985:9:985:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:985:16:985:25 | call to source | semmle.label | call to source | -| array_flow.rb:986:5:986:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:986:9:986:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:986:9:986:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:986:9:989:7 | call to reject! [element] | semmle.label | call to reject! [element] | +| array_flow.rb:986:5:986:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:986:9:986:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:986:9:986:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:986:9:989:7 | call to reject! : [collection] [element] | semmle.label | call to reject! : [collection] [element] | | array_flow.rb:986:23:986:23 | x | semmle.label | x | | array_flow.rb:987:14:987:14 | x | semmle.label | x | -| array_flow.rb:990:10:990:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:990:10:990:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:991:10:991:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:991:10:991:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:991:10:991:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:995:5:995:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:995:9:995:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:995:5:995:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:995:9:995:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:995:16:995:25 | call to source | semmle.label | call to source | -| array_flow.rb:996:5:996:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:996:9:996:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | semmle.label | call to repeated_combination [element 2] | -| array_flow.rb:996:39:996:39 | x [element] | semmle.label | x [element] | -| array_flow.rb:997:14:997:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:996:5:996:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:996:9:996:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:996:9:999:7 | call to repeated_combination : Array [element 2] | semmle.label | call to repeated_combination : Array [element 2] | +| array_flow.rb:996:39:996:39 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| array_flow.rb:997:14:997:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:997:14:997:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:998:14:998:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:998:14:998:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:998:14:998:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1001:10:1001:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1001:10:1001:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1001:10:1001:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1005:5:1005:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1005:9:1005:26 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1005:5:1005:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1005:9:1005:26 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1005:16:1005:25 | call to source | semmle.label | call to source | -| array_flow.rb:1006:5:1006:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1006:9:1006:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | semmle.label | call to repeated_permutation [element 2] | -| array_flow.rb:1006:39:1006:39 | x [element] | semmle.label | x [element] | -| array_flow.rb:1007:14:1007:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:1006:5:1006:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1006:9:1006:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1006:9:1009:7 | call to repeated_permutation : Array [element 2] | semmle.label | call to repeated_permutation : Array [element 2] | +| array_flow.rb:1006:39:1006:39 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| array_flow.rb:1007:14:1007:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:1007:14:1007:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1008:14:1008:14 | x [element] | semmle.label | x [element] | +| array_flow.rb:1008:14:1008:14 | x : [collection] [element] | semmle.label | x : [collection] [element] | | array_flow.rb:1008:14:1008:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1011:10:1011:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1011:10:1011:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1011:10:1011:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1017:5:1017:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1017:9:1017:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1017:9:1017:33 | call to replace [element 0] | semmle.label | call to replace [element 0] | -| array_flow.rb:1017:19:1017:32 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1017:5:1017:5 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:1017:9:1017:9 | [post] a : Array [element 0] | semmle.label | [post] a : Array [element 0] | +| array_flow.rb:1017:9:1017:33 | call to replace : Array [element 0] | semmle.label | call to replace : Array [element 0] | +| array_flow.rb:1017:19:1017:32 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:1017:20:1017:31 | call to source | semmle.label | call to source | -| array_flow.rb:1018:10:1018:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1018:10:1018:10 | a : Array [element 0] | semmle.label | a : Array [element 0] | | array_flow.rb:1018:10:1018:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1019:10:1019:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1019:10:1019:10 | b : Array [element 0] | semmle.label | b : Array [element 0] | | array_flow.rb:1019:10:1019:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1023:5:1023:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1023:5:1023:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1023:9:1023:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1023:9:1023:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1023:5:1023:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1023:5:1023:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1023:9:1023:44 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1023:9:1023:44 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1023:16:1023:28 | call to source | semmle.label | call to source | | array_flow.rb:1023:31:1023:43 | call to source | semmle.label | call to source | -| array_flow.rb:1024:5:1024:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1024:9:1024:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1024:9:1024:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1024:9:1024:17 | call to reverse [element] | semmle.label | call to reverse [element] | -| array_flow.rb:1025:10:1025:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1024:5:1024:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1024:9:1024:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1024:9:1024:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1024:9:1024:17 | call to reverse : [collection] [element] | semmle.label | call to reverse : [collection] [element] | +| array_flow.rb:1025:10:1025:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1025:10:1025:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1026:10:1026:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1026:10:1026:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1026:10:1026:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1027:10:1027:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1027:10:1027:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1027:10:1027:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1029:10:1029:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1029:10:1029:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1029:10:1029:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1030:10:1030:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1030:10:1030:10 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:1030:10:1030:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1034:5:1034:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1034:5:1034:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1034:9:1034:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1034:9:1034:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1034:5:1034:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1034:5:1034:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1034:9:1034:44 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1034:9:1034:44 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1034:16:1034:28 | call to source | semmle.label | call to source | | array_flow.rb:1034:31:1034:43 | call to source | semmle.label | call to source | -| array_flow.rb:1035:5:1035:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1035:9:1035:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1035:9:1035:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1035:9:1035:18 | call to reverse! [element] | semmle.label | call to reverse! [element] | -| array_flow.rb:1036:10:1036:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1035:5:1035:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1035:9:1035:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1035:9:1035:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1035:9:1035:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1035:9:1035:18 | call to reverse! : [collection] [element] | semmle.label | call to reverse! : [collection] [element] | +| array_flow.rb:1036:10:1036:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1036:10:1036:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1037:10:1037:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1037:10:1037:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1037:10:1037:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1038:10:1038:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1038:10:1038:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1039:10:1039:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1039:10:1039:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1039:10:1039:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1040:10:1040:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1040:10:1040:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1040:10:1040:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1040:10:1040:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1040:10:1040:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1041:10:1041:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1041:10:1041:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1041:10:1041:10 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1041:10:1041:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1041:10:1041:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1045:5:1045:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1045:9:1045:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1045:5:1045:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1045:9:1045:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1045:16:1045:26 | call to source | semmle.label | call to source | -| array_flow.rb:1046:5:1046:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1046:9:1046:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | semmle.label | call to reverse_each [element 2] | +| array_flow.rb:1046:5:1046:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1046:9:1046:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1046:9:1048:7 | call to reverse_each : Array [element 2] | semmle.label | call to reverse_each : Array [element 2] | | array_flow.rb:1046:28:1046:28 | x | semmle.label | x | | array_flow.rb:1047:14:1047:14 | x | semmle.label | x | -| array_flow.rb:1049:10:1049:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1049:10:1049:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1049:10:1049:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1053:5:1053:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1053:9:1053:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1053:5:1053:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1053:9:1053:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1053:16:1053:26 | call to source | semmle.label | call to source | -| array_flow.rb:1054:5:1054:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1054:5:1054:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1054:18:1054:18 | x | semmle.label | x | | array_flow.rb:1055:14:1055:14 | x | semmle.label | x | -| array_flow.rb:1063:5:1063:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1063:5:1063:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1063:5:1063:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1063:9:1063:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1063:9:1063:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1063:9:1063:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1063:5:1063:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1063:5:1063:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1063:5:1063:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1063:9:1063:56 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1063:9:1063:56 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1063:9:1063:56 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1063:10:1063:22 | call to source | semmle.label | call to source | | array_flow.rb:1063:28:1063:40 | call to source | semmle.label | call to source | | array_flow.rb:1063:43:1063:55 | call to source | semmle.label | call to source | -| array_flow.rb:1065:5:1065:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1065:5:1065:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1065:5:1065:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1065:9:1065:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1065:9:1065:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1065:9:1065:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element] | semmle.label | call to rotate [element] | -| array_flow.rb:1066:10:1066:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1065:5:1065:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1065:9:1065:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1065:9:1065:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1065:9:1065:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element 1] | semmle.label | call to rotate : [collection] [element 1] | +| array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element 2] | semmle.label | call to rotate : [collection] [element 2] | +| array_flow.rb:1065:9:1065:16 | call to rotate : [collection] [element] | semmle.label | call to rotate : [collection] [element] | +| array_flow.rb:1066:10:1066:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1066:10:1066:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1067:10:1067:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1067:10:1067:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1067:10:1067:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1067:10:1067:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1067:10:1067:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1068:10:1068:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1068:10:1068:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1068:10:1068:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1068:10:1068:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1068:10:1068:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1069:10:1069:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1069:10:1069:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1069:10:1069:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1071:5:1071:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1071:5:1071:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1071:5:1071:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1071:9:1071:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1071:9:1071:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1071:9:1071:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element] | semmle.label | call to rotate [element] | -| array_flow.rb:1072:10:1072:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1072:10:1072:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1071:5:1071:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1071:9:1071:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1071:9:1071:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1071:9:1071:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element 0] | semmle.label | call to rotate : [collection] [element 0] | +| array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element 1] | semmle.label | call to rotate : [collection] [element 1] | +| array_flow.rb:1071:9:1071:19 | call to rotate : [collection] [element] | semmle.label | call to rotate : [collection] [element] | +| array_flow.rb:1072:10:1072:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1072:10:1072:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1072:10:1072:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1073:10:1073:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1073:10:1073:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1073:10:1073:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1073:10:1073:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1073:10:1073:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1074:10:1074:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1074:10:1074:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1074:10:1074:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1075:10:1075:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1075:10:1075:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1075:10:1075:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1077:5:1077:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1077:5:1077:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1077:5:1077:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1077:9:1077:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1077:9:1077:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1077:9:1077:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | semmle.label | call to rotate [element 3] | -| array_flow.rb:1078:10:1078:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1077:5:1077:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1077:5:1077:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1077:5:1077:5 | b : [collection] [element 3] | semmle.label | b : [collection] [element 3] | +| array_flow.rb:1077:9:1077:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1077:9:1077:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1077:9:1077:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 0] | semmle.label | call to rotate : [collection] [element 0] | +| array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 2] | semmle.label | call to rotate : [collection] [element 2] | +| array_flow.rb:1077:9:1077:19 | call to rotate : [collection] [element 3] | semmle.label | call to rotate : [collection] [element 3] | +| array_flow.rb:1078:10:1078:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1078:10:1078:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1080:10:1080:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1080:10:1080:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:1080:10:1080:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1081:10:1081:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1081:10:1081:10 | b : [collection] [element 3] | semmle.label | b : [collection] [element 3] | | array_flow.rb:1081:10:1081:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1083:5:1083:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1083:9:1083:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1083:9:1083:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1083:9:1083:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1083:9:1083:19 | call to rotate [element] | semmle.label | call to rotate [element] | -| array_flow.rb:1084:10:1084:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1083:5:1083:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1083:9:1083:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1083:9:1083:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1083:9:1083:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1083:9:1083:19 | call to rotate : [collection] [element] | semmle.label | call to rotate : [collection] [element] | +| array_flow.rb:1084:10:1084:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1084:10:1084:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1085:10:1085:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1085:10:1085:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1085:10:1085:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1086:10:1086:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1086:10:1086:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1086:10:1086:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1087:10:1087:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1087:10:1087:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1087:10:1087:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1095:5:1095:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1095:5:1095:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1095:5:1095:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1095:9:1095:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1095:9:1095:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1095:9:1095:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1095:5:1095:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1095:5:1095:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1095:5:1095:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1095:9:1095:56 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1095:9:1095:56 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1095:9:1095:56 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1095:10:1095:22 | call to source | semmle.label | call to source | | array_flow.rb:1095:28:1095:40 | call to source | semmle.label | call to source | | array_flow.rb:1095:43:1095:55 | call to source | semmle.label | call to source | -| array_flow.rb:1096:5:1096:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1096:5:1096:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1096:5:1096:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1096:9:1096:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:1096:9:1096:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1096:9:1096:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1096:9:1096:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1096:9:1096:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1097:10:1097:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1096:5:1096:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element 1] | semmle.label | [post] a : [collection] [element 1] | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:1096:9:1096:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1096:9:1096:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1096:9:1096:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1096:9:1096:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element 1] | semmle.label | call to rotate! : [collection] [element 1] | +| array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element 2] | semmle.label | call to rotate! : [collection] [element 2] | +| array_flow.rb:1096:9:1096:17 | call to rotate! : [collection] [element] | semmle.label | call to rotate! : [collection] [element] | +| array_flow.rb:1097:10:1097:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1097:10:1097:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1098:10:1098:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1098:10:1098:10 | a : [collection] [element 1] | semmle.label | a : [collection] [element 1] | +| array_flow.rb:1098:10:1098:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1098:10:1098:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1099:10:1099:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1099:10:1099:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1099:10:1099:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | +| array_flow.rb:1099:10:1099:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1099:10:1099:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1100:10:1100:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1100:10:1100:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1100:10:1100:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1101:10:1101:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1101:10:1101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1102:10:1102:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1102:10:1102:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1102:10:1102:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1102:10:1102:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1103:10:1103:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1103:10:1103:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1103:10:1103:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1103:10:1103:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1103:10:1103:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1104:10:1104:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1104:10:1104:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1104:10:1104:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1106:5:1106:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1106:5:1106:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1106:5:1106:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1106:9:1106:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1106:9:1106:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1106:9:1106:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1106:5:1106:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1106:5:1106:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1106:5:1106:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1106:9:1106:56 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1106:9:1106:56 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1106:9:1106:56 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1106:10:1106:22 | call to source | semmle.label | call to source | | array_flow.rb:1106:28:1106:40 | call to source | semmle.label | call to source | | array_flow.rb:1106:43:1106:55 | call to source | semmle.label | call to source | -| array_flow.rb:1107:5:1107:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1107:5:1107:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1107:5:1107:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1107:9:1107:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1107:9:1107:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1107:9:1107:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1107:9:1107:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1107:9:1107:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1108:10:1108:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1108:10:1108:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1107:5:1107:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element 0] | semmle.label | [post] a : [collection] [element 0] | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element 1] | semmle.label | [post] a : [collection] [element 1] | +| array_flow.rb:1107:9:1107:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1107:9:1107:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1107:9:1107:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1107:9:1107:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element 0] | semmle.label | call to rotate! : [collection] [element 0] | +| array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element 1] | semmle.label | call to rotate! : [collection] [element 1] | +| array_flow.rb:1107:9:1107:20 | call to rotate! : [collection] [element] | semmle.label | call to rotate! : [collection] [element] | +| array_flow.rb:1108:10:1108:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | +| array_flow.rb:1108:10:1108:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1108:10:1108:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1109:10:1109:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1109:10:1109:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1109:10:1109:10 | a : [collection] [element 1] | semmle.label | a : [collection] [element 1] | +| array_flow.rb:1109:10:1109:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1109:10:1109:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1110:10:1110:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1110:10:1110:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1110:10:1110:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1111:10:1111:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1111:10:1111:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1111:10:1111:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1112:10:1112:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1112:10:1112:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1112:10:1112:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1112:10:1112:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1112:10:1112:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1113:10:1113:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1113:10:1113:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1113:10:1113:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1113:10:1113:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1113:10:1113:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1114:10:1114:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1114:10:1114:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1114:10:1114:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1115:10:1115:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1115:10:1115:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1115:10:1115:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1117:5:1117:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1117:5:1117:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1117:5:1117:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1117:9:1117:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1117:9:1117:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1117:9:1117:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1117:5:1117:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1117:5:1117:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1117:5:1117:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1117:9:1117:56 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1117:9:1117:56 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1117:9:1117:56 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1117:10:1117:22 | call to source | semmle.label | call to source | | array_flow.rb:1117:28:1117:40 | call to source | semmle.label | call to source | | array_flow.rb:1117:43:1117:55 | call to source | semmle.label | call to source | -| array_flow.rb:1118:5:1118:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1118:5:1118:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1118:5:1118:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | -| array_flow.rb:1118:9:1118:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1118:9:1118:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1118:9:1118:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | semmle.label | call to rotate! [element 3] | -| array_flow.rb:1119:10:1119:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1118:5:1118:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1118:5:1118:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1118:5:1118:5 | b : [collection] [element 3] | semmle.label | b : [collection] [element 3] | +| array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 0] | semmle.label | [post] a : [collection] [element 0] | +| array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:1118:9:1118:9 | [post] a : [collection] [element 3] | semmle.label | [post] a : [collection] [element 3] | +| array_flow.rb:1118:9:1118:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1118:9:1118:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1118:9:1118:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 0] | semmle.label | call to rotate! : [collection] [element 0] | +| array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 2] | semmle.label | call to rotate! : [collection] [element 2] | +| array_flow.rb:1118:9:1118:20 | call to rotate! : [collection] [element 3] | semmle.label | call to rotate! : [collection] [element 3] | +| array_flow.rb:1119:10:1119:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | | array_flow.rb:1119:10:1119:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1121:10:1121:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1121:10:1121:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | | array_flow.rb:1121:10:1121:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1122:10:1122:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1122:10:1122:10 | a : [collection] [element 3] | semmle.label | a : [collection] [element 3] | | array_flow.rb:1122:10:1122:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1123:10:1123:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1123:10:1123:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1123:10:1123:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1125:10:1125:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1125:10:1125:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:1125:10:1125:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1126:10:1126:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1126:10:1126:10 | b : [collection] [element 3] | semmle.label | b : [collection] [element 3] | | array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1128:5:1128:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1128:5:1128:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1128:5:1128:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1128:9:1128:56 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1128:9:1128:56 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1128:9:1128:56 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1128:5:1128:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1128:5:1128:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1128:5:1128:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1128:9:1128:56 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1128:9:1128:56 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1128:9:1128:56 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1128:10:1128:22 | call to source | semmle.label | call to source | | array_flow.rb:1128:28:1128:40 | call to source | semmle.label | call to source | | array_flow.rb:1128:43:1128:55 | call to source | semmle.label | call to source | -| array_flow.rb:1129:5:1129:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1129:9:1129:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1129:9:1129:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1129:9:1129:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1130:10:1130:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1129:5:1129:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1129:9:1129:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1129:9:1129:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1129:9:1129:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1129:9:1129:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1129:9:1129:20 | call to rotate! : [collection] [element] | semmle.label | call to rotate! : [collection] [element] | +| array_flow.rb:1130:10:1130:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1130:10:1130:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1131:10:1131:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1131:10:1131:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1131:10:1131:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1132:10:1132:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1132:10:1132:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1132:10:1132:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1133:10:1133:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1133:10:1133:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1133:10:1133:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1134:10:1134:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1134:10:1134:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1135:10:1135:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1135:10:1135:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1135:10:1135:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1136:10:1136:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1136:10:1136:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1136:10:1136:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1137:10:1137:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1137:10:1137:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1137:10:1137:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1141:5:1141:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1141:9:1141:30 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1141:5:1141:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1141:9:1141:30 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1141:19:1141:29 | call to source | semmle.label | call to source | -| array_flow.rb:1142:5:1142:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1142:9:1142:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1142:9:1144:7 | call to select [element] | semmle.label | call to select [element] | +| array_flow.rb:1142:5:1142:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1142:9:1142:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1142:9:1144:7 | call to select : [collection] [element] | semmle.label | call to select : [collection] [element] | | array_flow.rb:1142:22:1142:22 | x | semmle.label | x | | array_flow.rb:1143:14:1143:14 | x | semmle.label | x | -| array_flow.rb:1145:10:1145:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1145:10:1145:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1145:10:1145:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1149:5:1149:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1149:9:1149:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1149:5:1149:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1149:9:1149:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1149:16:1149:26 | call to source | semmle.label | call to source | -| array_flow.rb:1150:5:1150:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1150:9:1150:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1150:9:1150:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1150:9:1153:7 | call to select! [element] | semmle.label | call to select! [element] | +| array_flow.rb:1150:5:1150:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1150:9:1150:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1150:9:1150:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1150:9:1153:7 | call to select! : [collection] [element] | semmle.label | call to select! : [collection] [element] | | array_flow.rb:1150:23:1150:23 | x | semmle.label | x | | array_flow.rb:1151:14:1151:14 | x | semmle.label | x | -| array_flow.rb:1154:10:1154:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1154:10:1154:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1154:10:1154:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1155:10:1155:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1155:10:1155:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1155:10:1155:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1159:5:1159:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1159:5:1159:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1159:9:1159:41 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1159:9:1159:41 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1159:5:1159:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1159:5:1159:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1159:9:1159:41 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1159:9:1159:41 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1159:10:1159:22 | call to source | semmle.label | call to source | | array_flow.rb:1159:28:1159:40 | call to source | semmle.label | call to source | | array_flow.rb:1160:5:1160:5 | b | semmle.label | b | -| array_flow.rb:1160:9:1160:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:1160:9:1160:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1160:9:1160:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1160:9:1160:9 | [post] a : [collection] [element 1] | semmle.label | [post] a : [collection] [element 1] | +| array_flow.rb:1160:9:1160:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1160:9:1160:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1160:9:1160:15 | call to shift | semmle.label | call to shift | | array_flow.rb:1161:10:1161:10 | b | semmle.label | b | -| array_flow.rb:1163:10:1163:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1163:10:1163:10 | a : [collection] [element 1] | semmle.label | a : [collection] [element 1] | | array_flow.rb:1163:10:1163:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1166:5:1166:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1166:5:1166:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1166:9:1166:41 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1166:9:1166:41 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1166:5:1166:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1166:5:1166:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1166:9:1166:41 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1166:9:1166:41 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1166:10:1166:22 | call to source | semmle.label | call to source | | array_flow.rb:1166:28:1166:40 | call to source | semmle.label | call to source | -| array_flow.rb:1167:5:1167:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1167:9:1167:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1167:9:1167:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1167:9:1167:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1167:9:1167:18 | call to shift [element 0] | semmle.label | call to shift [element 0] | -| array_flow.rb:1168:10:1168:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1167:5:1167:5 | b : Array [element 0] | semmle.label | b : Array [element 0] | +| array_flow.rb:1167:9:1167:9 | [post] a : [collection] [element 0] | semmle.label | [post] a : [collection] [element 0] | +| array_flow.rb:1167:9:1167:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1167:9:1167:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1167:9:1167:18 | call to shift : Array [element 0] | semmle.label | call to shift : Array [element 0] | +| array_flow.rb:1168:10:1168:10 | b : Array [element 0] | semmle.label | b : Array [element 0] | | array_flow.rb:1168:10:1168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1170:10:1170:10 | a [element 0] | semmle.label | a [element 0] | +| array_flow.rb:1170:10:1170:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | | array_flow.rb:1170:10:1170:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1174:5:1174:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1174:5:1174:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1174:9:1174:41 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| array_flow.rb:1174:9:1174:41 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1174:5:1174:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1174:5:1174:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1174:9:1174:41 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| array_flow.rb:1174:9:1174:41 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1174:10:1174:22 | call to source | semmle.label | call to source | | array_flow.rb:1174:28:1174:40 | call to source | semmle.label | call to source | -| array_flow.rb:1175:5:1175:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1175:9:1175:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1175:9:1175:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1175:9:1175:18 | call to shift [element] | semmle.label | call to shift [element] | -| array_flow.rb:1176:10:1176:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1175:5:1175:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1175:9:1175:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1175:9:1175:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1175:9:1175:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1175:9:1175:18 | call to shift : [collection] [element] | semmle.label | call to shift : [collection] [element] | +| array_flow.rb:1176:10:1176:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1176:10:1176:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1177:10:1177:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1177:10:1177:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1177:10:1177:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1178:10:1178:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1178:10:1178:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1178:10:1178:10 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| array_flow.rb:1178:10:1178:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1178:10:1178:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1179:10:1179:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1179:10:1179:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1179:10:1179:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1180:10:1180:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1180:10:1180:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1180:10:1180:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1180:10:1180:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1180:10:1180:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1184:5:1184:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1184:9:1184:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1184:5:1184:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1184:9:1184:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1184:16:1184:26 | call to source | semmle.label | call to source | -| array_flow.rb:1185:5:1185:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1185:9:1185:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1185:9:1185:17 | call to shuffle [element] | semmle.label | call to shuffle [element] | -| array_flow.rb:1188:10:1188:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1185:5:1185:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1185:9:1185:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1185:9:1185:17 | call to shuffle : [collection] [element] | semmle.label | call to shuffle : [collection] [element] | +| array_flow.rb:1188:10:1188:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1188:10:1188:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1189:10:1189:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1189:10:1189:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1189:10:1189:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1190:10:1190:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1190:10:1190:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1190:10:1190:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1191:10:1191:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1191:10:1191:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1195:5:1195:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1195:9:1195:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1195:5:1195:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1195:9:1195:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1195:16:1195:26 | call to source | semmle.label | call to source | -| array_flow.rb:1196:5:1196:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1196:9:1196:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | semmle.label | call to shuffle! [element] | -| array_flow.rb:1197:10:1197:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1196:5:1196:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1196:9:1196:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1196:9:1196:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1196:9:1196:18 | call to shuffle! : [collection] [element] | semmle.label | call to shuffle! : [collection] [element] | +| array_flow.rb:1197:10:1197:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1197:10:1197:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1198:10:1198:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1198:10:1198:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1198:10:1198:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1199:10:1199:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1199:10:1199:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1199:10:1199:10 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1199:10:1199:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1199:10:1199:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1200:10:1200:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1200:10:1200:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1200:10:1200:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1201:10:1201:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1201:10:1201:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1201:10:1201:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1202:10:1202:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1202:10:1202:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1202:10:1202:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1206:9:1206:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1206:9:1206:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1206:5:1206:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1206:5:1206:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1206:9:1206:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1206:9:1206:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1206:16:1206:28 | call to source | semmle.label | call to source | | array_flow.rb:1206:34:1206:46 | call to source | semmle.label | call to source | | array_flow.rb:1208:5:1208:5 | b | semmle.label | b | -| array_flow.rb:1208:9:1208:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1208:9:1208:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | | array_flow.rb:1208:9:1208:17 | call to slice | semmle.label | call to slice | | array_flow.rb:1209:10:1209:10 | b | semmle.label | b | | array_flow.rb:1211:5:1211:5 | b | semmle.label | b | -| array_flow.rb:1211:9:1211:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1211:9:1211:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1211:9:1211:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1211:9:1211:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | | array_flow.rb:1211:9:1211:19 | call to slice | semmle.label | call to slice | | array_flow.rb:1212:10:1212:10 | b | semmle.label | b | | array_flow.rb:1214:5:1214:5 | b | semmle.label | b | -| array_flow.rb:1214:9:1214:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1214:9:1214:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1214:9:1214:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1214:9:1214:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | | array_flow.rb:1214:9:1214:17 | call to slice | semmle.label | call to slice | | array_flow.rb:1216:10:1216:10 | b | semmle.label | b | -| array_flow.rb:1221:5:1221:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1221:5:1221:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1221:9:1221:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1221:9:1221:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1221:9:1221:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | -| array_flow.rb:1221:9:1221:21 | call to slice [element 2] | semmle.label | call to slice [element 2] | -| array_flow.rb:1222:10:1222:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1221:5:1221:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1221:5:1221:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1221:9:1221:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1221:9:1221:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1221:9:1221:21 | call to slice : [collection] [element 0] | semmle.label | call to slice : [collection] [element 0] | +| array_flow.rb:1221:9:1221:21 | call to slice : [collection] [element 2] | semmle.label | call to slice : [collection] [element 2] | +| array_flow.rb:1222:10:1222:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1222:10:1222:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1224:10:1224:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1224:10:1224:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:1224:10:1224:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1226:5:1226:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1226:9:1226:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1226:9:1226:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1226:9:1226:21 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1227:10:1227:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1226:5:1226:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1226:9:1226:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1226:9:1226:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1226:9:1226:21 | call to slice : [collection] [element] | semmle.label | call to slice : [collection] [element] | +| array_flow.rb:1227:10:1227:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1227:10:1227:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1228:10:1228:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1228:10:1228:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1228:10:1228:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1230:5:1230:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1230:9:1230:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1230:9:1230:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | -| array_flow.rb:1231:10:1231:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1230:5:1230:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1230:9:1230:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1230:9:1230:21 | call to slice : [collection] [element 0] | semmle.label | call to slice : [collection] [element 0] | +| array_flow.rb:1231:10:1231:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1231:10:1231:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1235:5:1235:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1235:9:1235:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1235:9:1235:22 | call to slice [element 0] | semmle.label | call to slice [element 0] | -| array_flow.rb:1236:10:1236:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1235:5:1235:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1235:9:1235:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1235:9:1235:22 | call to slice : [collection] [element 0] | semmle.label | call to slice : [collection] [element 0] | +| array_flow.rb:1236:10:1236:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1236:10:1236:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1240:5:1240:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1240:9:1240:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1240:9:1240:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1240:9:1240:21 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1241:10:1241:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1240:5:1240:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1240:9:1240:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1240:9:1240:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1240:9:1240:21 | call to slice : [collection] [element] | semmle.label | call to slice : [collection] [element] | +| array_flow.rb:1241:10:1241:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1241:10:1241:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1242:10:1242:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1242:10:1242:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1242:10:1242:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1244:5:1244:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1244:9:1244:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1244:9:1244:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1244:9:1244:24 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1245:10:1245:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1244:5:1244:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1244:9:1244:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1244:9:1244:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1244:9:1244:24 | call to slice : [collection] [element] | semmle.label | call to slice : [collection] [element] | +| array_flow.rb:1245:10:1245:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1245:10:1245:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1246:10:1246:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1246:10:1246:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1246:10:1246:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1248:5:1248:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1248:9:1248:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1248:9:1248:20 | call to slice [element 2] | semmle.label | call to slice [element 2] | -| array_flow.rb:1251:10:1251:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1248:5:1248:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1248:9:1248:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1248:9:1248:20 | call to slice : [collection] [element 2] | semmle.label | call to slice : [collection] [element 2] | +| array_flow.rb:1251:10:1251:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:1251:10:1251:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1253:5:1253:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1253:9:1253:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1253:9:1253:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1253:9:1253:20 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1254:10:1254:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1253:5:1253:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1253:9:1253:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1253:9:1253:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1253:9:1253:20 | call to slice : [collection] [element] | semmle.label | call to slice : [collection] [element] | +| array_flow.rb:1254:10:1254:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1255:10:1255:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1255:10:1255:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1255:10:1255:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1256:10:1256:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1256:10:1256:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1256:10:1256:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1260:5:1260:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1260:5:1260:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1260:9:1260:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1260:9:1260:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1260:5:1260:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1260:5:1260:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1260:9:1260:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1260:9:1260:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1260:16:1260:28 | call to source | semmle.label | call to source | | array_flow.rb:1260:34:1260:46 | call to source | semmle.label | call to source | | array_flow.rb:1261:5:1261:5 | b | semmle.label | b | -| array_flow.rb:1261:9:1261:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | -| array_flow.rb:1261:9:1261:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1261:9:1261:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1261:9:1261:9 | [post] a : [collection] [element 3] | semmle.label | [post] a : [collection] [element 3] | +| array_flow.rb:1261:9:1261:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1261:9:1261:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | | array_flow.rb:1261:9:1261:19 | call to slice! | semmle.label | call to slice! | | array_flow.rb:1262:10:1262:10 | b | semmle.label | b | -| array_flow.rb:1266:10:1266:10 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1266:10:1266:10 | a : [collection] [element 3] | semmle.label | a : [collection] [element 3] | | array_flow.rb:1266:10:1266:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1268:5:1268:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1268:5:1268:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1268:9:1268:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1268:9:1268:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1268:5:1268:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1268:5:1268:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1268:9:1268:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1268:9:1268:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1268:16:1268:28 | call to source | semmle.label | call to source | | array_flow.rb:1268:34:1268:46 | call to source | semmle.label | call to source | | array_flow.rb:1269:5:1269:5 | b | semmle.label | b | -| array_flow.rb:1269:5:1269:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1269:9:1269:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1269:9:1269:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1269:9:1269:9 | a [element 4] | semmle.label | a [element 4] | +| array_flow.rb:1269:5:1269:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1269:9:1269:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1269:9:1269:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1269:9:1269:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | | array_flow.rb:1269:9:1269:19 | call to slice! | semmle.label | call to slice! | -| array_flow.rb:1269:9:1269:19 | call to slice! [element] | semmle.label | call to slice! [element] | -| array_flow.rb:1270:10:1270:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1269:9:1269:19 | call to slice! : [collection] [element] | semmle.label | call to slice! : [collection] [element] | +| array_flow.rb:1270:10:1270:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1270:10:1270:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1271:10:1271:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1271:10:1271:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1272:10:1272:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1272:10:1272:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1272:10:1272:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1273:10:1273:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1273:10:1273:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1273:10:1273:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1275:10:1275:10 | b | semmle.label | b | -| array_flow.rb:1277:10:1277:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1277:10:1277:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1277:10:1277:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1279:5:1279:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1279:5:1279:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1279:9:1279:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1279:9:1279:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1279:5:1279:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1279:5:1279:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1279:9:1279:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1279:9:1279:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1279:16:1279:28 | call to source | semmle.label | call to source | | array_flow.rb:1279:34:1279:46 | call to source | semmle.label | call to source | -| array_flow.rb:1280:5:1280:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1280:5:1280:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1280:9:1280:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1280:9:1280:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1280:9:1280:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | -| array_flow.rb:1280:9:1280:22 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | -| array_flow.rb:1281:10:1281:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1280:5:1280:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1280:5:1280:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1280:9:1280:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1280:9:1280:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1280:9:1280:22 | call to slice! : [collection] [element 0] | semmle.label | call to slice! : [collection] [element 0] | +| array_flow.rb:1280:9:1280:22 | call to slice! : [collection] [element 2] | semmle.label | call to slice! : [collection] [element 2] | +| array_flow.rb:1281:10:1281:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1281:10:1281:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1283:10:1283:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1283:10:1283:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:1283:10:1283:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1290:5:1290:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1290:5:1290:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1290:9:1290:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1290:9:1290:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1290:5:1290:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1290:5:1290:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1290:9:1290:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1290:9:1290:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1290:16:1290:28 | call to source | semmle.label | call to source | | array_flow.rb:1290:34:1290:46 | call to source | semmle.label | call to source | -| array_flow.rb:1291:5:1291:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1291:9:1291:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1291:9:1291:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1291:9:1291:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1291:9:1291:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | -| array_flow.rb:1292:10:1292:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1291:5:1291:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1291:9:1291:9 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:1291:9:1291:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1291:9:1291:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1291:9:1291:22 | call to slice! : [collection] [element 0] | semmle.label | call to slice! : [collection] [element 0] | +| array_flow.rb:1292:10:1292:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1292:10:1292:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1297:10:1297:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1297:10:1297:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | | array_flow.rb:1297:10:1297:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1301:5:1301:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1301:5:1301:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1301:9:1301:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1301:9:1301:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1301:5:1301:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1301:5:1301:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1301:9:1301:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1301:9:1301:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1301:16:1301:28 | call to source | semmle.label | call to source | | array_flow.rb:1301:34:1301:46 | call to source | semmle.label | call to source | -| array_flow.rb:1302:5:1302:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1302:9:1302:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1302:9:1302:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1302:9:1302:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1302:9:1302:23 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | -| array_flow.rb:1303:10:1303:10 | b [element 0] | semmle.label | b [element 0] | +| array_flow.rb:1302:5:1302:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| array_flow.rb:1302:9:1302:9 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:1302:9:1302:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1302:9:1302:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1302:9:1302:23 | call to slice! : [collection] [element 0] | semmle.label | call to slice! : [collection] [element 0] | +| array_flow.rb:1303:10:1303:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | array_flow.rb:1303:10:1303:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1308:10:1308:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1308:10:1308:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | | array_flow.rb:1308:10:1308:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1312:5:1312:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1312:5:1312:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1312:9:1312:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1312:9:1312:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1312:5:1312:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1312:5:1312:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1312:9:1312:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1312:9:1312:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1312:16:1312:28 | call to source | semmle.label | call to source | | array_flow.rb:1312:34:1312:46 | call to source | semmle.label | call to source | -| array_flow.rb:1313:5:1313:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1313:9:1313:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1313:9:1313:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1313:9:1313:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1313:9:1313:22 | call to slice! [element] | semmle.label | call to slice! [element] | -| array_flow.rb:1314:10:1314:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1313:5:1313:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1313:9:1313:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1313:9:1313:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1313:9:1313:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1313:9:1313:22 | call to slice! : [collection] [element] | semmle.label | call to slice! : [collection] [element] | +| array_flow.rb:1314:10:1314:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1314:10:1314:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1315:10:1315:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1315:10:1315:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1315:10:1315:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1316:10:1316:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1316:10:1316:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1317:10:1317:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1317:10:1317:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1317:10:1317:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1318:10:1318:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1318:10:1318:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1318:10:1318:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1319:10:1319:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1319:10:1319:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1319:10:1319:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1321:5:1321:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1321:5:1321:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1321:9:1321:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1321:9:1321:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1321:5:1321:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1321:5:1321:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1321:9:1321:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1321:9:1321:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1321:16:1321:28 | call to source | semmle.label | call to source | | array_flow.rb:1321:34:1321:46 | call to source | semmle.label | call to source | -| array_flow.rb:1322:5:1322:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1322:9:1322:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1322:9:1322:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1322:9:1322:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1322:9:1322:22 | call to slice! [element] | semmle.label | call to slice! [element] | -| array_flow.rb:1323:10:1323:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1322:5:1322:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1322:9:1322:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1322:9:1322:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1322:9:1322:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1322:9:1322:22 | call to slice! : [collection] [element] | semmle.label | call to slice! : [collection] [element] | +| array_flow.rb:1323:10:1323:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1323:10:1323:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1324:10:1324:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1324:10:1324:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1324:10:1324:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1325:10:1325:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1325:10:1325:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1326:10:1326:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1326:10:1326:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1326:10:1326:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1327:10:1327:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1327:10:1327:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1327:10:1327:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1328:10:1328:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1328:10:1328:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1328:10:1328:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1330:5:1330:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1330:5:1330:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1330:9:1330:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1330:9:1330:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1330:5:1330:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1330:5:1330:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1330:9:1330:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1330:9:1330:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1330:16:1330:28 | call to source | semmle.label | call to source | | array_flow.rb:1330:34:1330:46 | call to source | semmle.label | call to source | -| array_flow.rb:1331:5:1331:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1331:9:1331:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1331:9:1331:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1331:9:1331:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1331:9:1331:25 | call to slice! [element] | semmle.label | call to slice! [element] | -| array_flow.rb:1332:10:1332:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1331:5:1331:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1331:9:1331:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1331:9:1331:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1331:9:1331:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1331:9:1331:25 | call to slice! : [collection] [element] | semmle.label | call to slice! : [collection] [element] | +| array_flow.rb:1332:10:1332:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1332:10:1332:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1333:10:1333:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1333:10:1333:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1334:10:1334:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1334:10:1334:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1334:10:1334:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1335:10:1335:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1335:10:1335:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1335:10:1335:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1336:10:1336:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1336:10:1336:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1336:10:1336:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1337:10:1337:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1337:10:1337:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1337:10:1337:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1339:5:1339:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1339:5:1339:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1339:9:1339:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1339:9:1339:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1339:5:1339:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1339:5:1339:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1339:9:1339:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1339:9:1339:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1339:16:1339:28 | call to source | semmle.label | call to source | | array_flow.rb:1339:34:1339:46 | call to source | semmle.label | call to source | -| array_flow.rb:1340:5:1340:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1340:9:1340:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:1340:9:1340:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1340:9:1340:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1340:9:1340:21 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | -| array_flow.rb:1343:10:1343:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1340:5:1340:5 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | +| array_flow.rb:1340:9:1340:9 | [post] a : [collection] [element 1] | semmle.label | [post] a : [collection] [element 1] | +| array_flow.rb:1340:9:1340:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1340:9:1340:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1340:9:1340:21 | call to slice! : [collection] [element 2] | semmle.label | call to slice! : [collection] [element 2] | +| array_flow.rb:1343:10:1343:10 | b : [collection] [element 2] | semmle.label | b : [collection] [element 2] | | array_flow.rb:1343:10:1343:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1345:10:1345:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1345:10:1345:10 | a : [collection] [element 1] | semmle.label | a : [collection] [element 1] | | array_flow.rb:1345:10:1345:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1348:5:1348:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1348:5:1348:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1348:9:1348:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1348:9:1348:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1348:5:1348:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1348:5:1348:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1348:9:1348:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1348:9:1348:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1348:16:1348:28 | call to source | semmle.label | call to source | | array_flow.rb:1348:34:1348:46 | call to source | semmle.label | call to source | -| array_flow.rb:1349:5:1349:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1349:9:1349:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1349:9:1349:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1349:9:1349:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1349:9:1349:21 | call to slice! [element] | semmle.label | call to slice! [element] | -| array_flow.rb:1350:10:1350:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1349:5:1349:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1349:9:1349:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1349:9:1349:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1349:9:1349:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1349:9:1349:21 | call to slice! : [collection] [element] | semmle.label | call to slice! : [collection] [element] | +| array_flow.rb:1350:10:1350:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1350:10:1350:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1351:10:1351:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1351:10:1351:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1351:10:1351:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1352:10:1352:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1352:10:1352:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1352:10:1352:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1353:10:1353:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1353:10:1353:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1353:10:1353:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1354:10:1354:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1354:10:1354:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1354:10:1354:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1355:10:1355:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1355:10:1355:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1355:10:1355:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1359:5:1359:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1359:9:1359:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1359:5:1359:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1359:9:1359:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1359:16:1359:26 | call to source | semmle.label | call to source | -| array_flow.rb:1360:9:1360:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1360:9:1360:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1360:27:1360:27 | x | semmle.label | x | | array_flow.rb:1361:14:1361:14 | x | semmle.label | x | -| array_flow.rb:1367:5:1367:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1367:9:1367:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1367:5:1367:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1367:9:1367:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1367:16:1367:26 | call to source | semmle.label | call to source | -| array_flow.rb:1368:9:1368:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1368:9:1368:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1368:28:1368:28 | x | semmle.label | x | | array_flow.rb:1369:14:1369:14 | x | semmle.label | x | -| array_flow.rb:1375:5:1375:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1375:9:1375:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1375:5:1375:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1375:9:1375:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1375:16:1375:26 | call to source | semmle.label | call to source | -| array_flow.rb:1376:9:1376:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1376:9:1376:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1376:26:1376:26 | x | semmle.label | x | | array_flow.rb:1376:29:1376:29 | y | semmle.label | y | | array_flow.rb:1377:14:1377:14 | x | semmle.label | x | | array_flow.rb:1378:14:1378:14 | y | semmle.label | y | -| array_flow.rb:1383:5:1383:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1383:9:1383:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1383:5:1383:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1383:9:1383:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1383:16:1383:26 | call to source | semmle.label | call to source | -| array_flow.rb:1384:5:1384:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1384:9:1384:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1384:9:1384:14 | call to sort [element] | semmle.label | call to sort [element] | -| array_flow.rb:1385:10:1385:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1384:5:1384:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1384:9:1384:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1384:9:1384:14 | call to sort : [collection] [element] | semmle.label | call to sort : [collection] [element] | +| array_flow.rb:1385:10:1385:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1385:10:1385:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1386:10:1386:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1386:10:1386:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1386:10:1386:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1387:5:1387:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1387:9:1387:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1387:9:1391:7 | call to sort [element] | semmle.label | call to sort [element] | +| array_flow.rb:1387:5:1387:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:1387:9:1387:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1387:9:1391:7 | call to sort : [collection] [element] | semmle.label | call to sort : [collection] [element] | | array_flow.rb:1387:20:1387:20 | x | semmle.label | x | | array_flow.rb:1387:23:1387:23 | y | semmle.label | y | | array_flow.rb:1388:14:1388:14 | x | semmle.label | x | | array_flow.rb:1389:14:1389:14 | y | semmle.label | y | -| array_flow.rb:1392:10:1392:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1392:10:1392:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:1392:10:1392:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1393:10:1393:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1393:10:1393:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:1393:10:1393:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1397:5:1397:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1397:9:1397:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1397:5:1397:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1397:9:1397:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1397:16:1397:26 | call to source | semmle.label | call to source | -| array_flow.rb:1398:5:1398:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1398:9:1398:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1398:9:1398:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1398:9:1398:15 | call to sort! [element] | semmle.label | call to sort! [element] | -| array_flow.rb:1399:10:1399:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1398:5:1398:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1398:9:1398:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1398:9:1398:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1398:9:1398:15 | call to sort! : [collection] [element] | semmle.label | call to sort! : [collection] [element] | +| array_flow.rb:1399:10:1399:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1399:10:1399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1400:10:1400:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1400:10:1400:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1400:10:1400:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1401:10:1401:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1401:10:1401:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1402:10:1402:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1402:10:1402:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1402:10:1402:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1404:5:1404:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1404:9:1404:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1404:5:1404:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1404:9:1404:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1404:16:1404:26 | call to source | semmle.label | call to source | -| array_flow.rb:1405:5:1405:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1405:9:1405:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1405:9:1405:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1405:9:1409:7 | call to sort! [element] | semmle.label | call to sort! [element] | +| array_flow.rb:1405:5:1405:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1405:9:1405:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1405:9:1405:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1405:9:1409:7 | call to sort! : [collection] [element] | semmle.label | call to sort! : [collection] [element] | | array_flow.rb:1405:21:1405:21 | x | semmle.label | x | | array_flow.rb:1405:24:1405:24 | y | semmle.label | y | | array_flow.rb:1406:14:1406:14 | x | semmle.label | x | | array_flow.rb:1407:14:1407:14 | y | semmle.label | y | -| array_flow.rb:1410:10:1410:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1410:10:1410:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1410:10:1410:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1411:10:1411:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1411:10:1411:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1412:10:1412:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1412:10:1412:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1412:10:1412:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1413:10:1413:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1413:10:1413:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1413:10:1413:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1417:5:1417:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1417:9:1417:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1417:5:1417:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1417:9:1417:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1417:16:1417:26 | call to source | semmle.label | call to source | -| array_flow.rb:1418:5:1418:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1418:9:1418:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1418:9:1421:7 | call to sort_by [element] | semmle.label | call to sort_by [element] | +| array_flow.rb:1418:5:1418:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1418:9:1418:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1418:9:1421:7 | call to sort_by : [collection] [element] | semmle.label | call to sort_by : [collection] [element] | | array_flow.rb:1418:23:1418:23 | x | semmle.label | x | | array_flow.rb:1419:14:1419:14 | x | semmle.label | x | -| array_flow.rb:1422:10:1422:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1422:10:1422:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1422:10:1422:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1423:10:1423:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1423:10:1423:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1427:5:1427:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1427:9:1427:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1427:5:1427:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1427:9:1427:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1427:16:1427:26 | call to source | semmle.label | call to source | -| array_flow.rb:1428:5:1428:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1428:9:1428:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1428:9:1428:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1428:9:1431:7 | call to sort_by! [element] | semmle.label | call to sort_by! [element] | +| array_flow.rb:1428:5:1428:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1428:9:1428:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1428:9:1428:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1428:9:1431:7 | call to sort_by! : [collection] [element] | semmle.label | call to sort_by! : [collection] [element] | | array_flow.rb:1428:24:1428:24 | x | semmle.label | x | | array_flow.rb:1429:14:1429:14 | x | semmle.label | x | -| array_flow.rb:1432:10:1432:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1432:10:1432:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1432:10:1432:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1433:10:1433:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1433:10:1433:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1433:10:1433:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1434:10:1434:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1434:10:1434:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1434:10:1434:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1435:10:1435:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1435:10:1435:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1435:10:1435:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1439:5:1439:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1439:9:1439:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1439:5:1439:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1439:9:1439:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1439:16:1439:26 | call to source | semmle.label | call to source | -| array_flow.rb:1440:9:1440:9 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1440:9:1440:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1440:19:1440:19 | x | semmle.label | x | | array_flow.rb:1441:14:1441:14 | x | semmle.label | x | -| array_flow.rb:1447:5:1447:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1447:5:1447:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1447:9:1447:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1447:9:1447:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1447:5:1447:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1447:5:1447:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1447:9:1447:44 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1447:9:1447:44 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1447:16:1447:28 | call to source | semmle.label | call to source | | array_flow.rb:1447:31:1447:43 | call to source | semmle.label | call to source | -| array_flow.rb:1448:5:1448:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1448:5:1448:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1448:9:1448:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1448:9:1448:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1448:9:1448:17 | call to take [element 2] | semmle.label | call to take [element 2] | -| array_flow.rb:1448:9:1448:17 | call to take [element 3] | semmle.label | call to take [element 3] | -| array_flow.rb:1451:10:1451:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1448:5:1448:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1448:5:1448:5 | b : Array [element 3] | semmle.label | b : Array [element 3] | +| array_flow.rb:1448:9:1448:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1448:9:1448:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1448:9:1448:17 | call to take : Array [element 2] | semmle.label | call to take : Array [element 2] | +| array_flow.rb:1448:9:1448:17 | call to take : Array [element 3] | semmle.label | call to take : Array [element 3] | +| array_flow.rb:1451:10:1451:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1451:10:1451:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1452:10:1452:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1452:10:1452:10 | b : Array [element 3] | semmle.label | b : Array [element 3] | | array_flow.rb:1452:10:1452:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1453:5:1453:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1453:9:1453:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1453:9:1453:17 | call to take [element 2] | semmle.label | call to take [element 2] | -| array_flow.rb:1456:10:1456:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1453:5:1453:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1453:9:1453:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1453:9:1453:17 | call to take : Array [element 2] | semmle.label | call to take : Array [element 2] | +| array_flow.rb:1456:10:1456:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1456:10:1456:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1458:10:1458:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1458:10:1458:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1458:10:1458:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1459:5:1459:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1459:5:1459:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1459:9:1459:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1459:9:1459:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1459:9:1459:19 | call to take [element 2] | semmle.label | call to take [element 2] | -| array_flow.rb:1459:9:1459:19 | call to take [element 3] | semmle.label | call to take [element 3] | -| array_flow.rb:1462:10:1462:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1459:5:1459:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1459:5:1459:5 | b : Array [element 3] | semmle.label | b : Array [element 3] | +| array_flow.rb:1459:9:1459:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1459:9:1459:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1459:9:1459:19 | call to take : Array [element 2] | semmle.label | call to take : Array [element 2] | +| array_flow.rb:1459:9:1459:19 | call to take : Array [element 3] | semmle.label | call to take : Array [element 3] | +| array_flow.rb:1462:10:1462:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1462:10:1462:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1463:10:1463:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1463:10:1463:10 | b : Array [element 3] | semmle.label | b : Array [element 3] | | array_flow.rb:1463:10:1463:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1464:10:1464:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1464:10:1464:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1464:10:1464:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1464:10:1464:10 | b : Array [element 3] | semmle.label | b : Array [element 3] | | array_flow.rb:1464:10:1464:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1465:5:1465:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1465:5:1465:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:1465:12:1465:24 | call to source | semmle.label | call to source | -| array_flow.rb:1466:5:1466:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1466:5:1466:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1466:9:1466:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1466:9:1466:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:1466:9:1466:17 | call to take [element 2] | semmle.label | call to take [element 2] | -| array_flow.rb:1466:9:1466:17 | call to take [element] | semmle.label | call to take [element] | -| array_flow.rb:1467:10:1467:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1467:10:1467:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1466:5:1466:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1466:5:1466:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1466:9:1466:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1466:9:1466:9 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| array_flow.rb:1466:9:1466:17 | call to take : Array [element 2] | semmle.label | call to take : Array [element 2] | +| array_flow.rb:1466:9:1466:17 | call to take : [collection] [element] | semmle.label | call to take : [collection] [element] | +| array_flow.rb:1467:10:1467:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1467:10:1467:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1467:10:1467:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1471:5:1471:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1471:9:1471:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1471:5:1471:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1471:9:1471:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1471:16:1471:26 | call to source | semmle.label | call to source | -| array_flow.rb:1472:5:1472:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1472:9:1472:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1472:9:1475:7 | call to take_while [element 2] | semmle.label | call to take_while [element 2] | +| array_flow.rb:1472:5:1472:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1472:9:1472:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1472:9:1475:7 | call to take_while : Array [element 2] | semmle.label | call to take_while : Array [element 2] | | array_flow.rb:1472:26:1472:26 | x | semmle.label | x | | array_flow.rb:1473:14:1473:14 | x | semmle.label | x | -| array_flow.rb:1478:10:1478:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1478:10:1478:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1478:10:1478:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1484:5:1484:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1484:9:1484:30 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1484:5:1484:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1484:9:1484:30 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1484:19:1484:29 | call to source | semmle.label | call to source | -| array_flow.rb:1485:5:1485:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1485:9:1485:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1485:9:1485:14 | call to to_a [element 3] | semmle.label | call to to_a [element 3] | -| array_flow.rb:1486:10:1486:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1485:5:1485:5 | b : Array [element 3] | semmle.label | b : Array [element 3] | +| array_flow.rb:1485:9:1485:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1485:9:1485:14 | call to to_a : Array [element 3] | semmle.label | call to to_a : Array [element 3] | +| array_flow.rb:1486:10:1486:10 | b : Array [element 3] | semmle.label | b : Array [element 3] | | array_flow.rb:1486:10:1486:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1490:5:1490:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1490:9:1490:27 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1490:5:1490:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1490:9:1490:27 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1490:16:1490:26 | call to source | semmle.label | call to source | -| array_flow.rb:1491:5:1491:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1491:9:1491:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1491:9:1491:16 | call to to_ary [element 2] | semmle.label | call to to_ary [element 2] | -| array_flow.rb:1494:10:1494:10 | b [element 2] | semmle.label | b [element 2] | +| array_flow.rb:1491:5:1491:5 | b : Array [element 2] | semmle.label | b : Array [element 2] | +| array_flow.rb:1491:9:1491:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1491:9:1491:16 | call to to_ary : Array [element 2] | semmle.label | call to to_ary : Array [element 2] | +| array_flow.rb:1494:10:1494:10 | b : Array [element 2] | semmle.label | b : Array [element 2] | | array_flow.rb:1494:10:1494:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1507:5:1507:5 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | -| array_flow.rb:1507:5:1507:5 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | -| array_flow.rb:1507:5:1507:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:1507:9:1507:68 | call to [] [element 0, element 1] | semmle.label | call to [] [element 0, element 1] | -| array_flow.rb:1507:9:1507:68 | call to [] [element 1, element 1] | semmle.label | call to [] [element 1, element 1] | -| array_flow.rb:1507:9:1507:68 | call to [] [element 2, element 1] | semmle.label | call to [] [element 2, element 1] | -| array_flow.rb:1507:10:1507:27 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1507:5:1507:5 | a : Array [element 0, element 1] | semmle.label | a : Array [element 0, element 1] | +| array_flow.rb:1507:5:1507:5 | a : Array [element 1, element 1] | semmle.label | a : Array [element 1, element 1] | +| array_flow.rb:1507:5:1507:5 | a : Array [element 2, element 1] | semmle.label | a : Array [element 2, element 1] | +| array_flow.rb:1507:9:1507:68 | call to [] : Array [element 0, element 1] | semmle.label | call to [] : Array [element 0, element 1] | +| array_flow.rb:1507:9:1507:68 | call to [] : Array [element 1, element 1] | semmle.label | call to [] : Array [element 1, element 1] | +| array_flow.rb:1507:9:1507:68 | call to [] : Array [element 2, element 1] | semmle.label | call to [] : Array [element 2, element 1] | +| array_flow.rb:1507:10:1507:27 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:1507:14:1507:26 | call to source | semmle.label | call to source | -| array_flow.rb:1507:30:1507:47 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1507:30:1507:47 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:1507:34:1507:46 | call to source | semmle.label | call to source | -| array_flow.rb:1507:50:1507:67 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1507:50:1507:67 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:1507:54:1507:66 | call to source | semmle.label | call to source | -| array_flow.rb:1508:5:1508:5 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | -| array_flow.rb:1508:5:1508:5 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | -| array_flow.rb:1508:5:1508:5 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | -| array_flow.rb:1508:9:1508:9 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | -| array_flow.rb:1508:9:1508:9 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | -| array_flow.rb:1508:9:1508:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 0] | semmle.label | call to transpose [element 1, element 0] | -| array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 1] | semmle.label | call to transpose [element 1, element 1] | -| array_flow.rb:1508:9:1508:19 | call to transpose [element 1, element 2] | semmle.label | call to transpose [element 1, element 2] | -| array_flow.rb:1512:10:1512:10 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | +| array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 0] | semmle.label | b : [collection] [element 1, element 0] | +| array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 1] | semmle.label | b : [collection] [element 1, element 1] | +| array_flow.rb:1508:5:1508:5 | b : [collection] [element 1, element 2] | semmle.label | b : [collection] [element 1, element 2] | +| array_flow.rb:1508:9:1508:9 | a : Array [element 0, element 1] | semmle.label | a : Array [element 0, element 1] | +| array_flow.rb:1508:9:1508:9 | a : Array [element 1, element 1] | semmle.label | a : Array [element 1, element 1] | +| array_flow.rb:1508:9:1508:9 | a : Array [element 2, element 1] | semmle.label | a : Array [element 2, element 1] | +| array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 0] | semmle.label | call to transpose : [collection] [element 1, element 0] | +| array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 1] | semmle.label | call to transpose : [collection] [element 1, element 1] | +| array_flow.rb:1508:9:1508:19 | call to transpose : [collection] [element 1, element 2] | semmle.label | call to transpose : [collection] [element 1, element 2] | +| array_flow.rb:1512:10:1512:10 | b : [collection] [element 1, element 0] | semmle.label | b : [collection] [element 1, element 0] | | array_flow.rb:1512:10:1512:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1512:10:1512:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1513:10:1513:10 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | +| array_flow.rb:1513:10:1513:10 | b : [collection] [element 1, element 1] | semmle.label | b : [collection] [element 1, element 1] | | array_flow.rb:1513:10:1513:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:1513:10:1513:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1514:10:1514:10 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | +| array_flow.rb:1514:10:1514:10 | b : [collection] [element 1, element 2] | semmle.label | b : [collection] [element 1, element 2] | | array_flow.rb:1514:10:1514:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | | array_flow.rb:1514:10:1514:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1518:5:1518:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1518:9:1518:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1518:5:1518:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1518:9:1518:29 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1518:16:1518:28 | call to source | semmle.label | call to source | -| array_flow.rb:1519:5:1519:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1519:9:1519:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1519:5:1519:5 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:1519:9:1519:26 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:1519:13:1519:25 | call to source | semmle.label | call to source | -| array_flow.rb:1520:5:1520:5 | c [element 1] | semmle.label | c [element 1] | -| array_flow.rb:1520:9:1520:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1520:5:1520:5 | c : Array [element 1] | semmle.label | c : Array [element 1] | +| array_flow.rb:1520:9:1520:26 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:1520:13:1520:25 | call to source | semmle.label | call to source | -| array_flow.rb:1521:5:1521:5 | d [element] | semmle.label | d [element] | -| array_flow.rb:1521:9:1521:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1521:9:1521:21 | call to union [element] | semmle.label | call to union [element] | -| array_flow.rb:1521:17:1521:17 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1521:20:1521:20 | c [element 1] | semmle.label | c [element 1] | -| array_flow.rb:1522:10:1522:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:1521:5:1521:5 | d : [collection] [element] | semmle.label | d : [collection] [element] | +| array_flow.rb:1521:9:1521:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1521:9:1521:21 | call to union : [collection] [element] | semmle.label | call to union : [collection] [element] | +| array_flow.rb:1521:17:1521:17 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:1521:20:1521:20 | c : Array [element 1] | semmle.label | c : Array [element 1] | +| array_flow.rb:1522:10:1522:10 | d : [collection] [element] | semmle.label | d : [collection] [element] | | array_flow.rb:1522:10:1522:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1523:10:1523:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:1523:10:1523:10 | d : [collection] [element] | semmle.label | d : [collection] [element] | | array_flow.rb:1523:10:1523:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1524:10:1524:10 | d [element] | semmle.label | d [element] | +| array_flow.rb:1524:10:1524:10 | d : [collection] [element] | semmle.label | d : [collection] [element] | | array_flow.rb:1524:10:1524:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1528:5:1528:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1528:5:1528:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1528:9:1528:47 | call to [] [element 3] | semmle.label | call to [] [element 3] | -| array_flow.rb:1528:9:1528:47 | call to [] [element 4] | semmle.label | call to [] [element 4] | +| array_flow.rb:1528:5:1528:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1528:5:1528:5 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1528:9:1528:47 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | +| array_flow.rb:1528:9:1528:47 | call to [] : Array [element 4] | semmle.label | call to [] : Array [element 4] | | array_flow.rb:1528:19:1528:31 | call to source | semmle.label | call to source | | array_flow.rb:1528:34:1528:46 | call to source | semmle.label | call to source | -| array_flow.rb:1530:5:1530:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1530:9:1530:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1530:9:1530:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1530:9:1530:14 | call to uniq [element] | semmle.label | call to uniq [element] | -| array_flow.rb:1531:10:1531:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1530:5:1530:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1530:9:1530:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1530:9:1530:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1530:9:1530:14 | call to uniq : [collection] [element] | semmle.label | call to uniq : [collection] [element] | +| array_flow.rb:1531:10:1531:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1531:10:1531:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1532:10:1532:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1532:10:1532:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1532:10:1532:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1534:5:1534:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1534:9:1534:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1534:9:1534:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1534:9:1537:7 | call to uniq [element] | semmle.label | call to uniq [element] | +| array_flow.rb:1534:5:1534:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:1534:9:1534:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1534:9:1534:9 | a : Array [element 4] | semmle.label | a : Array [element 4] | +| array_flow.rb:1534:9:1537:7 | call to uniq : [collection] [element] | semmle.label | call to uniq : [collection] [element] | | array_flow.rb:1534:20:1534:20 | x | semmle.label | x | | array_flow.rb:1535:14:1535:14 | x | semmle.label | x | -| array_flow.rb:1538:10:1538:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1538:10:1538:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:1538:10:1538:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1542:5:1542:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1542:5:1542:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1542:9:1542:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1542:9:1542:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1542:5:1542:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1542:5:1542:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1542:9:1542:44 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1542:9:1542:44 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1542:16:1542:28 | call to source | semmle.label | call to source | | array_flow.rb:1542:31:1542:43 | call to source | semmle.label | call to source | -| array_flow.rb:1543:5:1543:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1543:9:1543:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1543:9:1543:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1543:9:1543:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1543:9:1543:15 | call to uniq! [element] | semmle.label | call to uniq! [element] | -| array_flow.rb:1544:10:1544:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1543:5:1543:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1543:9:1543:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1543:9:1543:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1543:9:1543:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1543:9:1543:15 | call to uniq! : [collection] [element] | semmle.label | call to uniq! : [collection] [element] | +| array_flow.rb:1544:10:1544:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1544:10:1544:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1545:10:1545:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1545:10:1545:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1546:10:1546:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1546:10:1546:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1546:10:1546:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1547:10:1547:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1547:10:1547:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1547:10:1547:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1549:5:1549:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1549:5:1549:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1549:9:1549:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1549:9:1549:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1549:5:1549:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1549:5:1549:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1549:9:1549:44 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1549:9:1549:44 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1549:16:1549:28 | call to source | semmle.label | call to source | | array_flow.rb:1549:31:1549:43 | call to source | semmle.label | call to source | -| array_flow.rb:1550:5:1550:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1550:9:1550:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1550:9:1550:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1550:9:1550:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1550:9:1553:7 | call to uniq! [element] | semmle.label | call to uniq! [element] | +| array_flow.rb:1550:5:1550:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1550:9:1550:9 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| array_flow.rb:1550:9:1550:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1550:9:1550:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1550:9:1553:7 | call to uniq! : [collection] [element] | semmle.label | call to uniq! : [collection] [element] | | array_flow.rb:1550:21:1550:21 | x | semmle.label | x | | array_flow.rb:1551:14:1551:14 | x | semmle.label | x | -| array_flow.rb:1554:10:1554:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1554:10:1554:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1554:10:1554:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1555:10:1555:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1555:10:1555:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1555:10:1555:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1556:10:1556:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1556:10:1556:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1556:10:1556:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1557:10:1557:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1557:10:1557:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1557:10:1557:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1561:5:1561:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1561:9:1561:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1561:5:1561:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1561:9:1561:29 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1561:16:1561:28 | call to source | semmle.label | call to source | -| array_flow.rb:1562:5:1562:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1562:5:1562:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | -| array_flow.rb:1562:5:1562:5 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1562:5:1562:5 | [post] a : [collection] [element 2] | semmle.label | [post] a : [collection] [element 2] | +| array_flow.rb:1562:5:1562:5 | [post] a : [collection] [element 5] | semmle.label | [post] a : [collection] [element 5] | +| array_flow.rb:1562:5:1562:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | | array_flow.rb:1562:21:1562:33 | call to source | semmle.label | call to source | -| array_flow.rb:1565:10:1565:10 | a [element 2] | semmle.label | a [element 2] | +| array_flow.rb:1565:10:1565:10 | a : [collection] [element 2] | semmle.label | a : [collection] [element 2] | | array_flow.rb:1565:10:1565:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1568:10:1568:10 | a [element 5] | semmle.label | a [element 5] | +| array_flow.rb:1568:10:1568:10 | a : [collection] [element 5] | semmle.label | a : [collection] [element 5] | | array_flow.rb:1568:10:1568:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1572:5:1572:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1572:5:1572:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1572:9:1572:44 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| array_flow.rb:1572:9:1572:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1572:5:1572:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:1572:5:1572:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1572:9:1572:44 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| array_flow.rb:1572:9:1572:44 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1572:13:1572:25 | call to source | semmle.label | call to source | | array_flow.rb:1572:31:1572:43 | call to source | semmle.label | call to source | -| array_flow.rb:1574:5:1574:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1574:5:1574:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1574:9:1574:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1574:9:1574:31 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | -| array_flow.rb:1574:9:1574:31 | call to values_at [element 3] | semmle.label | call to values_at [element 3] | -| array_flow.rb:1576:10:1576:10 | b [element 1] | semmle.label | b [element 1] | +| array_flow.rb:1574:5:1574:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1574:5:1574:5 | b : [collection] [element 3] | semmle.label | b : [collection] [element 3] | +| array_flow.rb:1574:9:1574:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:1574:9:1574:31 | call to values_at : [collection] [element 1] | semmle.label | call to values_at : [collection] [element 1] | +| array_flow.rb:1574:9:1574:31 | call to values_at : [collection] [element 3] | semmle.label | call to values_at : [collection] [element 3] | +| array_flow.rb:1576:10:1576:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | array_flow.rb:1576:10:1576:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1578:10:1578:10 | b [element 3] | semmle.label | b [element 3] | +| array_flow.rb:1578:10:1578:10 | b : [collection] [element 3] | semmle.label | b : [collection] [element 3] | | array_flow.rb:1578:10:1578:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1580:5:1580:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1580:9:1580:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1580:9:1580:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1580:9:1580:25 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1581:10:1581:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1580:5:1580:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1580:9:1580:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:1580:9:1580:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1580:9:1580:25 | call to values_at : [collection] [element] | semmle.label | call to values_at : [collection] [element] | +| array_flow.rb:1581:10:1581:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1581:10:1581:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1582:10:1582:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1582:10:1582:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1582:10:1582:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1584:5:1584:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1584:9:1584:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1584:9:1584:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1584:9:1584:26 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1585:10:1585:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1584:5:1584:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1584:9:1584:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:1584:9:1584:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1584:9:1584:26 | call to values_at : [collection] [element] | semmle.label | call to values_at : [collection] [element] | +| array_flow.rb:1585:10:1585:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1585:10:1585:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1586:10:1586:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1586:10:1586:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1586:10:1586:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1588:5:1588:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1588:5:1588:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1588:9:1588:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1588:9:1588:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1588:9:1588:28 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | -| array_flow.rb:1588:9:1588:28 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1589:10:1589:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1588:5:1588:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1588:5:1588:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1588:9:1588:9 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:1588:9:1588:9 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1588:9:1588:28 | call to values_at : [collection] [element 1] | semmle.label | call to values_at : [collection] [element 1] | +| array_flow.rb:1588:9:1588:28 | call to values_at : [collection] [element] | semmle.label | call to values_at : [collection] [element] | +| array_flow.rb:1589:10:1589:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1589:10:1589:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1590:10:1590:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1590:10:1590:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1590:10:1590:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| array_flow.rb:1590:10:1590:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1590:10:1590:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1591:10:1591:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1591:10:1591:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1591:10:1591:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1592:10:1592:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1592:10:1592:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1592:10:1592:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1596:5:1596:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1596:9:1596:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1596:5:1596:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1596:9:1596:29 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1596:16:1596:28 | call to source | semmle.label | call to source | -| array_flow.rb:1597:5:1597:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1597:9:1597:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1597:5:1597:5 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:1597:9:1597:29 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:1597:13:1597:25 | call to source | semmle.label | call to source | -| array_flow.rb:1598:5:1598:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1598:9:1598:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| array_flow.rb:1598:5:1598:5 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:1598:9:1598:29 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | array_flow.rb:1598:10:1598:22 | call to source | semmle.label | call to source | -| array_flow.rb:1599:5:1599:5 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | -| array_flow.rb:1599:5:1599:5 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | -| array_flow.rb:1599:5:1599:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | -| array_flow.rb:1599:9:1599:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1599:9:1599:19 | call to zip [element 0, element 2] | semmle.label | call to zip [element 0, element 2] | -| array_flow.rb:1599:9:1599:19 | call to zip [element 1, element 1] | semmle.label | call to zip [element 1, element 1] | -| array_flow.rb:1599:9:1599:19 | call to zip [element 2, element 0] | semmle.label | call to zip [element 2, element 0] | -| array_flow.rb:1599:15:1599:15 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1599:18:1599:18 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1601:10:1601:10 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | +| array_flow.rb:1599:5:1599:5 | d : [collection] [element 0, element 2] | semmle.label | d : [collection] [element 0, element 2] | +| array_flow.rb:1599:5:1599:5 | d : [collection] [element 1, element 1] | semmle.label | d : [collection] [element 1, element 1] | +| array_flow.rb:1599:5:1599:5 | d : [collection] [element 2, element 0] | semmle.label | d : [collection] [element 2, element 0] | +| array_flow.rb:1599:9:1599:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 0, element 2] | semmle.label | call to zip : [collection] [element 0, element 2] | +| array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 1, element 1] | semmle.label | call to zip : [collection] [element 1, element 1] | +| array_flow.rb:1599:9:1599:19 | call to zip : [collection] [element 2, element 0] | semmle.label | call to zip : [collection] [element 2, element 0] | +| array_flow.rb:1599:15:1599:15 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:1599:18:1599:18 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:1601:10:1601:10 | d : [collection] [element 0, element 2] | semmle.label | d : [collection] [element 0, element 2] | | array_flow.rb:1601:10:1601:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | | array_flow.rb:1601:10:1601:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1602:10:1602:10 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | +| array_flow.rb:1602:10:1602:10 | d : [collection] [element 1, element 1] | semmle.label | d : [collection] [element 1, element 1] | | array_flow.rb:1602:10:1602:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:1602:10:1602:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1603:10:1603:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | +| array_flow.rb:1603:10:1603:10 | d : [collection] [element 2, element 0] | semmle.label | d : [collection] [element 2, element 0] | | array_flow.rb:1603:10:1603:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1603:10:1603:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1604:5:1604:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1604:11:1604:11 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1604:14:1604:14 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1604:21:1604:21 | x [element 0] | semmle.label | x [element 0] | -| array_flow.rb:1604:21:1604:21 | x [element 1] | semmle.label | x [element 1] | -| array_flow.rb:1604:21:1604:21 | x [element 2] | semmle.label | x [element 2] | -| array_flow.rb:1605:14:1605:14 | x [element 0] | semmle.label | x [element 0] | +| array_flow.rb:1604:5:1604:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1604:11:1604:11 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:1604:14:1604:14 | c : Array [element 0] | semmle.label | c : Array [element 0] | +| array_flow.rb:1604:21:1604:21 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| array_flow.rb:1604:21:1604:21 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | +| array_flow.rb:1604:21:1604:21 | x : [collection] [element 2] | semmle.label | x : [collection] [element 2] | +| array_flow.rb:1605:14:1605:14 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | array_flow.rb:1605:14:1605:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1606:14:1606:14 | x [element 1] | semmle.label | x [element 1] | +| array_flow.rb:1606:14:1606:14 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | | array_flow.rb:1606:14:1606:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1607:14:1607:14 | x [element 2] | semmle.label | x [element 2] | +| array_flow.rb:1607:14:1607:14 | x : [collection] [element 2] | semmle.label | x : [collection] [element 2] | | array_flow.rb:1607:14:1607:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1612:5:1612:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1612:9:1612:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1612:5:1612:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1612:9:1612:29 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1612:16:1612:28 | call to source | semmle.label | call to source | -| array_flow.rb:1613:5:1613:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1613:9:1613:26 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| array_flow.rb:1613:5:1613:5 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:1613:9:1613:26 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | array_flow.rb:1613:13:1613:25 | call to source | semmle.label | call to source | -| array_flow.rb:1614:5:1614:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1614:9:1614:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1614:9:1614:13 | ... \| ... [element] | semmle.label | ... \| ... [element] | -| array_flow.rb:1614:13:1614:13 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1615:10:1615:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1614:5:1614:5 | c : [collection] [element] | semmle.label | c : [collection] [element] | +| array_flow.rb:1614:9:1614:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1614:9:1614:13 | ... \| ... : [collection] [element] | semmle.label | ... \| ... : [collection] [element] | +| array_flow.rb:1614:13:1614:13 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| array_flow.rb:1615:10:1615:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:1615:10:1615:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1616:10:1616:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1616:10:1616:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:1616:10:1616:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1617:10:1617:10 | c [element] | semmle.label | c [element] | +| array_flow.rb:1617:10:1617:10 | c : [collection] [element] | semmle.label | c : [collection] [element] | | array_flow.rb:1617:10:1617:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1622:5:1622:5 | [post] a [element, element 0] | semmle.label | [post] a [element, element 0] | -| array_flow.rb:1622:5:1622:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | +| array_flow.rb:1622:5:1622:5 | [post] a : [collection] [element, element 0] | semmle.label | [post] a : [collection] [element, element 0] | +| array_flow.rb:1622:5:1622:8 | [post] ...[...] : [collection] [element 0] | semmle.label | [post] ...[...] : [collection] [element 0] | | array_flow.rb:1622:15:1622:27 | call to source | semmle.label | call to source | -| array_flow.rb:1623:10:1623:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1623:10:1623:10 | a : [collection] [element, element 0] | semmle.label | a : [collection] [element, element 0] | | array_flow.rb:1623:10:1623:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1623:10:1623:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1625:5:1625:5 | [post] a [element 1, element 0] | semmle.label | [post] a [element 1, element 0] | -| array_flow.rb:1625:5:1625:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | +| array_flow.rb:1625:5:1625:5 | [post] a : [collection] [element 1, element 0] | semmle.label | [post] a : [collection] [element 1, element 0] | +| array_flow.rb:1625:5:1625:8 | [post] ...[...] : [collection] [element 0] | semmle.label | [post] ...[...] : [collection] [element 0] | | array_flow.rb:1625:15:1625:27 | call to source | semmle.label | call to source | -| array_flow.rb:1626:10:1626:10 | a [element 1, element 0] | semmle.label | a [element 1, element 0] | -| array_flow.rb:1626:10:1626:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1626:10:1626:10 | a : [collection] [element 1, element 0] | semmle.label | a : [collection] [element 1, element 0] | +| array_flow.rb:1626:10:1626:10 | a : [collection] [element, element 0] | semmle.label | a : [collection] [element, element 0] | | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1626:10:1626:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1627:10:1627:10 | a [element, element 0] | semmle.label | a [element, element 0] | +| array_flow.rb:1627:10:1627:10 | a : [collection] [element, element 0] | semmle.label | a : [collection] [element, element 0] | | array_flow.rb:1627:10:1627:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1627:10:1627:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1632:5:1632:5 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| array_flow.rb:1632:5:1632:5 | [post] a : [collection] [element 0] | semmle.label | [post] a : [collection] [element 0] | | array_flow.rb:1632:12:1632:24 | call to source | semmle.label | call to source | -| array_flow.rb:1634:5:1634:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1634:5:1634:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:1634:16:1634:28 | call to source | semmle.label | call to source | -| array_flow.rb:1636:5:1636:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1636:5:1636:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:1636:14:1636:26 | call to source | semmle.label | call to source | -| array_flow.rb:1638:5:1638:5 | [post] a [element] | semmle.label | [post] a [element] | +| array_flow.rb:1638:5:1638:5 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | array_flow.rb:1638:16:1638:28 | call to source | semmle.label | call to source | -| array_flow.rb:1639:10:1639:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1639:10:1639:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1639:10:1639:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1641:10:1641:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1641:10:1641:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1641:10:1641:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | +| array_flow.rb:1641:10:1641:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1641:10:1641:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1643:10:1643:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1643:10:1643:10 | a [element] | semmle.label | a [element] | +| array_flow.rb:1643:10:1643:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | +| array_flow.rb:1643:10:1643:10 | a : [collection] [element] | semmle.label | a : [collection] [element] | | array_flow.rb:1643:10:1643:15 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1647:5:1647:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1647:9:1647:32 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:1647:5:1647:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:1647:9:1647:32 | ...[...] : Array [element 1] | semmle.label | ...[...] : Array [element 1] | | array_flow.rb:1647:18:1647:28 | call to source | semmle.label | call to source | -| array_flow.rb:1649:10:1649:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1649:10:1649:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:1649:10:1649:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1651:10:1651:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1651:10:1651:10 | a : Array [element 1] | semmle.label | a : Array [element 1] | | array_flow.rb:1651:10:1651:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1668:9:1668:10 | a2 [element 1] | semmle.label | a2 [element 1] | -| array_flow.rb:1668:14:1668:41 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:1668:9:1668:10 | a2 : Array [element 1] | semmle.label | a2 : Array [element 1] | +| array_flow.rb:1668:14:1668:41 | ...[...] : Array [element 1] | semmle.label | ...[...] : Array [element 1] | | array_flow.rb:1668:25:1668:37 | call to source | semmle.label | call to source | -| array_flow.rb:1670:14:1670:15 | a2 [element 1] | semmle.label | a2 [element 1] | +| array_flow.rb:1670:14:1670:15 | a2 : Array [element 1] | semmle.label | a2 : Array [element 1] | | array_flow.rb:1670:14:1670:18 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1672:14:1672:15 | a2 [element 1] | semmle.label | a2 [element 1] | +| array_flow.rb:1672:14:1672:15 | a2 : Array [element 1] | semmle.label | a2 : Array [element 1] | | array_flow.rb:1672:14:1672:18 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1677:5:1677:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1677:9:1677:29 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| array_flow.rb:1677:5:1677:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1677:9:1677:29 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | array_flow.rb:1677:16:1677:28 | call to source | semmle.label | call to source | -| array_flow.rb:1678:5:1678:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1678:9:1678:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1678:9:1680:7 | call to map [element] | semmle.label | call to map [element] | +| array_flow.rb:1678:5:1678:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| array_flow.rb:1678:9:1678:9 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1678:9:1680:7 | call to map : [collection] [element] | semmle.label | call to map : [collection] [element] | | array_flow.rb:1678:19:1678:19 | x | semmle.label | x | | array_flow.rb:1679:9:1679:9 | x | semmle.label | x | -| array_flow.rb:1681:10:1681:10 | b [element] | semmle.label | b [element] | +| array_flow.rb:1681:10:1681:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | array_flow.rb:1681:10:1681:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1685:5:1685:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1685:5:1685:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1685:9:1685:44 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| array_flow.rb:1685:9:1685:44 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| array_flow.rb:1685:5:1685:5 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1685:5:1685:5 | a : Array [element 3] | semmle.label | a : Array [element 3] | +| array_flow.rb:1685:9:1685:44 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| array_flow.rb:1685:9:1685:44 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | array_flow.rb:1685:16:1685:28 | call to source | semmle.label | call to source | | array_flow.rb:1685:31:1685:43 | call to source | semmle.label | call to source | | array_flow.rb:1686:11:1686:11 | z | semmle.label | z | | array_flow.rb:1686:14:1686:14 | w | semmle.label | w | -| array_flow.rb:1686:18:1686:18 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1686:18:1686:18 | a [element 3] | semmle.label | a [element 3] | +| array_flow.rb:1686:18:1686:18 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| array_flow.rb:1686:18:1686:18 | a : Array [element 3] | semmle.label | a : Array [element 3] | | array_flow.rb:1689:10:1689:10 | z | semmle.label | z | | array_flow.rb:1690:10:1690:10 | w | semmle.label | w | -| array_flow.rb:1693:10:1693:14 | *args [element 1] | semmle.label | *args [element 1] | -| array_flow.rb:1694:5:1694:21 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| array_flow.rb:1694:16:1694:20 | * ... [element 1] | semmle.label | * ... [element 1] | -| array_flow.rb:1694:17:1694:20 | args [element 1] | semmle.label | args [element 1] | +| array_flow.rb:1693:10:1693:14 | *args : Array [element 1] | semmle.label | *args : Array [element 1] | +| array_flow.rb:1694:5:1694:21 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| array_flow.rb:1694:16:1694:20 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| array_flow.rb:1694:17:1694:20 | args : Array [element 1] | semmle.label | args : Array [element 1] | | array_flow.rb:1697:13:1697:13 | y | semmle.label | y | | array_flow.rb:1699:10:1699:10 | y | semmle.label | y | -| array_flow.rb:1704:5:1704:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1704:9:1704:31 | call to m141 [element 1] | semmle.label | call to m141 [element 1] | +| array_flow.rb:1704:5:1704:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| array_flow.rb:1704:9:1704:31 | call to m141 : Array [element 1] | semmle.label | call to m141 : Array [element 1] | | array_flow.rb:1704:17:1704:27 | call to source | semmle.label | call to source | -| array_flow.rb:1705:10:1705:11 | * ... [element 1] | semmle.label | * ... [element 1] | -| array_flow.rb:1705:11:1705:11 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1705:10:1705:11 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| array_flow.rb:1705:11:1705:11 | a : Array [element 1] | semmle.label | a : Array [element 1] | subpaths -| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:30:251:30 | x | array_flow.rb:253:9:253:25 | call to [] [element 0] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | -| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:26:507:26 | x | array_flow.rb:509:9:509:9 | x | array_flow.rb:507:9:510:7 | call to filter_map [element] | -| array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:24:571:24 | x | array_flow.rb:573:9:573:25 | call to [] [element 0] | array_flow.rb:571:9:574:7 | call to flat_map [element] | -| array_flow.rb:1678:9:1678:9 | a [element 2] | array_flow.rb:1678:19:1678:19 | x | array_flow.rb:1679:9:1679:9 | x | array_flow.rb:1678:9:1680:7 | call to map [element] | -| array_flow.rb:1704:17:1704:27 | call to source | array_flow.rb:1693:10:1693:14 | *args [element 1] | array_flow.rb:1694:5:1694:21 | call to [] [element 1] | array_flow.rb:1704:9:1704:31 | call to m141 [element 1] | +| array_flow.rb:251:9:251:9 | a : Array [element 2] | array_flow.rb:251:30:251:30 | x | array_flow.rb:253:9:253:25 | call to [] : Array [element 0] | array_flow.rb:251:9:254:7 | call to collect_concat : [collection] [element] | +| array_flow.rb:507:9:507:9 | a : Array [element 3] | array_flow.rb:507:26:507:26 | x | array_flow.rb:509:9:509:9 | x | array_flow.rb:507:9:510:7 | call to filter_map : [collection] [element] | +| array_flow.rb:571:9:571:9 | a : Array [element 2] | array_flow.rb:571:24:571:24 | x | array_flow.rb:573:9:573:25 | call to [] : Array [element 0] | array_flow.rb:571:9:574:7 | call to flat_map : [collection] [element] | +| array_flow.rb:1678:9:1678:9 | a : Array [element 2] | array_flow.rb:1678:19:1678:19 | x | array_flow.rb:1679:9:1679:9 | x | array_flow.rb:1678:9:1680:7 | call to map : [collection] [element] | +| array_flow.rb:1704:17:1704:27 | call to source | array_flow.rb:1693:10:1693:14 | *args : Array [element 1] | array_flow.rb:1694:5:1694:21 | call to [] : Array [element 1] | array_flow.rb:1704:9:1704:31 | call to m141 : Array [element 1] | testFailures arrayLiteral | array_flow.rb:9:9:9:25 | call to [] | diff --git a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected index dcc8fed90ca..4e05b2c06fc 100644 --- a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected +++ b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected @@ -28,9 +28,9 @@ edges | call_sensitivity.rb:66:20:66:20 | x | call_sensitivity.rb:67:24:67:24 | x | provenance | | | call_sensitivity.rb:67:24:67:24 | x | call_sensitivity.rb:62:18:62:18 | y | provenance | | | call_sensitivity.rb:70:30:70:30 | x | call_sensitivity.rb:71:10:71:10 | x | provenance | | -| call_sensitivity.rb:74:18:74:18 | y | call_sensitivity.rb:75:20:77:7 | do ... end [captured y] | provenance | | -| call_sensitivity.rb:75:20:77:7 | do ... end [captured y] | call_sensitivity.rb:76:17:76:17 | y | provenance | | -| call_sensitivity.rb:75:20:77:7 | do ... end [captured y] | call_sensitivity.rb:76:17:76:17 | y | provenance | heuristic-callback | +| call_sensitivity.rb:74:18:74:18 | y | call_sensitivity.rb:75:20:77:7 | do ... end : [lambda] [captured y] | provenance | | +| call_sensitivity.rb:75:20:77:7 | do ... end : [lambda] [captured y] | call_sensitivity.rb:76:17:76:17 | y | provenance | | +| call_sensitivity.rb:75:20:77:7 | do ... end : [lambda] [captured y] | call_sensitivity.rb:76:17:76:17 | y | provenance | heuristic-callback | | call_sensitivity.rb:76:17:76:17 | y | call_sensitivity.rb:50:15:50:15 | x | provenance | | | call_sensitivity.rb:80:15:80:15 | x | call_sensitivity.rb:81:18:81:18 | x | provenance | | | call_sensitivity.rb:81:18:81:18 | x | call_sensitivity.rb:50:15:50:15 | x | provenance | | @@ -121,7 +121,7 @@ nodes | call_sensitivity.rb:70:30:70:30 | x | semmle.label | x | | call_sensitivity.rb:71:10:71:10 | x | semmle.label | x | | call_sensitivity.rb:74:18:74:18 | y | semmle.label | y | -| call_sensitivity.rb:75:20:77:7 | do ... end [captured y] | semmle.label | do ... end [captured y] | +| call_sensitivity.rb:75:20:77:7 | do ... end : [lambda] [captured y] | semmle.label | do ... end : [lambda] [captured y] | | call_sensitivity.rb:76:17:76:17 | y | semmle.label | y | | call_sensitivity.rb:80:15:80:15 | x | semmle.label | x | | call_sensitivity.rb:81:18:81:18 | x | semmle.label | x | diff --git a/ruby/ql/test/library-tests/dataflow/erb/erb.expected b/ruby/ql/test/library-tests/dataflow/erb/erb.expected index eb507279c0b..17413fcb212 100644 --- a/ruby/ql/test/library-tests/dataflow/erb/erb.expected +++ b/ruby/ql/test/library-tests/dataflow/erb/erb.expected @@ -2,110 +2,110 @@ models edges | main.rb:3:9:3:9 | x | main.rb:4:26:4:26 | x | provenance | | | main.rb:3:13:3:21 | call to source | main.rb:3:9:3:9 | x | provenance | | -| main.rb:4:9:4:12 | view [@x] | main.rb:5:16:5:19 | view [@x] | provenance | | -| main.rb:4:16:4:27 | call to new [@x] | main.rb:4:9:4:12 | view [@x] | provenance | | -| main.rb:4:26:4:26 | x | main.rb:4:16:4:27 | call to new [@x] | provenance | | -| main.rb:4:26:4:26 | x | view1.rb:5:20:5:20 | x | provenance | | -| main.rb:5:16:5:19 | view [@x] | view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | provenance | | -| main.rb:10:16:10:19 | [post] view [@x] | main.rb:11:9:11:12 | view [@x] | provenance | | -| main.rb:11:9:11:12 | view [@x] | view2.rb:2:5:4:7 | self in foo [@x] | provenance | | +| main.rb:4:9:4:12 | view : View1 [@x] | main.rb:5:16:5:19 | view : View1 [@x] | provenance | | +| main.rb:4:16:4:27 | call to new : View1 [@x] | main.rb:4:9:4:12 | view : View1 [@x] | provenance | | +| main.rb:4:26:4:26 | x | main.rb:4:16:4:27 | call to new : View1 [@x] | provenance | | +| main.rb:4:26:4:26 | x | view1.rb:2:20:2:20 | x | provenance | | +| main.rb:5:16:5:19 | view : View1 [@x] | view1.html.erb:2:5:8:1 | self in view1.html.erb : View1 [@x] | provenance | | +| main.rb:10:16:10:19 | [post] view : View2 [@x] | main.rb:11:9:11:12 | view : View2 [@x] | provenance | | +| main.rb:11:9:11:12 | view : View2 [@x] | view2.rb:2:5:4:7 | self in foo : View2 [@x] | provenance | | | main.rb:15:9:15:9 | x | main.rb:16:26:16:26 | x | provenance | | | main.rb:15:13:15:21 | call to source | main.rb:15:9:15:9 | x | provenance | | -| main.rb:16:9:16:12 | view [@x] | main.rb:17:16:17:19 | view [@x] | provenance | | -| main.rb:16:16:16:27 | call to new [@x] | main.rb:16:9:16:12 | view [@x] | provenance | | -| main.rb:16:26:16:26 | x | main.rb:16:16:16:27 | call to new [@x] | provenance | | +| main.rb:16:9:16:12 | view : View3 [@x] | main.rb:17:16:17:19 | view : View3 [@x] | provenance | | +| main.rb:16:16:16:27 | call to new : View3 [@x] | main.rb:16:9:16:12 | view : View3 [@x] | provenance | | +| main.rb:16:26:16:26 | x | main.rb:16:16:16:27 | call to new : View3 [@x] | provenance | | | main.rb:16:26:16:26 | x | view3.rb:2:20:2:20 | x | provenance | | -| main.rb:17:16:17:19 | view [@x] | view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] | provenance | | -| view1.html.erb:2:5:2:9 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] | provenance | | -| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | view1.html.erb:2:5:2:9 | self [@x] | provenance | | -| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | view1.html.erb:7:1:7:5 | self [@x] | provenance | | -| view1.html.erb:6:1:6:14 | [post] self [@x] | view1.html.erb:7:1:7:5 | self [@x] | provenance | | -| view1.html.erb:6:5:6:13 | call to source | view1.html.erb:6:1:6:14 | [post] self [@x] | provenance | | -| view1.html.erb:6:5:6:13 | call to source | view1.rb:13:13:13:13 | x | provenance | | -| view1.html.erb:7:1:7:5 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] | provenance | | -| view1.html.erb:7:1:7:5 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] | provenance | | -| view1.rb:5:20:5:20 | x | view1.rb:6:14:6:14 | x | provenance | | -| view1.rb:6:14:6:14 | x | view1.rb:6:9:6:10 | [post] self [@x] | provenance | | -| view1.rb:9:5:11:7 | self in foo [@x] | view1.rb:10:14:10:15 | self [@x] | provenance | | -| view1.rb:10:14:10:15 | self [@x] | view1.rb:10:14:10:15 | @x | provenance | | -| view1.rb:13:13:13:13 | x | view1.rb:14:14:14:14 | x | provenance | | -| view1.rb:14:9:14:10 | [post] self [@x] | view1.rb:13:5:15:7 | self in set [Return] [@x] | provenance | | -| view1.rb:14:14:14:14 | x | view1.rb:14:9:14:10 | [post] self [@x] | provenance | | -| view2.html.erb:3:1:3:14 | [post] self [@x] | view2.html.erb:3:1:4:1 | self in view2.html.erb [Return] [@x] | provenance | | -| view2.html.erb:3:1:4:1 | self in view2.html.erb [Return] [@x] | main.rb:10:16:10:19 | [post] view [@x] | provenance | | -| view2.html.erb:3:5:3:13 | call to source | view2.html.erb:3:1:3:14 | [post] self [@x] | provenance | | +| main.rb:17:16:17:19 | view : View3 [@x] | view3.html.erb:3:1:4:1 | self in view3.html.erb : View3 [@x] | provenance | | +| view1.html.erb:2:5:2:9 | self : View1 [@x] | view1.rb:6:5:8:7 | self in foo : View1 [@x] | provenance | | +| view1.html.erb:2:5:8:1 | self in view1.html.erb : View1 [@x] | view1.html.erb:2:5:2:9 | self : View1 [@x] | provenance | | +| view1.html.erb:2:5:8:1 | self in view1.html.erb : View1 [@x] | view1.html.erb:7:1:7:5 | self : View1 [@x] | provenance | | +| view1.html.erb:6:1:6:14 | [post] self : View1 [@x] | view1.html.erb:7:1:7:5 | self : View1 [@x] | provenance | | +| view1.html.erb:6:5:6:13 | call to source | view1.html.erb:6:1:6:14 | [post] self : View1 [@x] | provenance | | +| view1.html.erb:6:5:6:13 | call to source | view1.rb:10:13:10:13 | x | provenance | | +| view1.html.erb:7:1:7:5 | self : View1 [@x] | view1.rb:6:5:8:7 | self in foo : View1 [@x] | provenance | | +| view1.html.erb:7:1:7:5 | self : View1 [@x] | view1.rb:6:5:8:7 | self in foo : View1 [@x] | provenance | | +| view1.rb:2:20:2:20 | x | view1.rb:3:14:3:14 | x | provenance | | +| view1.rb:3:14:3:14 | x | view1.rb:3:9:3:10 | [post] self [@x] | provenance | | +| view1.rb:6:5:8:7 | self in foo : View1 [@x] | view1.rb:7:14:7:15 | self : View1 [@x] | provenance | | +| view1.rb:7:14:7:15 | self : View1 [@x] | view1.rb:7:14:7:15 | @x | provenance | | +| view1.rb:10:13:10:13 | x | view1.rb:11:14:11:14 | x | provenance | | +| view1.rb:11:9:11:10 | [post] self [@x] | view1.rb:10:5:12:7 | self in set [Return] : View1 [@x] | provenance | | +| view1.rb:11:14:11:14 | x | view1.rb:11:9:11:10 | [post] self [@x] | provenance | | +| view2.html.erb:3:1:3:14 | [post] self : View2 [@x] | view2.html.erb:3:1:4:1 | self in view2.html.erb [Return] : View2 [@x] | provenance | | +| view2.html.erb:3:1:4:1 | self in view2.html.erb [Return] : View2 [@x] | main.rb:10:16:10:19 | [post] view : View2 [@x] | provenance | | +| view2.html.erb:3:5:3:13 | call to source | view2.html.erb:3:1:3:14 | [post] self : View2 [@x] | provenance | | | view2.html.erb:3:5:3:13 | call to source | view2.rb:6:13:6:13 | x | provenance | | -| view2.rb:2:5:4:7 | self in foo [@x] | view2.rb:3:14:3:15 | self [@x] | provenance | | -| view2.rb:3:14:3:15 | self [@x] | view2.rb:3:14:3:15 | @x | provenance | | +| view2.rb:2:5:4:7 | self in foo : View2 [@x] | view2.rb:3:14:3:15 | self : View2 [@x] | provenance | | +| view2.rb:3:14:3:15 | self : View2 [@x] | view2.rb:3:14:3:15 | @x | provenance | | | view2.rb:6:13:6:13 | x | view2.rb:7:14:7:14 | x | provenance | | -| view2.rb:7:9:7:10 | [post] self [@x] | view2.rb:6:5:8:7 | self in set [Return] [@x] | provenance | | +| view2.rb:7:9:7:10 | [post] self [@x] | view2.rb:6:5:8:7 | self in set [Return] : View2 [@x] | provenance | | | view2.rb:7:14:7:14 | x | view2.rb:7:9:7:10 | [post] self [@x] | provenance | | -| view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] | view3.html.erb:3:6:3:8 | self [@x] | provenance | | -| view3.html.erb:3:6:3:8 | self [@x] | view3.html.erb:3:6:3:8 | call to get | provenance | | -| view3.html.erb:3:6:3:8 | self [@x] | view3.rb:6:5:8:7 | self in get [@x] | provenance | | +| view3.html.erb:3:1:4:1 | self in view3.html.erb : View3 [@x] | view3.html.erb:3:6:3:8 | self : View3 [@x] | provenance | | +| view3.html.erb:3:6:3:8 | self : View3 [@x] | view3.html.erb:3:6:3:8 | call to get | provenance | | +| view3.html.erb:3:6:3:8 | self : View3 [@x] | view3.rb:6:5:8:7 | self in get : View3 [@x] | provenance | | | view3.rb:2:20:2:20 | x | view3.rb:3:14:3:14 | x | provenance | | | view3.rb:3:14:3:14 | x | view3.rb:3:9:3:10 | [post] self [@x] | provenance | | -| view3.rb:6:5:8:7 | self in get [@x] | view3.rb:7:9:7:10 | self [@x] | provenance | | -| view3.rb:7:9:7:10 | self [@x] | view3.rb:7:9:7:10 | @x | provenance | | +| view3.rb:6:5:8:7 | self in get : View3 [@x] | view3.rb:7:9:7:10 | self : View3 [@x] | provenance | | +| view3.rb:7:9:7:10 | self : View3 [@x] | view3.rb:7:9:7:10 | @x | provenance | | nodes | main.rb:3:9:3:9 | x | semmle.label | x | | main.rb:3:13:3:21 | call to source | semmle.label | call to source | -| main.rb:4:9:4:12 | view [@x] | semmle.label | view [@x] | -| main.rb:4:16:4:27 | call to new [@x] | semmle.label | call to new [@x] | +| main.rb:4:9:4:12 | view : View1 [@x] | semmle.label | view : View1 [@x] | +| main.rb:4:16:4:27 | call to new : View1 [@x] | semmle.label | call to new : View1 [@x] | | main.rb:4:26:4:26 | x | semmle.label | x | -| main.rb:5:16:5:19 | view [@x] | semmle.label | view [@x] | -| main.rb:10:16:10:19 | [post] view [@x] | semmle.label | [post] view [@x] | -| main.rb:11:9:11:12 | view [@x] | semmle.label | view [@x] | +| main.rb:5:16:5:19 | view : View1 [@x] | semmle.label | view : View1 [@x] | +| main.rb:10:16:10:19 | [post] view : View2 [@x] | semmle.label | [post] view : View2 [@x] | +| main.rb:11:9:11:12 | view : View2 [@x] | semmle.label | view : View2 [@x] | | main.rb:15:9:15:9 | x | semmle.label | x | | main.rb:15:13:15:21 | call to source | semmle.label | call to source | -| main.rb:16:9:16:12 | view [@x] | semmle.label | view [@x] | -| main.rb:16:16:16:27 | call to new [@x] | semmle.label | call to new [@x] | +| main.rb:16:9:16:12 | view : View3 [@x] | semmle.label | view : View3 [@x] | +| main.rb:16:16:16:27 | call to new : View3 [@x] | semmle.label | call to new : View3 [@x] | | main.rb:16:26:16:26 | x | semmle.label | x | -| main.rb:17:16:17:19 | view [@x] | semmle.label | view [@x] | -| view1.html.erb:2:5:2:9 | self [@x] | semmle.label | self [@x] | -| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | semmle.label | self in view1.html.erb [@x] | -| view1.html.erb:6:1:6:14 | [post] self [@x] | semmle.label | [post] self [@x] | +| main.rb:17:16:17:19 | view : View3 [@x] | semmle.label | view : View3 [@x] | +| view1.html.erb:2:5:2:9 | self : View1 [@x] | semmle.label | self : View1 [@x] | +| view1.html.erb:2:5:8:1 | self in view1.html.erb : View1 [@x] | semmle.label | self in view1.html.erb : View1 [@x] | +| view1.html.erb:6:1:6:14 | [post] self : View1 [@x] | semmle.label | [post] self : View1 [@x] | | view1.html.erb:6:5:6:13 | call to source | semmle.label | call to source | -| view1.html.erb:7:1:7:5 | self [@x] | semmle.label | self [@x] | -| view1.html.erb:7:1:7:5 | self [@x] | semmle.label | self [@x] | -| view1.rb:5:20:5:20 | x | semmle.label | x | -| view1.rb:6:9:6:10 | [post] self [@x] | semmle.label | [post] self [@x] | -| view1.rb:6:14:6:14 | x | semmle.label | x | -| view1.rb:9:5:11:7 | self in foo [@x] | semmle.label | self in foo [@x] | -| view1.rb:10:14:10:15 | @x | semmle.label | @x | -| view1.rb:10:14:10:15 | self [@x] | semmle.label | self [@x] | -| view1.rb:13:5:15:7 | self in set [Return] [@x] | semmle.label | self in set [Return] [@x] | -| view1.rb:13:13:13:13 | x | semmle.label | x | -| view1.rb:14:9:14:10 | [post] self [@x] | semmle.label | [post] self [@x] | -| view1.rb:14:14:14:14 | x | semmle.label | x | -| view2.html.erb:3:1:3:14 | [post] self [@x] | semmle.label | [post] self [@x] | -| view2.html.erb:3:1:4:1 | self in view2.html.erb [Return] [@x] | semmle.label | self in view2.html.erb [Return] [@x] | +| view1.html.erb:7:1:7:5 | self : View1 [@x] | semmle.label | self : View1 [@x] | +| view1.html.erb:7:1:7:5 | self : View1 [@x] | semmle.label | self : View1 [@x] | +| view1.rb:2:20:2:20 | x | semmle.label | x | +| view1.rb:3:9:3:10 | [post] self [@x] | semmle.label | [post] self [@x] | +| view1.rb:3:14:3:14 | x | semmle.label | x | +| view1.rb:6:5:8:7 | self in foo : View1 [@x] | semmle.label | self in foo : View1 [@x] | +| view1.rb:7:14:7:15 | @x | semmle.label | @x | +| view1.rb:7:14:7:15 | self : View1 [@x] | semmle.label | self : View1 [@x] | +| view1.rb:10:5:12:7 | self in set [Return] : View1 [@x] | semmle.label | self in set [Return] : View1 [@x] | +| view1.rb:10:13:10:13 | x | semmle.label | x | +| view1.rb:11:9:11:10 | [post] self [@x] | semmle.label | [post] self [@x] | +| view1.rb:11:14:11:14 | x | semmle.label | x | +| view2.html.erb:3:1:3:14 | [post] self : View2 [@x] | semmle.label | [post] self : View2 [@x] | +| view2.html.erb:3:1:4:1 | self in view2.html.erb [Return] : View2 [@x] | semmle.label | self in view2.html.erb [Return] : View2 [@x] | | view2.html.erb:3:5:3:13 | call to source | semmle.label | call to source | -| view2.rb:2:5:4:7 | self in foo [@x] | semmle.label | self in foo [@x] | +| view2.rb:2:5:4:7 | self in foo : View2 [@x] | semmle.label | self in foo : View2 [@x] | | view2.rb:3:14:3:15 | @x | semmle.label | @x | -| view2.rb:3:14:3:15 | self [@x] | semmle.label | self [@x] | -| view2.rb:6:5:8:7 | self in set [Return] [@x] | semmle.label | self in set [Return] [@x] | +| view2.rb:3:14:3:15 | self : View2 [@x] | semmle.label | self : View2 [@x] | +| view2.rb:6:5:8:7 | self in set [Return] : View2 [@x] | semmle.label | self in set [Return] : View2 [@x] | | view2.rb:6:13:6:13 | x | semmle.label | x | | view2.rb:7:9:7:10 | [post] self [@x] | semmle.label | [post] self [@x] | | view2.rb:7:14:7:14 | x | semmle.label | x | -| view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] | semmle.label | self in view3.html.erb [@x] | +| view3.html.erb:3:1:4:1 | self in view3.html.erb : View3 [@x] | semmle.label | self in view3.html.erb : View3 [@x] | | view3.html.erb:3:6:3:8 | call to get | semmle.label | call to get | -| view3.html.erb:3:6:3:8 | self [@x] | semmle.label | self [@x] | +| view3.html.erb:3:6:3:8 | self : View3 [@x] | semmle.label | self : View3 [@x] | | view3.rb:2:20:2:20 | x | semmle.label | x | | view3.rb:3:9:3:10 | [post] self [@x] | semmle.label | [post] self [@x] | | view3.rb:3:14:3:14 | x | semmle.label | x | -| view3.rb:6:5:8:7 | self in get [@x] | semmle.label | self in get [@x] | +| view3.rb:6:5:8:7 | self in get : View3 [@x] | semmle.label | self in get : View3 [@x] | | view3.rb:7:9:7:10 | @x | semmle.label | @x | -| view3.rb:7:9:7:10 | self [@x] | semmle.label | self [@x] | +| view3.rb:7:9:7:10 | self : View3 [@x] | semmle.label | self : View3 [@x] | subpaths -| main.rb:4:26:4:26 | x | view1.rb:5:20:5:20 | x | view1.rb:6:9:6:10 | [post] self [@x] | main.rb:4:16:4:27 | call to new [@x] | -| main.rb:16:26:16:26 | x | view3.rb:2:20:2:20 | x | view3.rb:3:9:3:10 | [post] self [@x] | main.rb:16:16:16:27 | call to new [@x] | -| view1.html.erb:6:5:6:13 | call to source | view1.rb:13:13:13:13 | x | view1.rb:13:5:15:7 | self in set [Return] [@x] | view1.html.erb:6:1:6:14 | [post] self [@x] | -| view2.html.erb:3:5:3:13 | call to source | view2.rb:6:13:6:13 | x | view2.rb:6:5:8:7 | self in set [Return] [@x] | view2.html.erb:3:1:3:14 | [post] self [@x] | -| view3.html.erb:3:6:3:8 | self [@x] | view3.rb:6:5:8:7 | self in get [@x] | view3.rb:7:9:7:10 | @x | view3.html.erb:3:6:3:8 | call to get | +| main.rb:4:26:4:26 | x | view1.rb:2:20:2:20 | x | view1.rb:3:9:3:10 | [post] self [@x] | main.rb:4:16:4:27 | call to new : View1 [@x] | +| main.rb:16:26:16:26 | x | view3.rb:2:20:2:20 | x | view3.rb:3:9:3:10 | [post] self [@x] | main.rb:16:16:16:27 | call to new : View3 [@x] | +| view1.html.erb:6:5:6:13 | call to source | view1.rb:10:13:10:13 | x | view1.rb:10:5:12:7 | self in set [Return] : View1 [@x] | view1.html.erb:6:1:6:14 | [post] self : View1 [@x] | +| view2.html.erb:3:5:3:13 | call to source | view2.rb:6:13:6:13 | x | view2.rb:6:5:8:7 | self in set [Return] : View2 [@x] | view2.html.erb:3:1:3:14 | [post] self : View2 [@x] | +| view3.html.erb:3:6:3:8 | self : View3 [@x] | view3.rb:6:5:8:7 | self in get : View3 [@x] | view3.rb:7:9:7:10 | @x | view3.html.erb:3:6:3:8 | call to get | testFailures #select -| view1.rb:10:14:10:15 | @x | main.rb:3:13:3:21 | call to source | view1.rb:10:14:10:15 | @x | $@ | main.rb:3:13:3:21 | call to source | call to source | -| view1.rb:10:14:10:15 | @x | view1.html.erb:6:5:6:13 | call to source | view1.rb:10:14:10:15 | @x | $@ | view1.html.erb:6:5:6:13 | call to source | call to source | +| view1.rb:7:14:7:15 | @x | main.rb:3:13:3:21 | call to source | view1.rb:7:14:7:15 | @x | $@ | main.rb:3:13:3:21 | call to source | call to source | +| view1.rb:7:14:7:15 | @x | view1.html.erb:6:5:6:13 | call to source | view1.rb:7:14:7:15 | @x | $@ | view1.html.erb:6:5:6:13 | call to source | call to source | | view2.rb:3:14:3:15 | @x | view2.html.erb:3:5:3:13 | call to source | view2.rb:3:14:3:15 | @x | $@ | view2.html.erb:3:5:3:13 | call to source | call to source | | view3.html.erb:3:6:3:8 | call to get | main.rb:15:13:15:21 | call to source | view3.html.erb:3:6:3:8 | call to get | $@ | main.rb:15:13:15:21 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/erb/main.rb b/ruby/ql/test/library-tests/dataflow/erb/main.rb index d89e7901cee..2806eaed447 100644 --- a/ruby/ql/test/library-tests/dataflow/erb/main.rb +++ b/ruby/ql/test/library-tests/dataflow/erb/main.rb @@ -23,3 +23,6 @@ class App render(view) end end + +class ViewComponent::Base +end diff --git a/ruby/ql/test/library-tests/dataflow/erb/view1.rb b/ruby/ql/test/library-tests/dataflow/erb/view1.rb index d0c6a08dd8f..c8104eba3a7 100644 --- a/ruby/ql/test/library-tests/dataflow/erb/view1.rb +++ b/ruby/ql/test/library-tests/dataflow/erb/view1.rb @@ -1,6 +1,3 @@ -class ViewComponent::Base -end - class View1 < ViewComponent::Base def initialize(x) @x = x @@ -13,4 +10,4 @@ class View1 < ViewComponent::Base def set(x) @x = x end -end \ No newline at end of file +end diff --git a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected index 95bac1978fb..ea7919f80f8 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected @@ -140,14 +140,14 @@ edges | semantics.rb:108:5:108:5 | b | semantics.rb:110:27:110:27 | b | provenance | | | semantics.rb:108:9:108:18 | call to source | semantics.rb:108:5:108:5 | b | provenance | | | semantics.rb:108:9:108:18 | call to source | semantics.rb:108:5:108:5 | b | provenance | | -| semantics.rb:109:10:109:28 | call to s15 [element :foo] | semantics.rb:109:10:109:34 | ...[...] | provenance | | -| semantics.rb:109:10:109:28 | call to s15 [element :foo] | semantics.rb:109:10:109:34 | ...[...] | provenance | | -| semantics.rb:109:19:109:19 | a | semantics.rb:109:10:109:28 | call to s15 [element :foo] | provenance | | -| semantics.rb:109:19:109:19 | a | semantics.rb:109:10:109:28 | call to s15 [element :foo] | provenance | | -| semantics.rb:110:10:110:28 | call to s15 [element :bar] | semantics.rb:110:10:110:34 | ...[...] | provenance | | -| semantics.rb:110:10:110:28 | call to s15 [element :bar] | semantics.rb:110:10:110:34 | ...[...] | provenance | | -| semantics.rb:110:27:110:27 | b | semantics.rb:110:10:110:28 | call to s15 [element :bar] | provenance | | -| semantics.rb:110:27:110:27 | b | semantics.rb:110:10:110:28 | call to s15 [element :bar] | provenance | | +| semantics.rb:109:10:109:28 | call to s15 : Hash [element :foo] | semantics.rb:109:10:109:34 | ...[...] | provenance | | +| semantics.rb:109:10:109:28 | call to s15 : Hash [element :foo] | semantics.rb:109:10:109:34 | ...[...] | provenance | | +| semantics.rb:109:19:109:19 | a | semantics.rb:109:10:109:28 | call to s15 : Hash [element :foo] | provenance | | +| semantics.rb:109:19:109:19 | a | semantics.rb:109:10:109:28 | call to s15 : Hash [element :foo] | provenance | | +| semantics.rb:110:10:110:28 | call to s15 : Hash [element :bar] | semantics.rb:110:10:110:34 | ...[...] | provenance | | +| semantics.rb:110:10:110:28 | call to s15 : Hash [element :bar] | semantics.rb:110:10:110:34 | ...[...] | provenance | | +| semantics.rb:110:27:110:27 | b | semantics.rb:110:10:110:28 | call to s15 : Hash [element :bar] | provenance | | +| semantics.rb:110:27:110:27 | b | semantics.rb:110:10:110:28 | call to s15 : Hash [element :bar] | provenance | | | semantics.rb:114:5:114:5 | a | semantics.rb:116:14:116:14 | a | provenance | | | semantics.rb:114:5:114:5 | a | semantics.rb:116:14:116:14 | a | provenance | | | semantics.rb:114:5:114:5 | a | semantics.rb:119:17:119:17 | a | provenance | | @@ -158,26 +158,26 @@ edges | semantics.rb:115:5:115:5 | b | semantics.rb:121:17:121:17 | b | provenance | | | semantics.rb:115:9:115:18 | call to source | semantics.rb:115:5:115:5 | b | provenance | | | semantics.rb:115:9:115:18 | call to source | semantics.rb:115:5:115:5 | b | provenance | | -| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:117:16:117:16 | h [element :a] | provenance | | -| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:117:16:117:16 | h [element :a] | provenance | | -| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | provenance | | -| semantics.rb:116:5:116:5 | h [element :a] | semantics.rb:121:22:121:22 | h [element :a] | provenance | | -| semantics.rb:116:9:116:22 | call to [] [element :a] | semantics.rb:116:5:116:5 | h [element :a] | provenance | | -| semantics.rb:116:9:116:22 | call to [] [element :a] | semantics.rb:116:5:116:5 | h [element :a] | provenance | | -| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] [element :a] | provenance | | -| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] [element :a] | provenance | | -| semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | | -| semantics.rb:117:14:117:16 | ** ... [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | | -| semantics.rb:117:16:117:16 | h [element :a] | semantics.rb:117:14:117:16 | ** ... [element :a] | provenance | | -| semantics.rb:117:16:117:16 | h [element :a] | semantics.rb:117:14:117:16 | ** ... [element :a] | provenance | | +| semantics.rb:116:5:116:5 | h : Hash [element :a] | semantics.rb:117:16:117:16 | h : Hash [element :a] | provenance | | +| semantics.rb:116:5:116:5 | h : Hash [element :a] | semantics.rb:117:16:117:16 | h : Hash [element :a] | provenance | | +| semantics.rb:116:5:116:5 | h : Hash [element :a] | semantics.rb:121:22:121:22 | h : Hash [element :a] | provenance | | +| semantics.rb:116:5:116:5 | h : Hash [element :a] | semantics.rb:121:22:121:22 | h : Hash [element :a] | provenance | | +| semantics.rb:116:9:116:22 | call to [] : Hash [element :a] | semantics.rb:116:5:116:5 | h : Hash [element :a] | provenance | | +| semantics.rb:116:9:116:22 | call to [] : Hash [element :a] | semantics.rb:116:5:116:5 | h : Hash [element :a] | provenance | | +| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] : Hash [element :a] | provenance | | +| semantics.rb:116:14:116:14 | a | semantics.rb:116:9:116:22 | call to [] : Hash [element :a] | provenance | | +| semantics.rb:117:14:117:16 | ** ... : Hash [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | | +| semantics.rb:117:14:117:16 | ** ... : Hash [element :a] | semantics.rb:117:10:117:17 | call to s16 | provenance | | +| semantics.rb:117:16:117:16 | h : Hash [element :a] | semantics.rb:117:14:117:16 | ** ... : Hash [element :a] | provenance | | +| semantics.rb:117:16:117:16 | h : Hash [element :a] | semantics.rb:117:14:117:16 | ** ... : Hash [element :a] | provenance | | | semantics.rb:119:17:119:17 | a | semantics.rb:119:10:119:18 | call to s16 | provenance | | | semantics.rb:119:17:119:17 | a | semantics.rb:119:10:119:18 | call to s16 | provenance | | | semantics.rb:121:17:121:17 | b | semantics.rb:121:10:121:23 | call to s16 | provenance | | | semantics.rb:121:17:121:17 | b | semantics.rb:121:10:121:23 | call to s16 | provenance | | -| semantics.rb:121:20:121:22 | ** ... [element :a] | semantics.rb:121:10:121:23 | call to s16 | provenance | | -| semantics.rb:121:20:121:22 | ** ... [element :a] | semantics.rb:121:10:121:23 | call to s16 | provenance | | -| semantics.rb:121:22:121:22 | h [element :a] | semantics.rb:121:20:121:22 | ** ... [element :a] | provenance | | -| semantics.rb:121:22:121:22 | h [element :a] | semantics.rb:121:20:121:22 | ** ... [element :a] | provenance | | +| semantics.rb:121:20:121:22 | ** ... : Hash [element :a] | semantics.rb:121:10:121:23 | call to s16 | provenance | | +| semantics.rb:121:20:121:22 | ** ... : Hash [element :a] | semantics.rb:121:10:121:23 | call to s16 | provenance | | +| semantics.rb:121:22:121:22 | h : Hash [element :a] | semantics.rb:121:20:121:22 | ** ... : Hash [element :a] | provenance | | +| semantics.rb:121:22:121:22 | h : Hash [element :a] | semantics.rb:121:20:121:22 | ** ... : Hash [element :a] | provenance | | | semantics.rb:125:5:125:5 | a | semantics.rb:127:14:127:14 | a | provenance | | | semantics.rb:125:5:125:5 | a | semantics.rb:128:14:128:14 | a | provenance | | | semantics.rb:125:5:125:5 | a | semantics.rb:128:14:128:14 | a | provenance | | @@ -190,14 +190,14 @@ edges | semantics.rb:126:9:126:18 | call to source | semantics.rb:126:5:126:5 | b | provenance | | | semantics.rb:127:14:127:14 | a | semantics.rb:127:10:127:18 | call to s17 | provenance | | | semantics.rb:127:17:127:17 | b | semantics.rb:127:10:127:18 | call to s17 | provenance | | -| semantics.rb:128:10:128:18 | call to s17 [element 0] | semantics.rb:128:10:128:21 | ...[...] | provenance | | -| semantics.rb:128:10:128:18 | call to s17 [element 0] | semantics.rb:128:10:128:21 | ...[...] | provenance | | -| semantics.rb:128:14:128:14 | a | semantics.rb:128:10:128:18 | call to s17 [element 0] | provenance | | -| semantics.rb:128:14:128:14 | a | semantics.rb:128:10:128:18 | call to s17 [element 0] | provenance | | -| semantics.rb:129:10:129:18 | call to s17 [element 1] | semantics.rb:129:10:129:21 | ...[...] | provenance | | -| semantics.rb:129:10:129:18 | call to s17 [element 1] | semantics.rb:129:10:129:21 | ...[...] | provenance | | -| semantics.rb:129:17:129:17 | b | semantics.rb:129:10:129:18 | call to s17 [element 1] | provenance | | -| semantics.rb:129:17:129:17 | b | semantics.rb:129:10:129:18 | call to s17 [element 1] | provenance | | +| semantics.rb:128:10:128:18 | call to s17 : Array [element 0] | semantics.rb:128:10:128:21 | ...[...] | provenance | | +| semantics.rb:128:10:128:18 | call to s17 : Array [element 0] | semantics.rb:128:10:128:21 | ...[...] | provenance | | +| semantics.rb:128:14:128:14 | a | semantics.rb:128:10:128:18 | call to s17 : Array [element 0] | provenance | | +| semantics.rb:128:14:128:14 | a | semantics.rb:128:10:128:18 | call to s17 : Array [element 0] | provenance | | +| semantics.rb:129:10:129:18 | call to s17 : Array [element 1] | semantics.rb:129:10:129:21 | ...[...] | provenance | | +| semantics.rb:129:10:129:18 | call to s17 : Array [element 1] | semantics.rb:129:10:129:21 | ...[...] | provenance | | +| semantics.rb:129:17:129:17 | b | semantics.rb:129:10:129:18 | call to s17 : Array [element 1] | provenance | | +| semantics.rb:129:17:129:17 | b | semantics.rb:129:10:129:18 | call to s17 : Array [element 1] | provenance | | | semantics.rb:133:5:133:5 | a | semantics.rb:135:12:135:12 | a | provenance | | | semantics.rb:133:5:133:5 | a | semantics.rb:135:12:135:12 | a | provenance | | | semantics.rb:133:5:133:5 | a | semantics.rb:137:14:137:14 | a | provenance | | @@ -208,400 +208,400 @@ edges | semantics.rb:134:5:134:5 | b | semantics.rb:135:15:135:15 | b | provenance | | | semantics.rb:134:9:134:18 | call to source | semantics.rb:134:5:134:5 | b | provenance | | | semantics.rb:134:9:134:18 | call to source | semantics.rb:134:5:134:5 | b | provenance | | -| semantics.rb:135:5:135:7 | arr [element 0] | semantics.rb:136:15:136:17 | arr [element 0] | provenance | | -| semantics.rb:135:5:135:7 | arr [element 0] | semantics.rb:136:15:136:17 | arr [element 0] | provenance | | -| semantics.rb:135:5:135:7 | arr [element 1] | semantics.rb:136:15:136:17 | arr [element 1] | provenance | | -| semantics.rb:135:5:135:7 | arr [element 1] | semantics.rb:136:15:136:17 | arr [element 1] | provenance | | -| semantics.rb:135:11:135:16 | call to [] [element 0] | semantics.rb:135:5:135:7 | arr [element 0] | provenance | | -| semantics.rb:135:11:135:16 | call to [] [element 0] | semantics.rb:135:5:135:7 | arr [element 0] | provenance | | -| semantics.rb:135:11:135:16 | call to [] [element 1] | semantics.rb:135:5:135:7 | arr [element 1] | provenance | | -| semantics.rb:135:11:135:16 | call to [] [element 1] | semantics.rb:135:5:135:7 | arr [element 1] | provenance | | -| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] [element 0] | provenance | | -| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] [element 0] | provenance | | -| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] [element 1] | provenance | | -| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] [element 1] | provenance | | -| semantics.rb:136:14:136:17 | * ... [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | | -| semantics.rb:136:14:136:17 | * ... [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | | -| semantics.rb:136:14:136:17 | * ... [element 1] | semantics.rb:136:10:136:18 | call to s18 | provenance | | -| semantics.rb:136:14:136:17 | * ... [element 1] | semantics.rb:136:10:136:18 | call to s18 | provenance | | -| semantics.rb:136:15:136:17 | arr [element 0] | semantics.rb:136:14:136:17 | * ... [element 0] | provenance | | -| semantics.rb:136:15:136:17 | arr [element 0] | semantics.rb:136:14:136:17 | * ... [element 0] | provenance | | -| semantics.rb:136:15:136:17 | arr [element 1] | semantics.rb:136:14:136:17 | * ... [element 1] | provenance | | -| semantics.rb:136:15:136:17 | arr [element 1] | semantics.rb:136:14:136:17 | * ... [element 1] | provenance | | +| semantics.rb:135:5:135:7 | arr : Array [element 0] | semantics.rb:136:15:136:17 | arr : Array [element 0] | provenance | | +| semantics.rb:135:5:135:7 | arr : Array [element 0] | semantics.rb:136:15:136:17 | arr : Array [element 0] | provenance | | +| semantics.rb:135:5:135:7 | arr : Array [element 1] | semantics.rb:136:15:136:17 | arr : Array [element 1] | provenance | | +| semantics.rb:135:5:135:7 | arr : Array [element 1] | semantics.rb:136:15:136:17 | arr : Array [element 1] | provenance | | +| semantics.rb:135:11:135:16 | call to [] : Array [element 0] | semantics.rb:135:5:135:7 | arr : Array [element 0] | provenance | | +| semantics.rb:135:11:135:16 | call to [] : Array [element 0] | semantics.rb:135:5:135:7 | arr : Array [element 0] | provenance | | +| semantics.rb:135:11:135:16 | call to [] : Array [element 1] | semantics.rb:135:5:135:7 | arr : Array [element 1] | provenance | | +| semantics.rb:135:11:135:16 | call to [] : Array [element 1] | semantics.rb:135:5:135:7 | arr : Array [element 1] | provenance | | +| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] : Array [element 0] | provenance | | +| semantics.rb:135:12:135:12 | a | semantics.rb:135:11:135:16 | call to [] : Array [element 0] | provenance | | +| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] : Array [element 1] | provenance | | +| semantics.rb:135:15:135:15 | b | semantics.rb:135:11:135:16 | call to [] : Array [element 1] | provenance | | +| semantics.rb:136:14:136:17 | * ... : Array [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | | +| semantics.rb:136:14:136:17 | * ... : Array [element 0] | semantics.rb:136:10:136:18 | call to s18 | provenance | | +| semantics.rb:136:14:136:17 | * ... : Array [element 1] | semantics.rb:136:10:136:18 | call to s18 | provenance | | +| semantics.rb:136:14:136:17 | * ... : Array [element 1] | semantics.rb:136:10:136:18 | call to s18 | provenance | | +| semantics.rb:136:15:136:17 | arr : Array [element 0] | semantics.rb:136:14:136:17 | * ... : Array [element 0] | provenance | | +| semantics.rb:136:15:136:17 | arr : Array [element 0] | semantics.rb:136:14:136:17 | * ... : Array [element 0] | provenance | | +| semantics.rb:136:15:136:17 | arr : Array [element 1] | semantics.rb:136:14:136:17 | * ... : Array [element 1] | provenance | | +| semantics.rb:136:15:136:17 | arr : Array [element 1] | semantics.rb:136:14:136:17 | * ... : Array [element 1] | provenance | | | semantics.rb:137:14:137:14 | a | semantics.rb:137:10:137:15 | call to s18 | provenance | | | semantics.rb:137:14:137:14 | a | semantics.rb:137:10:137:15 | call to s18 | provenance | | -| semantics.rb:142:5:142:5 | b | semantics.rb:146:5:146:5 | [post] h [element] | provenance | | -| semantics.rb:142:5:142:5 | b | semantics.rb:146:5:146:5 | [post] h [element] | provenance | | +| semantics.rb:142:5:142:5 | b | semantics.rb:146:5:146:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:142:5:142:5 | b | semantics.rb:146:5:146:5 | [post] h : [collection] [element] | provenance | | | semantics.rb:142:9:142:18 | call to source | semantics.rb:142:5:142:5 | b | provenance | | | semantics.rb:142:9:142:18 | call to source | semantics.rb:142:5:142:5 | b | provenance | | -| semantics.rb:146:5:146:5 | [post] h [element] | semantics.rb:148:14:148:14 | h [element] | provenance | | -| semantics.rb:146:5:146:5 | [post] h [element] | semantics.rb:148:14:148:14 | h [element] | provenance | | -| semantics.rb:148:14:148:14 | h [element] | semantics.rb:148:10:148:15 | call to s19 | provenance | | -| semantics.rb:148:14:148:14 | h [element] | semantics.rb:148:10:148:15 | call to s19 | provenance | | +| semantics.rb:146:5:146:5 | [post] h : [collection] [element] | semantics.rb:148:14:148:14 | h : [collection] [element] | provenance | | +| semantics.rb:146:5:146:5 | [post] h : [collection] [element] | semantics.rb:148:14:148:14 | h : [collection] [element] | provenance | | +| semantics.rb:148:14:148:14 | h : [collection] [element] | semantics.rb:148:10:148:15 | call to s19 | provenance | | +| semantics.rb:148:14:148:14 | h : [collection] [element] | semantics.rb:148:10:148:15 | call to s19 | provenance | | | semantics.rb:152:5:152:5 | a | semantics.rb:153:13:153:13 | a | provenance | | | semantics.rb:152:5:152:5 | a | semantics.rb:153:13:153:13 | a | provenance | | | semantics.rb:152:9:152:18 | call to source | semantics.rb:152:5:152:5 | a | provenance | | | semantics.rb:152:9:152:18 | call to source | semantics.rb:152:5:152:5 | a | provenance | | -| semantics.rb:153:5:153:5 | x [element] | semantics.rb:154:10:154:10 | x [element] | provenance | | -| semantics.rb:153:5:153:5 | x [element] | semantics.rb:154:10:154:10 | x [element] | provenance | | -| semantics.rb:153:5:153:5 | x [element] | semantics.rb:155:10:155:10 | x [element] | provenance | | -| semantics.rb:153:5:153:5 | x [element] | semantics.rb:155:10:155:10 | x [element] | provenance | | -| semantics.rb:153:9:153:14 | call to s20 [element] | semantics.rb:153:5:153:5 | x [element] | provenance | | -| semantics.rb:153:9:153:14 | call to s20 [element] | semantics.rb:153:5:153:5 | x [element] | provenance | | -| semantics.rb:153:13:153:13 | a | semantics.rb:153:9:153:14 | call to s20 [element] | provenance | | -| semantics.rb:153:13:153:13 | a | semantics.rb:153:9:153:14 | call to s20 [element] | provenance | | -| semantics.rb:154:10:154:10 | x [element] | semantics.rb:154:10:154:13 | ...[...] | provenance | | -| semantics.rb:154:10:154:10 | x [element] | semantics.rb:154:10:154:13 | ...[...] | provenance | | -| semantics.rb:155:10:155:10 | x [element] | semantics.rb:155:10:155:13 | ...[...] | provenance | | -| semantics.rb:155:10:155:10 | x [element] | semantics.rb:155:10:155:13 | ...[...] | provenance | | -| semantics.rb:159:5:159:5 | a | semantics.rb:163:5:163:5 | [post] h [element 0] | provenance | | -| semantics.rb:159:5:159:5 | a | semantics.rb:163:5:163:5 | [post] h [element 0] | provenance | | +| semantics.rb:153:5:153:5 | x : [collection] [element] | semantics.rb:154:10:154:10 | x : [collection] [element] | provenance | | +| semantics.rb:153:5:153:5 | x : [collection] [element] | semantics.rb:154:10:154:10 | x : [collection] [element] | provenance | | +| semantics.rb:153:5:153:5 | x : [collection] [element] | semantics.rb:155:10:155:10 | x : [collection] [element] | provenance | | +| semantics.rb:153:5:153:5 | x : [collection] [element] | semantics.rb:155:10:155:10 | x : [collection] [element] | provenance | | +| semantics.rb:153:9:153:14 | call to s20 : [collection] [element] | semantics.rb:153:5:153:5 | x : [collection] [element] | provenance | | +| semantics.rb:153:9:153:14 | call to s20 : [collection] [element] | semantics.rb:153:5:153:5 | x : [collection] [element] | provenance | | +| semantics.rb:153:13:153:13 | a | semantics.rb:153:9:153:14 | call to s20 : [collection] [element] | provenance | | +| semantics.rb:153:13:153:13 | a | semantics.rb:153:9:153:14 | call to s20 : [collection] [element] | provenance | | +| semantics.rb:154:10:154:10 | x : [collection] [element] | semantics.rb:154:10:154:13 | ...[...] | provenance | | +| semantics.rb:154:10:154:10 | x : [collection] [element] | semantics.rb:154:10:154:13 | ...[...] | provenance | | +| semantics.rb:155:10:155:10 | x : [collection] [element] | semantics.rb:155:10:155:13 | ...[...] | provenance | | +| semantics.rb:155:10:155:10 | x : [collection] [element] | semantics.rb:155:10:155:13 | ...[...] | provenance | | +| semantics.rb:159:5:159:5 | a | semantics.rb:163:5:163:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:159:5:159:5 | a | semantics.rb:163:5:163:5 | [post] h : [collection] [element 0] | provenance | | | semantics.rb:159:9:159:18 | call to source | semantics.rb:159:5:159:5 | a | provenance | | | semantics.rb:159:9:159:18 | call to source | semantics.rb:159:5:159:5 | a | provenance | | -| semantics.rb:160:5:160:5 | b | semantics.rb:164:5:164:5 | [post] h [element] | provenance | | -| semantics.rb:160:5:160:5 | b | semantics.rb:164:5:164:5 | [post] h [element] | provenance | | +| semantics.rb:160:5:160:5 | b | semantics.rb:164:5:164:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:160:5:160:5 | b | semantics.rb:164:5:164:5 | [post] h : [collection] [element] | provenance | | | semantics.rb:160:9:160:18 | call to source | semantics.rb:160:5:160:5 | b | provenance | | | semantics.rb:160:9:160:18 | call to source | semantics.rb:160:5:160:5 | b | provenance | | -| semantics.rb:163:5:163:5 | [post] h [element 0] | semantics.rb:166:14:166:14 | h [element 0] | provenance | | -| semantics.rb:163:5:163:5 | [post] h [element 0] | semantics.rb:166:14:166:14 | h [element 0] | provenance | | -| semantics.rb:164:5:164:5 | [post] h [element] | semantics.rb:166:14:166:14 | h [element] | provenance | | -| semantics.rb:164:5:164:5 | [post] h [element] | semantics.rb:166:14:166:14 | h [element] | provenance | | -| semantics.rb:166:14:166:14 | h [element 0] | semantics.rb:166:10:166:15 | call to s21 | provenance | | -| semantics.rb:166:14:166:14 | h [element 0] | semantics.rb:166:10:166:15 | call to s21 | provenance | | -| semantics.rb:166:14:166:14 | h [element] | semantics.rb:166:10:166:15 | call to s21 | provenance | | -| semantics.rb:166:14:166:14 | h [element] | semantics.rb:166:10:166:15 | call to s21 | provenance | | +| semantics.rb:163:5:163:5 | [post] h : [collection] [element 0] | semantics.rb:166:14:166:14 | h : [collection] [element 0] | provenance | | +| semantics.rb:163:5:163:5 | [post] h : [collection] [element 0] | semantics.rb:166:14:166:14 | h : [collection] [element 0] | provenance | | +| semantics.rb:164:5:164:5 | [post] h : [collection] [element] | semantics.rb:166:14:166:14 | h : [collection] [element] | provenance | | +| semantics.rb:164:5:164:5 | [post] h : [collection] [element] | semantics.rb:166:14:166:14 | h : [collection] [element] | provenance | | +| semantics.rb:166:14:166:14 | h : [collection] [element 0] | semantics.rb:166:10:166:15 | call to s21 | provenance | | +| semantics.rb:166:14:166:14 | h : [collection] [element 0] | semantics.rb:166:10:166:15 | call to s21 | provenance | | +| semantics.rb:166:14:166:14 | h : [collection] [element] | semantics.rb:166:10:166:15 | call to s21 | provenance | | +| semantics.rb:166:14:166:14 | h : [collection] [element] | semantics.rb:166:10:166:15 | call to s21 | provenance | | | semantics.rb:170:5:170:5 | a | semantics.rb:171:13:171:13 | a | provenance | | | semantics.rb:170:5:170:5 | a | semantics.rb:171:13:171:13 | a | provenance | | | semantics.rb:170:9:170:18 | call to source | semantics.rb:170:5:170:5 | a | provenance | | | semantics.rb:170:9:170:18 | call to source | semantics.rb:170:5:170:5 | a | provenance | | -| semantics.rb:171:5:171:5 | x [element] | semantics.rb:172:10:172:10 | x [element] | provenance | | -| semantics.rb:171:5:171:5 | x [element] | semantics.rb:172:10:172:10 | x [element] | provenance | | -| semantics.rb:171:5:171:5 | x [element] | semantics.rb:173:10:173:10 | x [element] | provenance | | -| semantics.rb:171:5:171:5 | x [element] | semantics.rb:173:10:173:10 | x [element] | provenance | | -| semantics.rb:171:9:171:14 | call to s22 [element] | semantics.rb:171:5:171:5 | x [element] | provenance | | -| semantics.rb:171:9:171:14 | call to s22 [element] | semantics.rb:171:5:171:5 | x [element] | provenance | | -| semantics.rb:171:13:171:13 | a | semantics.rb:171:9:171:14 | call to s22 [element] | provenance | | -| semantics.rb:171:13:171:13 | a | semantics.rb:171:9:171:14 | call to s22 [element] | provenance | | -| semantics.rb:172:10:172:10 | x [element] | semantics.rb:172:10:172:13 | ...[...] | provenance | | -| semantics.rb:172:10:172:10 | x [element] | semantics.rb:172:10:172:13 | ...[...] | provenance | | -| semantics.rb:173:10:173:10 | x [element] | semantics.rb:173:10:173:13 | ...[...] | provenance | | -| semantics.rb:173:10:173:10 | x [element] | semantics.rb:173:10:173:13 | ...[...] | provenance | | -| semantics.rb:177:5:177:5 | a | semantics.rb:180:5:180:5 | [post] h [element 0] | provenance | | -| semantics.rb:177:5:177:5 | a | semantics.rb:180:5:180:5 | [post] h [element 0] | provenance | | +| semantics.rb:171:5:171:5 | x : [collection] [element] | semantics.rb:172:10:172:10 | x : [collection] [element] | provenance | | +| semantics.rb:171:5:171:5 | x : [collection] [element] | semantics.rb:172:10:172:10 | x : [collection] [element] | provenance | | +| semantics.rb:171:5:171:5 | x : [collection] [element] | semantics.rb:173:10:173:10 | x : [collection] [element] | provenance | | +| semantics.rb:171:5:171:5 | x : [collection] [element] | semantics.rb:173:10:173:10 | x : [collection] [element] | provenance | | +| semantics.rb:171:9:171:14 | call to s22 : [collection] [element] | semantics.rb:171:5:171:5 | x : [collection] [element] | provenance | | +| semantics.rb:171:9:171:14 | call to s22 : [collection] [element] | semantics.rb:171:5:171:5 | x : [collection] [element] | provenance | | +| semantics.rb:171:13:171:13 | a | semantics.rb:171:9:171:14 | call to s22 : [collection] [element] | provenance | | +| semantics.rb:171:13:171:13 | a | semantics.rb:171:9:171:14 | call to s22 : [collection] [element] | provenance | | +| semantics.rb:172:10:172:10 | x : [collection] [element] | semantics.rb:172:10:172:13 | ...[...] | provenance | | +| semantics.rb:172:10:172:10 | x : [collection] [element] | semantics.rb:172:10:172:13 | ...[...] | provenance | | +| semantics.rb:173:10:173:10 | x : [collection] [element] | semantics.rb:173:10:173:13 | ...[...] | provenance | | +| semantics.rb:173:10:173:10 | x : [collection] [element] | semantics.rb:173:10:173:13 | ...[...] | provenance | | +| semantics.rb:177:5:177:5 | a | semantics.rb:180:5:180:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:177:5:177:5 | a | semantics.rb:180:5:180:5 | [post] h : [collection] [element 0] | provenance | | | semantics.rb:177:9:177:18 | call to source | semantics.rb:177:5:177:5 | a | provenance | | | semantics.rb:177:9:177:18 | call to source | semantics.rb:177:5:177:5 | a | provenance | | -| semantics.rb:180:5:180:5 | [post] h [element 0] | semantics.rb:181:5:181:5 | h [element 0] | provenance | | -| semantics.rb:180:5:180:5 | [post] h [element 0] | semantics.rb:181:5:181:5 | h [element 0] | provenance | | -| semantics.rb:181:5:181:5 | [post] h [element 0] | semantics.rb:182:14:182:14 | h [element 0] | provenance | | -| semantics.rb:181:5:181:5 | [post] h [element 0] | semantics.rb:182:14:182:14 | h [element 0] | provenance | | -| semantics.rb:181:5:181:5 | h [element 0] | semantics.rb:181:5:181:5 | [post] h [element 0] | provenance | | -| semantics.rb:181:5:181:5 | h [element 0] | semantics.rb:181:5:181:5 | [post] h [element 0] | provenance | | -| semantics.rb:182:14:182:14 | h [element 0] | semantics.rb:182:10:182:15 | call to s23 | provenance | | -| semantics.rb:182:14:182:14 | h [element 0] | semantics.rb:182:10:182:15 | call to s23 | provenance | | +| semantics.rb:180:5:180:5 | [post] h : [collection] [element 0] | semantics.rb:181:5:181:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:180:5:180:5 | [post] h : [collection] [element 0] | semantics.rb:181:5:181:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:181:5:181:5 | [post] h : [collection] [element 0] | semantics.rb:182:14:182:14 | h : [collection] [element 0] | provenance | | +| semantics.rb:181:5:181:5 | [post] h : [collection] [element 0] | semantics.rb:182:14:182:14 | h : [collection] [element 0] | provenance | | +| semantics.rb:181:5:181:5 | h : [collection] [element 0] | semantics.rb:181:5:181:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:181:5:181:5 | h : [collection] [element 0] | semantics.rb:181:5:181:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:182:14:182:14 | h : [collection] [element 0] | semantics.rb:182:10:182:15 | call to s23 | provenance | | +| semantics.rb:182:14:182:14 | h : [collection] [element 0] | semantics.rb:182:10:182:15 | call to s23 | provenance | | | semantics.rb:186:5:186:5 | a | semantics.rb:187:13:187:13 | a | provenance | | | semantics.rb:186:5:186:5 | a | semantics.rb:187:13:187:13 | a | provenance | | | semantics.rb:186:9:186:18 | call to source | semantics.rb:186:5:186:5 | a | provenance | | | semantics.rb:186:9:186:18 | call to source | semantics.rb:186:5:186:5 | a | provenance | | -| semantics.rb:187:5:187:5 | x [element 0] | semantics.rb:188:10:188:10 | x [element 0] | provenance | | -| semantics.rb:187:5:187:5 | x [element 0] | semantics.rb:188:10:188:10 | x [element 0] | provenance | | -| semantics.rb:187:5:187:5 | x [element 0] | semantics.rb:190:10:190:10 | x [element 0] | provenance | | -| semantics.rb:187:5:187:5 | x [element 0] | semantics.rb:190:10:190:10 | x [element 0] | provenance | | -| semantics.rb:187:9:187:14 | call to s24 [element 0] | semantics.rb:187:5:187:5 | x [element 0] | provenance | | -| semantics.rb:187:9:187:14 | call to s24 [element 0] | semantics.rb:187:5:187:5 | x [element 0] | provenance | | -| semantics.rb:187:13:187:13 | a | semantics.rb:187:9:187:14 | call to s24 [element 0] | provenance | | -| semantics.rb:187:13:187:13 | a | semantics.rb:187:9:187:14 | call to s24 [element 0] | provenance | | -| semantics.rb:188:10:188:10 | x [element 0] | semantics.rb:188:10:188:13 | ...[...] | provenance | | -| semantics.rb:188:10:188:10 | x [element 0] | semantics.rb:188:10:188:13 | ...[...] | provenance | | -| semantics.rb:190:10:190:10 | x [element 0] | semantics.rb:190:10:190:13 | ...[...] | provenance | | -| semantics.rb:190:10:190:10 | x [element 0] | semantics.rb:190:10:190:13 | ...[...] | provenance | | -| semantics.rb:194:5:194:5 | a | semantics.rb:197:5:197:5 | [post] h [element 0] | provenance | | -| semantics.rb:194:5:194:5 | a | semantics.rb:197:5:197:5 | [post] h [element 0] | provenance | | +| semantics.rb:187:5:187:5 | x : [collection] [element 0] | semantics.rb:188:10:188:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:187:5:187:5 | x : [collection] [element 0] | semantics.rb:188:10:188:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:187:5:187:5 | x : [collection] [element 0] | semantics.rb:190:10:190:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:187:5:187:5 | x : [collection] [element 0] | semantics.rb:190:10:190:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:187:9:187:14 | call to s24 : [collection] [element 0] | semantics.rb:187:5:187:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:187:9:187:14 | call to s24 : [collection] [element 0] | semantics.rb:187:5:187:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:187:13:187:13 | a | semantics.rb:187:9:187:14 | call to s24 : [collection] [element 0] | provenance | | +| semantics.rb:187:13:187:13 | a | semantics.rb:187:9:187:14 | call to s24 : [collection] [element 0] | provenance | | +| semantics.rb:188:10:188:10 | x : [collection] [element 0] | semantics.rb:188:10:188:13 | ...[...] | provenance | | +| semantics.rb:188:10:188:10 | x : [collection] [element 0] | semantics.rb:188:10:188:13 | ...[...] | provenance | | +| semantics.rb:190:10:190:10 | x : [collection] [element 0] | semantics.rb:190:10:190:13 | ...[...] | provenance | | +| semantics.rb:190:10:190:10 | x : [collection] [element 0] | semantics.rb:190:10:190:13 | ...[...] | provenance | | +| semantics.rb:194:5:194:5 | a | semantics.rb:197:5:197:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:194:5:194:5 | a | semantics.rb:197:5:197:5 | [post] h : [collection] [element 0] | provenance | | | semantics.rb:194:9:194:18 | call to source | semantics.rb:194:5:194:5 | a | provenance | | | semantics.rb:194:9:194:18 | call to source | semantics.rb:194:5:194:5 | a | provenance | | -| semantics.rb:197:5:197:5 | [post] h [element 0] | semantics.rb:198:5:198:5 | h [element 0] | provenance | | -| semantics.rb:197:5:197:5 | [post] h [element 0] | semantics.rb:198:5:198:5 | h [element 0] | provenance | | -| semantics.rb:198:5:198:5 | [post] h [element 0] | semantics.rb:199:14:199:14 | h [element 0] | provenance | | -| semantics.rb:198:5:198:5 | [post] h [element 0] | semantics.rb:199:14:199:14 | h [element 0] | provenance | | -| semantics.rb:198:5:198:5 | h [element 0] | semantics.rb:198:5:198:5 | [post] h [element 0] | provenance | | -| semantics.rb:198:5:198:5 | h [element 0] | semantics.rb:198:5:198:5 | [post] h [element 0] | provenance | | -| semantics.rb:199:14:199:14 | h [element 0] | semantics.rb:199:10:199:15 | call to s25 | provenance | | -| semantics.rb:199:14:199:14 | h [element 0] | semantics.rb:199:10:199:15 | call to s25 | provenance | | +| semantics.rb:197:5:197:5 | [post] h : [collection] [element 0] | semantics.rb:198:5:198:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:197:5:197:5 | [post] h : [collection] [element 0] | semantics.rb:198:5:198:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:198:5:198:5 | [post] h : [collection] [element 0] | semantics.rb:199:14:199:14 | h : [collection] [element 0] | provenance | | +| semantics.rb:198:5:198:5 | [post] h : [collection] [element 0] | semantics.rb:199:14:199:14 | h : [collection] [element 0] | provenance | | +| semantics.rb:198:5:198:5 | h : [collection] [element 0] | semantics.rb:198:5:198:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:198:5:198:5 | h : [collection] [element 0] | semantics.rb:198:5:198:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:199:14:199:14 | h : [collection] [element 0] | semantics.rb:199:10:199:15 | call to s25 | provenance | | +| semantics.rb:199:14:199:14 | h : [collection] [element 0] | semantics.rb:199:10:199:15 | call to s25 | provenance | | | semantics.rb:203:5:203:5 | a | semantics.rb:204:13:204:13 | a | provenance | | | semantics.rb:203:5:203:5 | a | semantics.rb:204:13:204:13 | a | provenance | | | semantics.rb:203:9:203:18 | call to source | semantics.rb:203:5:203:5 | a | provenance | | | semantics.rb:203:9:203:18 | call to source | semantics.rb:203:5:203:5 | a | provenance | | -| semantics.rb:204:5:204:5 | x [element 0] | semantics.rb:205:10:205:10 | x [element 0] | provenance | | -| semantics.rb:204:5:204:5 | x [element 0] | semantics.rb:205:10:205:10 | x [element 0] | provenance | | -| semantics.rb:204:5:204:5 | x [element 0] | semantics.rb:207:10:207:10 | x [element 0] | provenance | | -| semantics.rb:204:5:204:5 | x [element 0] | semantics.rb:207:10:207:10 | x [element 0] | provenance | | -| semantics.rb:204:9:204:14 | call to s26 [element 0] | semantics.rb:204:5:204:5 | x [element 0] | provenance | | -| semantics.rb:204:9:204:14 | call to s26 [element 0] | semantics.rb:204:5:204:5 | x [element 0] | provenance | | -| semantics.rb:204:13:204:13 | a | semantics.rb:204:9:204:14 | call to s26 [element 0] | provenance | | -| semantics.rb:204:13:204:13 | a | semantics.rb:204:9:204:14 | call to s26 [element 0] | provenance | | -| semantics.rb:205:10:205:10 | x [element 0] | semantics.rb:205:10:205:13 | ...[...] | provenance | | -| semantics.rb:205:10:205:10 | x [element 0] | semantics.rb:205:10:205:13 | ...[...] | provenance | | -| semantics.rb:207:10:207:10 | x [element 0] | semantics.rb:207:10:207:13 | ...[...] | provenance | | -| semantics.rb:207:10:207:10 | x [element 0] | semantics.rb:207:10:207:13 | ...[...] | provenance | | -| semantics.rb:212:5:212:5 | b | semantics.rb:218:5:218:5 | [post] h [element 1] | provenance | | -| semantics.rb:212:5:212:5 | b | semantics.rb:218:5:218:5 | [post] h [element 1] | provenance | | +| semantics.rb:204:5:204:5 | x : [collection] [element 0] | semantics.rb:205:10:205:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:204:5:204:5 | x : [collection] [element 0] | semantics.rb:205:10:205:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:204:5:204:5 | x : [collection] [element 0] | semantics.rb:207:10:207:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:204:5:204:5 | x : [collection] [element 0] | semantics.rb:207:10:207:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:204:9:204:14 | call to s26 : [collection] [element 0] | semantics.rb:204:5:204:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:204:9:204:14 | call to s26 : [collection] [element 0] | semantics.rb:204:5:204:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:204:13:204:13 | a | semantics.rb:204:9:204:14 | call to s26 : [collection] [element 0] | provenance | | +| semantics.rb:204:13:204:13 | a | semantics.rb:204:9:204:14 | call to s26 : [collection] [element 0] | provenance | | +| semantics.rb:205:10:205:10 | x : [collection] [element 0] | semantics.rb:205:10:205:13 | ...[...] | provenance | | +| semantics.rb:205:10:205:10 | x : [collection] [element 0] | semantics.rb:205:10:205:13 | ...[...] | provenance | | +| semantics.rb:207:10:207:10 | x : [collection] [element 0] | semantics.rb:207:10:207:13 | ...[...] | provenance | | +| semantics.rb:207:10:207:10 | x : [collection] [element 0] | semantics.rb:207:10:207:13 | ...[...] | provenance | | +| semantics.rb:212:5:212:5 | b | semantics.rb:218:5:218:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:212:5:212:5 | b | semantics.rb:218:5:218:5 | [post] h : [collection] [element 1] | provenance | | | semantics.rb:212:9:212:18 | call to source | semantics.rb:212:5:212:5 | b | provenance | | | semantics.rb:212:9:212:18 | call to source | semantics.rb:212:5:212:5 | b | provenance | | -| semantics.rb:213:5:213:5 | c | semantics.rb:219:5:219:5 | [post] h [element 2] | provenance | | -| semantics.rb:213:5:213:5 | c | semantics.rb:219:5:219:5 | [post] h [element 2] | provenance | | +| semantics.rb:213:5:213:5 | c | semantics.rb:219:5:219:5 | [post] h : [collection] [element 2] | provenance | | +| semantics.rb:213:5:213:5 | c | semantics.rb:219:5:219:5 | [post] h : [collection] [element 2] | provenance | | | semantics.rb:213:9:213:18 | call to source | semantics.rb:213:5:213:5 | c | provenance | | | semantics.rb:213:9:213:18 | call to source | semantics.rb:213:5:213:5 | c | provenance | | -| semantics.rb:214:5:214:5 | d | semantics.rb:220:5:220:5 | [post] h [element] | provenance | | -| semantics.rb:214:5:214:5 | d | semantics.rb:220:5:220:5 | [post] h [element] | provenance | | +| semantics.rb:214:5:214:5 | d | semantics.rb:220:5:220:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:214:5:214:5 | d | semantics.rb:220:5:220:5 | [post] h : [collection] [element] | provenance | | | semantics.rb:214:9:214:18 | call to source | semantics.rb:214:5:214:5 | d | provenance | | | semantics.rb:214:9:214:18 | call to source | semantics.rb:214:5:214:5 | d | provenance | | -| semantics.rb:218:5:218:5 | [post] h [element 1] | semantics.rb:219:5:219:5 | h [element 1] | provenance | | -| semantics.rb:218:5:218:5 | [post] h [element 1] | semantics.rb:219:5:219:5 | h [element 1] | provenance | | -| semantics.rb:219:5:219:5 | [post] h [element 1] | semantics.rb:222:14:222:14 | h [element 1] | provenance | | -| semantics.rb:219:5:219:5 | [post] h [element 1] | semantics.rb:222:14:222:14 | h [element 1] | provenance | | -| semantics.rb:219:5:219:5 | [post] h [element 2] | semantics.rb:222:14:222:14 | h [element 2] | provenance | | -| semantics.rb:219:5:219:5 | [post] h [element 2] | semantics.rb:222:14:222:14 | h [element 2] | provenance | | -| semantics.rb:219:5:219:5 | h [element 1] | semantics.rb:219:5:219:5 | [post] h [element 1] | provenance | | -| semantics.rb:219:5:219:5 | h [element 1] | semantics.rb:219:5:219:5 | [post] h [element 1] | provenance | | -| semantics.rb:220:5:220:5 | [post] h [element] | semantics.rb:222:14:222:14 | h [element] | provenance | | -| semantics.rb:220:5:220:5 | [post] h [element] | semantics.rb:222:14:222:14 | h [element] | provenance | | -| semantics.rb:222:14:222:14 | h [element 1] | semantics.rb:222:10:222:15 | call to s27 | provenance | | -| semantics.rb:222:14:222:14 | h [element 1] | semantics.rb:222:10:222:15 | call to s27 | provenance | | -| semantics.rb:222:14:222:14 | h [element 2] | semantics.rb:222:10:222:15 | call to s27 | provenance | | -| semantics.rb:222:14:222:14 | h [element 2] | semantics.rb:222:10:222:15 | call to s27 | provenance | | -| semantics.rb:222:14:222:14 | h [element] | semantics.rb:222:10:222:15 | call to s27 | provenance | | -| semantics.rb:222:14:222:14 | h [element] | semantics.rb:222:10:222:15 | call to s27 | provenance | | +| semantics.rb:218:5:218:5 | [post] h : [collection] [element 1] | semantics.rb:219:5:219:5 | h : [collection] [element 1] | provenance | | +| semantics.rb:218:5:218:5 | [post] h : [collection] [element 1] | semantics.rb:219:5:219:5 | h : [collection] [element 1] | provenance | | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 1] | semantics.rb:222:14:222:14 | h : [collection] [element 1] | provenance | | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 1] | semantics.rb:222:14:222:14 | h : [collection] [element 1] | provenance | | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 2] | semantics.rb:222:14:222:14 | h : [collection] [element 2] | provenance | | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 2] | semantics.rb:222:14:222:14 | h : [collection] [element 2] | provenance | | +| semantics.rb:219:5:219:5 | h : [collection] [element 1] | semantics.rb:219:5:219:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:219:5:219:5 | h : [collection] [element 1] | semantics.rb:219:5:219:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:220:5:220:5 | [post] h : [collection] [element] | semantics.rb:222:14:222:14 | h : [collection] [element] | provenance | | +| semantics.rb:220:5:220:5 | [post] h : [collection] [element] | semantics.rb:222:14:222:14 | h : [collection] [element] | provenance | | +| semantics.rb:222:14:222:14 | h : [collection] [element 1] | semantics.rb:222:10:222:15 | call to s27 | provenance | | +| semantics.rb:222:14:222:14 | h : [collection] [element 1] | semantics.rb:222:10:222:15 | call to s27 | provenance | | +| semantics.rb:222:14:222:14 | h : [collection] [element 2] | semantics.rb:222:10:222:15 | call to s27 | provenance | | +| semantics.rb:222:14:222:14 | h : [collection] [element 2] | semantics.rb:222:10:222:15 | call to s27 | provenance | | +| semantics.rb:222:14:222:14 | h : [collection] [element] | semantics.rb:222:10:222:15 | call to s27 | provenance | | +| semantics.rb:222:14:222:14 | h : [collection] [element] | semantics.rb:222:10:222:15 | call to s27 | provenance | | | semantics.rb:226:5:226:5 | a | semantics.rb:227:13:227:13 | a | provenance | | | semantics.rb:226:5:226:5 | a | semantics.rb:227:13:227:13 | a | provenance | | | semantics.rb:226:9:226:18 | call to source | semantics.rb:226:5:226:5 | a | provenance | | | semantics.rb:226:9:226:18 | call to source | semantics.rb:226:5:226:5 | a | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:228:10:228:10 | x [element] | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:228:10:228:10 | x [element] | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:229:10:229:10 | x [element] | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:229:10:229:10 | x [element] | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:230:10:230:10 | x [element] | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:230:10:230:10 | x [element] | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:231:10:231:10 | x [element] | provenance | | -| semantics.rb:227:5:227:5 | x [element] | semantics.rb:231:10:231:10 | x [element] | provenance | | -| semantics.rb:227:9:227:14 | call to s28 [element] | semantics.rb:227:5:227:5 | x [element] | provenance | | -| semantics.rb:227:9:227:14 | call to s28 [element] | semantics.rb:227:5:227:5 | x [element] | provenance | | -| semantics.rb:227:13:227:13 | a | semantics.rb:227:9:227:14 | call to s28 [element] | provenance | | -| semantics.rb:227:13:227:13 | a | semantics.rb:227:9:227:14 | call to s28 [element] | provenance | | -| semantics.rb:228:10:228:10 | x [element] | semantics.rb:228:10:228:13 | ...[...] | provenance | | -| semantics.rb:228:10:228:10 | x [element] | semantics.rb:228:10:228:13 | ...[...] | provenance | | -| semantics.rb:229:10:229:10 | x [element] | semantics.rb:229:10:229:13 | ...[...] | provenance | | -| semantics.rb:229:10:229:10 | x [element] | semantics.rb:229:10:229:13 | ...[...] | provenance | | -| semantics.rb:230:10:230:10 | x [element] | semantics.rb:230:10:230:13 | ...[...] | provenance | | -| semantics.rb:230:10:230:10 | x [element] | semantics.rb:230:10:230:13 | ...[...] | provenance | | -| semantics.rb:231:10:231:10 | x [element] | semantics.rb:231:10:231:13 | ...[...] | provenance | | -| semantics.rb:231:10:231:10 | x [element] | semantics.rb:231:10:231:13 | ...[...] | provenance | | -| semantics.rb:236:5:236:5 | b | semantics.rb:241:5:241:5 | [post] h [element 1] | provenance | | -| semantics.rb:236:5:236:5 | b | semantics.rb:241:5:241:5 | [post] h [element 1] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:228:10:228:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:228:10:228:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:229:10:229:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:229:10:229:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:230:10:230:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:230:10:230:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:231:10:231:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semantics.rb:231:10:231:10 | x : [collection] [element] | provenance | | +| semantics.rb:227:9:227:14 | call to s28 : [collection] [element] | semantics.rb:227:5:227:5 | x : [collection] [element] | provenance | | +| semantics.rb:227:9:227:14 | call to s28 : [collection] [element] | semantics.rb:227:5:227:5 | x : [collection] [element] | provenance | | +| semantics.rb:227:13:227:13 | a | semantics.rb:227:9:227:14 | call to s28 : [collection] [element] | provenance | | +| semantics.rb:227:13:227:13 | a | semantics.rb:227:9:227:14 | call to s28 : [collection] [element] | provenance | | +| semantics.rb:228:10:228:10 | x : [collection] [element] | semantics.rb:228:10:228:13 | ...[...] | provenance | | +| semantics.rb:228:10:228:10 | x : [collection] [element] | semantics.rb:228:10:228:13 | ...[...] | provenance | | +| semantics.rb:229:10:229:10 | x : [collection] [element] | semantics.rb:229:10:229:13 | ...[...] | provenance | | +| semantics.rb:229:10:229:10 | x : [collection] [element] | semantics.rb:229:10:229:13 | ...[...] | provenance | | +| semantics.rb:230:10:230:10 | x : [collection] [element] | semantics.rb:230:10:230:13 | ...[...] | provenance | | +| semantics.rb:230:10:230:10 | x : [collection] [element] | semantics.rb:230:10:230:13 | ...[...] | provenance | | +| semantics.rb:231:10:231:10 | x : [collection] [element] | semantics.rb:231:10:231:13 | ...[...] | provenance | | +| semantics.rb:231:10:231:10 | x : [collection] [element] | semantics.rb:231:10:231:13 | ...[...] | provenance | | +| semantics.rb:236:5:236:5 | b | semantics.rb:241:5:241:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:236:5:236:5 | b | semantics.rb:241:5:241:5 | [post] h : [collection] [element 1] | provenance | | | semantics.rb:236:9:236:18 | call to source | semantics.rb:236:5:236:5 | b | provenance | | | semantics.rb:236:9:236:18 | call to source | semantics.rb:236:5:236:5 | b | provenance | | -| semantics.rb:237:5:237:5 | c | semantics.rb:242:5:242:5 | [post] h [element 2] | provenance | | -| semantics.rb:237:5:237:5 | c | semantics.rb:242:5:242:5 | [post] h [element 2] | provenance | | +| semantics.rb:237:5:237:5 | c | semantics.rb:242:5:242:5 | [post] h : [collection] [element 2] | provenance | | +| semantics.rb:237:5:237:5 | c | semantics.rb:242:5:242:5 | [post] h : [collection] [element 2] | provenance | | | semantics.rb:237:9:237:18 | call to source | semantics.rb:237:5:237:5 | c | provenance | | | semantics.rb:237:9:237:18 | call to source | semantics.rb:237:5:237:5 | c | provenance | | -| semantics.rb:241:5:241:5 | [post] h [element 1] | semantics.rb:242:5:242:5 | h [element 1] | provenance | | -| semantics.rb:241:5:241:5 | [post] h [element 1] | semantics.rb:242:5:242:5 | h [element 1] | provenance | | -| semantics.rb:242:5:242:5 | [post] h [element 1] | semantics.rb:245:14:245:14 | h [element 1] | provenance | | -| semantics.rb:242:5:242:5 | [post] h [element 1] | semantics.rb:245:14:245:14 | h [element 1] | provenance | | -| semantics.rb:242:5:242:5 | [post] h [element 2] | semantics.rb:245:14:245:14 | h [element 2] | provenance | | -| semantics.rb:242:5:242:5 | [post] h [element 2] | semantics.rb:245:14:245:14 | h [element 2] | provenance | | -| semantics.rb:242:5:242:5 | h [element 1] | semantics.rb:242:5:242:5 | [post] h [element 1] | provenance | | -| semantics.rb:242:5:242:5 | h [element 1] | semantics.rb:242:5:242:5 | [post] h [element 1] | provenance | | -| semantics.rb:245:14:245:14 | h [element 1] | semantics.rb:245:10:245:15 | call to s29 | provenance | | -| semantics.rb:245:14:245:14 | h [element 1] | semantics.rb:245:10:245:15 | call to s29 | provenance | | -| semantics.rb:245:14:245:14 | h [element 2] | semantics.rb:245:10:245:15 | call to s29 | provenance | | -| semantics.rb:245:14:245:14 | h [element 2] | semantics.rb:245:10:245:15 | call to s29 | provenance | | +| semantics.rb:241:5:241:5 | [post] h : [collection] [element 1] | semantics.rb:242:5:242:5 | h : [collection] [element 1] | provenance | | +| semantics.rb:241:5:241:5 | [post] h : [collection] [element 1] | semantics.rb:242:5:242:5 | h : [collection] [element 1] | provenance | | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 1] | semantics.rb:245:14:245:14 | h : [collection] [element 1] | provenance | | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 1] | semantics.rb:245:14:245:14 | h : [collection] [element 1] | provenance | | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 2] | semantics.rb:245:14:245:14 | h : [collection] [element 2] | provenance | | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 2] | semantics.rb:245:14:245:14 | h : [collection] [element 2] | provenance | | +| semantics.rb:242:5:242:5 | h : [collection] [element 1] | semantics.rb:242:5:242:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:242:5:242:5 | h : [collection] [element 1] | semantics.rb:242:5:242:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:245:14:245:14 | h : [collection] [element 1] | semantics.rb:245:10:245:15 | call to s29 | provenance | | +| semantics.rb:245:14:245:14 | h : [collection] [element 1] | semantics.rb:245:10:245:15 | call to s29 | provenance | | +| semantics.rb:245:14:245:14 | h : [collection] [element 2] | semantics.rb:245:10:245:15 | call to s29 | provenance | | +| semantics.rb:245:14:245:14 | h : [collection] [element 2] | semantics.rb:245:10:245:15 | call to s29 | provenance | | | semantics.rb:249:5:249:5 | a | semantics.rb:250:13:250:13 | a | provenance | | | semantics.rb:249:5:249:5 | a | semantics.rb:250:13:250:13 | a | provenance | | | semantics.rb:249:9:249:18 | call to source | semantics.rb:249:5:249:5 | a | provenance | | | semantics.rb:249:9:249:18 | call to source | semantics.rb:249:5:249:5 | a | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:251:10:251:10 | x [element] | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:251:10:251:10 | x [element] | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:252:10:252:10 | x [element] | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:252:10:252:10 | x [element] | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:253:10:253:10 | x [element] | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:253:10:253:10 | x [element] | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:254:10:254:10 | x [element] | provenance | | -| semantics.rb:250:5:250:5 | x [element] | semantics.rb:254:10:254:10 | x [element] | provenance | | -| semantics.rb:250:9:250:14 | call to s30 [element] | semantics.rb:250:5:250:5 | x [element] | provenance | | -| semantics.rb:250:9:250:14 | call to s30 [element] | semantics.rb:250:5:250:5 | x [element] | provenance | | -| semantics.rb:250:13:250:13 | a | semantics.rb:250:9:250:14 | call to s30 [element] | provenance | | -| semantics.rb:250:13:250:13 | a | semantics.rb:250:9:250:14 | call to s30 [element] | provenance | | -| semantics.rb:251:10:251:10 | x [element] | semantics.rb:251:10:251:13 | ...[...] | provenance | | -| semantics.rb:251:10:251:10 | x [element] | semantics.rb:251:10:251:13 | ...[...] | provenance | | -| semantics.rb:252:10:252:10 | x [element] | semantics.rb:252:10:252:13 | ...[...] | provenance | | -| semantics.rb:252:10:252:10 | x [element] | semantics.rb:252:10:252:13 | ...[...] | provenance | | -| semantics.rb:253:10:253:10 | x [element] | semantics.rb:253:10:253:13 | ...[...] | provenance | | -| semantics.rb:253:10:253:10 | x [element] | semantics.rb:253:10:253:13 | ...[...] | provenance | | -| semantics.rb:254:10:254:10 | x [element] | semantics.rb:254:10:254:13 | ...[...] | provenance | | -| semantics.rb:254:10:254:10 | x [element] | semantics.rb:254:10:254:13 | ...[...] | provenance | | -| semantics.rb:258:5:258:5 | [post] h [element :foo] | semantics.rb:259:5:259:5 | h [element :foo] | provenance | | -| semantics.rb:258:5:258:5 | [post] h [element :foo] | semantics.rb:259:5:259:5 | h [element :foo] | provenance | | -| semantics.rb:258:15:258:25 | call to source | semantics.rb:258:5:258:5 | [post] h [element :foo] | provenance | | -| semantics.rb:258:15:258:25 | call to source | semantics.rb:258:5:258:5 | [post] h [element :foo] | provenance | | -| semantics.rb:259:5:259:5 | [post] h [element :foo] | semantics.rb:260:5:260:5 | h [element :foo] | provenance | | -| semantics.rb:259:5:259:5 | [post] h [element :foo] | semantics.rb:260:5:260:5 | h [element :foo] | provenance | | -| semantics.rb:259:5:259:5 | h [element :foo] | semantics.rb:259:5:259:5 | [post] h [element :foo] | provenance | | -| semantics.rb:259:5:259:5 | h [element :foo] | semantics.rb:259:5:259:5 | [post] h [element :foo] | provenance | | -| semantics.rb:260:5:260:5 | [post] h [element :foo] | semantics.rb:263:14:263:14 | h [element :foo] | provenance | | -| semantics.rb:260:5:260:5 | [post] h [element :foo] | semantics.rb:263:14:263:14 | h [element :foo] | provenance | | -| semantics.rb:260:5:260:5 | h [element :foo] | semantics.rb:260:5:260:5 | [post] h [element :foo] | provenance | | -| semantics.rb:260:5:260:5 | h [element :foo] | semantics.rb:260:5:260:5 | [post] h [element :foo] | provenance | | -| semantics.rb:261:5:261:5 | [post] h [element] | semantics.rb:263:14:263:14 | h [element] | provenance | | -| semantics.rb:261:5:261:5 | [post] h [element] | semantics.rb:263:14:263:14 | h [element] | provenance | | -| semantics.rb:261:12:261:22 | call to source | semantics.rb:261:5:261:5 | [post] h [element] | provenance | | -| semantics.rb:261:12:261:22 | call to source | semantics.rb:261:5:261:5 | [post] h [element] | provenance | | -| semantics.rb:263:14:263:14 | h [element :foo] | semantics.rb:263:10:263:15 | call to s31 | provenance | | -| semantics.rb:263:14:263:14 | h [element :foo] | semantics.rb:263:10:263:15 | call to s31 | provenance | | -| semantics.rb:263:14:263:14 | h [element] | semantics.rb:263:10:263:15 | call to s31 | provenance | | -| semantics.rb:263:14:263:14 | h [element] | semantics.rb:263:10:263:15 | call to s31 | provenance | | -| semantics.rb:267:5:267:5 | [post] h [element :foo] | semantics.rb:268:5:268:5 | h [element :foo] | provenance | | -| semantics.rb:267:5:267:5 | [post] h [element :foo] | semantics.rb:268:5:268:5 | h [element :foo] | provenance | | -| semantics.rb:267:15:267:25 | call to source | semantics.rb:267:5:267:5 | [post] h [element :foo] | provenance | | -| semantics.rb:267:15:267:25 | call to source | semantics.rb:267:5:267:5 | [post] h [element :foo] | provenance | | -| semantics.rb:268:5:268:5 | [post] h [element :foo] | semantics.rb:269:5:269:5 | h [element :foo] | provenance | | -| semantics.rb:268:5:268:5 | [post] h [element :foo] | semantics.rb:269:5:269:5 | h [element :foo] | provenance | | -| semantics.rb:268:5:268:5 | [post] h [element foo] | semantics.rb:269:5:269:5 | h [element foo] | provenance | | -| semantics.rb:268:5:268:5 | [post] h [element foo] | semantics.rb:269:5:269:5 | h [element foo] | provenance | | -| semantics.rb:268:5:268:5 | h [element :foo] | semantics.rb:268:5:268:5 | [post] h [element :foo] | provenance | | -| semantics.rb:268:5:268:5 | h [element :foo] | semantics.rb:268:5:268:5 | [post] h [element :foo] | provenance | | -| semantics.rb:268:16:268:26 | call to source | semantics.rb:268:5:268:5 | [post] h [element foo] | provenance | | -| semantics.rb:268:16:268:26 | call to source | semantics.rb:268:5:268:5 | [post] h [element foo] | provenance | | -| semantics.rb:269:5:269:5 | [post] h [element :foo] | semantics.rb:270:5:270:5 | h [element :foo] | provenance | | -| semantics.rb:269:5:269:5 | [post] h [element :foo] | semantics.rb:270:5:270:5 | h [element :foo] | provenance | | -| semantics.rb:269:5:269:5 | [post] h [element foo] | semantics.rb:270:5:270:5 | h [element foo] | provenance | | -| semantics.rb:269:5:269:5 | [post] h [element foo] | semantics.rb:270:5:270:5 | h [element foo] | provenance | | -| semantics.rb:269:5:269:5 | h [element :foo] | semantics.rb:269:5:269:5 | [post] h [element :foo] | provenance | | -| semantics.rb:269:5:269:5 | h [element :foo] | semantics.rb:269:5:269:5 | [post] h [element :foo] | provenance | | -| semantics.rb:269:5:269:5 | h [element foo] | semantics.rb:269:5:269:5 | [post] h [element foo] | provenance | | -| semantics.rb:269:5:269:5 | h [element foo] | semantics.rb:269:5:269:5 | [post] h [element foo] | provenance | | -| semantics.rb:270:5:270:5 | [post] h [element :foo] | semantics.rb:273:14:273:14 | h [element :foo] | provenance | | -| semantics.rb:270:5:270:5 | [post] h [element :foo] | semantics.rb:273:14:273:14 | h [element :foo] | provenance | | -| semantics.rb:270:5:270:5 | [post] h [element foo] | semantics.rb:273:14:273:14 | h [element foo] | provenance | | -| semantics.rb:270:5:270:5 | [post] h [element foo] | semantics.rb:273:14:273:14 | h [element foo] | provenance | | -| semantics.rb:270:5:270:5 | h [element :foo] | semantics.rb:270:5:270:5 | [post] h [element :foo] | provenance | | -| semantics.rb:270:5:270:5 | h [element :foo] | semantics.rb:270:5:270:5 | [post] h [element :foo] | provenance | | -| semantics.rb:270:5:270:5 | h [element foo] | semantics.rb:270:5:270:5 | [post] h [element foo] | provenance | | -| semantics.rb:270:5:270:5 | h [element foo] | semantics.rb:270:5:270:5 | [post] h [element foo] | provenance | | -| semantics.rb:271:5:271:5 | [post] h [element] | semantics.rb:273:14:273:14 | h [element] | provenance | | -| semantics.rb:271:5:271:5 | [post] h [element] | semantics.rb:273:14:273:14 | h [element] | provenance | | -| semantics.rb:271:12:271:22 | call to source | semantics.rb:271:5:271:5 | [post] h [element] | provenance | | -| semantics.rb:271:12:271:22 | call to source | semantics.rb:271:5:271:5 | [post] h [element] | provenance | | -| semantics.rb:273:14:273:14 | h [element :foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | -| semantics.rb:273:14:273:14 | h [element :foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | -| semantics.rb:273:14:273:14 | h [element foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | -| semantics.rb:273:14:273:14 | h [element foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | -| semantics.rb:273:14:273:14 | h [element] | semantics.rb:273:10:273:15 | call to s32 | provenance | | -| semantics.rb:273:14:273:14 | h [element] | semantics.rb:273:10:273:15 | call to s32 | provenance | | -| semantics.rb:281:5:281:5 | [post] h [element] | semantics.rb:282:5:282:5 | h [element] | provenance | | -| semantics.rb:281:5:281:5 | [post] h [element] | semantics.rb:282:5:282:5 | h [element] | provenance | | -| semantics.rb:281:12:281:22 | call to source | semantics.rb:281:5:281:5 | [post] h [element] | provenance | | -| semantics.rb:281:12:281:22 | call to source | semantics.rb:281:5:281:5 | [post] h [element] | provenance | | -| semantics.rb:282:5:282:5 | [post] h [element nil] | semantics.rb:283:5:283:5 | h [element nil] | provenance | | -| semantics.rb:282:5:282:5 | [post] h [element nil] | semantics.rb:283:5:283:5 | h [element nil] | provenance | | -| semantics.rb:282:5:282:5 | [post] h [element] | semantics.rb:283:5:283:5 | h [element] | provenance | | -| semantics.rb:282:5:282:5 | [post] h [element] | semantics.rb:283:5:283:5 | h [element] | provenance | | -| semantics.rb:282:5:282:5 | h [element] | semantics.rb:282:5:282:5 | [post] h [element] | provenance | | -| semantics.rb:282:5:282:5 | h [element] | semantics.rb:282:5:282:5 | [post] h [element] | provenance | | -| semantics.rb:282:14:282:24 | call to source | semantics.rb:282:5:282:5 | [post] h [element nil] | provenance | | -| semantics.rb:282:14:282:24 | call to source | semantics.rb:282:5:282:5 | [post] h [element nil] | provenance | | -| semantics.rb:283:5:283:5 | [post] h [element nil] | semantics.rb:284:5:284:5 | h [element nil] | provenance | | -| semantics.rb:283:5:283:5 | [post] h [element nil] | semantics.rb:284:5:284:5 | h [element nil] | provenance | | -| semantics.rb:283:5:283:5 | [post] h [element true] | semantics.rb:284:5:284:5 | h [element true] | provenance | | -| semantics.rb:283:5:283:5 | [post] h [element true] | semantics.rb:284:5:284:5 | h [element true] | provenance | | -| semantics.rb:283:5:283:5 | [post] h [element] | semantics.rb:284:5:284:5 | h [element] | provenance | | -| semantics.rb:283:5:283:5 | [post] h [element] | semantics.rb:284:5:284:5 | h [element] | provenance | | -| semantics.rb:283:5:283:5 | h [element nil] | semantics.rb:283:5:283:5 | [post] h [element nil] | provenance | | -| semantics.rb:283:5:283:5 | h [element nil] | semantics.rb:283:5:283:5 | [post] h [element nil] | provenance | | -| semantics.rb:283:5:283:5 | h [element] | semantics.rb:283:5:283:5 | [post] h [element] | provenance | | -| semantics.rb:283:5:283:5 | h [element] | semantics.rb:283:5:283:5 | [post] h [element] | provenance | | -| semantics.rb:283:15:283:25 | call to source | semantics.rb:283:5:283:5 | [post] h [element true] | provenance | | -| semantics.rb:283:15:283:25 | call to source | semantics.rb:283:5:283:5 | [post] h [element true] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element false] | semantics.rb:286:14:286:14 | h [element false] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element false] | semantics.rb:286:14:286:14 | h [element false] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element nil] | semantics.rb:286:14:286:14 | h [element nil] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element nil] | semantics.rb:286:14:286:14 | h [element nil] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element true] | semantics.rb:286:14:286:14 | h [element true] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element true] | semantics.rb:286:14:286:14 | h [element true] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element] | semantics.rb:286:14:286:14 | h [element] | provenance | | -| semantics.rb:284:5:284:5 | [post] h [element] | semantics.rb:286:14:286:14 | h [element] | provenance | | -| semantics.rb:284:5:284:5 | h [element nil] | semantics.rb:284:5:284:5 | [post] h [element nil] | provenance | | -| semantics.rb:284:5:284:5 | h [element nil] | semantics.rb:284:5:284:5 | [post] h [element nil] | provenance | | -| semantics.rb:284:5:284:5 | h [element true] | semantics.rb:284:5:284:5 | [post] h [element true] | provenance | | -| semantics.rb:284:5:284:5 | h [element true] | semantics.rb:284:5:284:5 | [post] h [element true] | provenance | | -| semantics.rb:284:5:284:5 | h [element] | semantics.rb:284:5:284:5 | [post] h [element] | provenance | | -| semantics.rb:284:5:284:5 | h [element] | semantics.rb:284:5:284:5 | [post] h [element] | provenance | | -| semantics.rb:284:16:284:26 | call to source | semantics.rb:284:5:284:5 | [post] h [element false] | provenance | | -| semantics.rb:284:16:284:26 | call to source | semantics.rb:284:5:284:5 | [post] h [element false] | provenance | | -| semantics.rb:286:14:286:14 | h [element false] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:286:14:286:14 | h [element false] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:286:14:286:14 | h [element nil] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:286:14:286:14 | h [element nil] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:286:14:286:14 | h [element true] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:286:14:286:14 | h [element true] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:286:14:286:14 | h [element] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:286:14:286:14 | h [element] | semantics.rb:286:10:286:15 | call to s33 | provenance | | -| semantics.rb:290:5:290:5 | x [element :foo] | semantics.rb:291:10:291:10 | x [element :foo] | provenance | | -| semantics.rb:290:5:290:5 | x [element :foo] | semantics.rb:291:10:291:10 | x [element :foo] | provenance | | -| semantics.rb:290:5:290:5 | x [element :foo] | semantics.rb:293:10:293:10 | x [element :foo] | provenance | | -| semantics.rb:290:5:290:5 | x [element :foo] | semantics.rb:293:10:293:10 | x [element :foo] | provenance | | -| semantics.rb:290:9:290:24 | call to s35 [element :foo] | semantics.rb:290:5:290:5 | x [element :foo] | provenance | | -| semantics.rb:290:9:290:24 | call to s35 [element :foo] | semantics.rb:290:5:290:5 | x [element :foo] | provenance | | -| semantics.rb:290:13:290:23 | call to source | semantics.rb:290:9:290:24 | call to s35 [element :foo] | provenance | | -| semantics.rb:290:13:290:23 | call to source | semantics.rb:290:9:290:24 | call to s35 [element :foo] | provenance | | -| semantics.rb:291:10:291:10 | x [element :foo] | semantics.rb:291:10:291:16 | ...[...] | provenance | | -| semantics.rb:291:10:291:10 | x [element :foo] | semantics.rb:291:10:291:16 | ...[...] | provenance | | -| semantics.rb:293:10:293:10 | x [element :foo] | semantics.rb:293:10:293:13 | ...[...] | provenance | | -| semantics.rb:293:10:293:10 | x [element :foo] | semantics.rb:293:10:293:13 | ...[...] | provenance | | -| semantics.rb:297:5:297:5 | x [element foo] | semantics.rb:298:10:298:10 | x [element foo] | provenance | | -| semantics.rb:297:5:297:5 | x [element foo] | semantics.rb:298:10:298:10 | x [element foo] | provenance | | -| semantics.rb:297:5:297:5 | x [element foo] | semantics.rb:299:10:299:10 | x [element foo] | provenance | | -| semantics.rb:297:5:297:5 | x [element foo] | semantics.rb:299:10:299:10 | x [element foo] | provenance | | -| semantics.rb:297:5:297:5 | x [element foo] | semantics.rb:301:10:301:10 | x [element foo] | provenance | | -| semantics.rb:297:5:297:5 | x [element foo] | semantics.rb:301:10:301:10 | x [element foo] | provenance | | -| semantics.rb:297:9:297:24 | call to s36 [element foo] | semantics.rb:297:5:297:5 | x [element foo] | provenance | | -| semantics.rb:297:9:297:24 | call to s36 [element foo] | semantics.rb:297:5:297:5 | x [element foo] | provenance | | -| semantics.rb:297:13:297:23 | call to source | semantics.rb:297:9:297:24 | call to s36 [element foo] | provenance | | -| semantics.rb:297:13:297:23 | call to source | semantics.rb:297:9:297:24 | call to s36 [element foo] | provenance | | -| semantics.rb:298:10:298:10 | x [element foo] | semantics.rb:298:10:298:16 | ...[...] | provenance | | -| semantics.rb:298:10:298:10 | x [element foo] | semantics.rb:298:10:298:16 | ...[...] | provenance | | -| semantics.rb:299:10:299:10 | x [element foo] | semantics.rb:299:10:299:17 | ...[...] | provenance | | -| semantics.rb:299:10:299:10 | x [element foo] | semantics.rb:299:10:299:17 | ...[...] | provenance | | -| semantics.rb:301:10:301:10 | x [element foo] | semantics.rb:301:10:301:13 | ...[...] | provenance | | -| semantics.rb:301:10:301:10 | x [element foo] | semantics.rb:301:10:301:13 | ...[...] | provenance | | -| semantics.rb:305:5:305:5 | x [element true] | semantics.rb:307:10:307:10 | x [element true] | provenance | | -| semantics.rb:305:5:305:5 | x [element true] | semantics.rb:307:10:307:10 | x [element true] | provenance | | -| semantics.rb:305:5:305:5 | x [element true] | semantics.rb:309:10:309:10 | x [element true] | provenance | | -| semantics.rb:305:5:305:5 | x [element true] | semantics.rb:309:10:309:10 | x [element true] | provenance | | -| semantics.rb:305:9:305:24 | call to s37 [element true] | semantics.rb:305:5:305:5 | x [element true] | provenance | | -| semantics.rb:305:9:305:24 | call to s37 [element true] | semantics.rb:305:5:305:5 | x [element true] | provenance | | -| semantics.rb:305:13:305:23 | call to source | semantics.rb:305:9:305:24 | call to s37 [element true] | provenance | | -| semantics.rb:305:13:305:23 | call to source | semantics.rb:305:9:305:24 | call to s37 [element true] | provenance | | -| semantics.rb:307:10:307:10 | x [element true] | semantics.rb:307:10:307:16 | ...[...] | provenance | | -| semantics.rb:307:10:307:10 | x [element true] | semantics.rb:307:10:307:16 | ...[...] | provenance | | -| semantics.rb:309:10:309:10 | x [element true] | semantics.rb:309:10:309:13 | ...[...] | provenance | | -| semantics.rb:309:10:309:10 | x [element true] | semantics.rb:309:10:309:13 | ...[...] | provenance | | -| semantics.rb:313:5:313:5 | [post] h [element foo] | semantics.rb:316:14:316:14 | h [element foo] | provenance | | -| semantics.rb:313:5:313:5 | [post] h [element foo] | semantics.rb:316:14:316:14 | h [element foo] | provenance | | -| semantics.rb:313:16:313:26 | call to source | semantics.rb:313:5:313:5 | [post] h [element foo] | provenance | | -| semantics.rb:313:16:313:26 | call to source | semantics.rb:313:5:313:5 | [post] h [element foo] | provenance | | -| semantics.rb:316:14:316:14 | h [element foo] | semantics.rb:316:10:316:15 | call to s38 | provenance | | -| semantics.rb:316:14:316:14 | h [element foo] | semantics.rb:316:10:316:15 | call to s38 | provenance | | -| semantics.rb:320:5:320:5 | x [element :foo] | semantics.rb:322:10:322:10 | x [element :foo] | provenance | | -| semantics.rb:320:5:320:5 | x [element :foo] | semantics.rb:322:10:322:10 | x [element :foo] | provenance | | -| semantics.rb:320:5:320:5 | x [element :foo] | semantics.rb:323:10:323:10 | x [element :foo] | provenance | | -| semantics.rb:320:5:320:5 | x [element :foo] | semantics.rb:323:10:323:10 | x [element :foo] | provenance | | -| semantics.rb:320:9:320:24 | call to s39 [element :foo] | semantics.rb:320:5:320:5 | x [element :foo] | provenance | | -| semantics.rb:320:9:320:24 | call to s39 [element :foo] | semantics.rb:320:5:320:5 | x [element :foo] | provenance | | -| semantics.rb:320:13:320:23 | call to source | semantics.rb:320:9:320:24 | call to s39 [element :foo] | provenance | | -| semantics.rb:320:13:320:23 | call to source | semantics.rb:320:9:320:24 | call to s39 [element :foo] | provenance | | -| semantics.rb:322:10:322:10 | x [element :foo] | semantics.rb:322:10:322:16 | ...[...] | provenance | | -| semantics.rb:322:10:322:10 | x [element :foo] | semantics.rb:322:10:322:16 | ...[...] | provenance | | -| semantics.rb:323:10:323:10 | x [element :foo] | semantics.rb:323:10:323:13 | ...[...] | provenance | | -| semantics.rb:323:10:323:10 | x [element :foo] | semantics.rb:323:10:323:13 | ...[...] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:251:10:251:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:251:10:251:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:252:10:252:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:252:10:252:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:253:10:253:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:253:10:253:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:254:10:254:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semantics.rb:254:10:254:10 | x : [collection] [element] | provenance | | +| semantics.rb:250:9:250:14 | call to s30 : [collection] [element] | semantics.rb:250:5:250:5 | x : [collection] [element] | provenance | | +| semantics.rb:250:9:250:14 | call to s30 : [collection] [element] | semantics.rb:250:5:250:5 | x : [collection] [element] | provenance | | +| semantics.rb:250:13:250:13 | a | semantics.rb:250:9:250:14 | call to s30 : [collection] [element] | provenance | | +| semantics.rb:250:13:250:13 | a | semantics.rb:250:9:250:14 | call to s30 : [collection] [element] | provenance | | +| semantics.rb:251:10:251:10 | x : [collection] [element] | semantics.rb:251:10:251:13 | ...[...] | provenance | | +| semantics.rb:251:10:251:10 | x : [collection] [element] | semantics.rb:251:10:251:13 | ...[...] | provenance | | +| semantics.rb:252:10:252:10 | x : [collection] [element] | semantics.rb:252:10:252:13 | ...[...] | provenance | | +| semantics.rb:252:10:252:10 | x : [collection] [element] | semantics.rb:252:10:252:13 | ...[...] | provenance | | +| semantics.rb:253:10:253:10 | x : [collection] [element] | semantics.rb:253:10:253:13 | ...[...] | provenance | | +| semantics.rb:253:10:253:10 | x : [collection] [element] | semantics.rb:253:10:253:13 | ...[...] | provenance | | +| semantics.rb:254:10:254:10 | x : [collection] [element] | semantics.rb:254:10:254:13 | ...[...] | provenance | | +| semantics.rb:254:10:254:10 | x : [collection] [element] | semantics.rb:254:10:254:13 | ...[...] | provenance | | +| semantics.rb:258:5:258:5 | [post] h : [collection] [element :foo] | semantics.rb:259:5:259:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:258:5:258:5 | [post] h : [collection] [element :foo] | semantics.rb:259:5:259:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:258:15:258:25 | call to source | semantics.rb:258:5:258:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:258:15:258:25 | call to source | semantics.rb:258:5:258:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:259:5:259:5 | [post] h : [collection] [element :foo] | semantics.rb:260:5:260:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:259:5:259:5 | [post] h : [collection] [element :foo] | semantics.rb:260:5:260:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:259:5:259:5 | h : [collection] [element :foo] | semantics.rb:259:5:259:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:259:5:259:5 | h : [collection] [element :foo] | semantics.rb:259:5:259:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:260:5:260:5 | [post] h : [collection] [element :foo] | semantics.rb:263:14:263:14 | h : [collection] [element :foo] | provenance | | +| semantics.rb:260:5:260:5 | [post] h : [collection] [element :foo] | semantics.rb:263:14:263:14 | h : [collection] [element :foo] | provenance | | +| semantics.rb:260:5:260:5 | h : [collection] [element :foo] | semantics.rb:260:5:260:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:260:5:260:5 | h : [collection] [element :foo] | semantics.rb:260:5:260:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:261:5:261:5 | [post] h : [collection] [element] | semantics.rb:263:14:263:14 | h : [collection] [element] | provenance | | +| semantics.rb:261:5:261:5 | [post] h : [collection] [element] | semantics.rb:263:14:263:14 | h : [collection] [element] | provenance | | +| semantics.rb:261:12:261:22 | call to source | semantics.rb:261:5:261:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:261:12:261:22 | call to source | semantics.rb:261:5:261:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:263:14:263:14 | h : [collection] [element :foo] | semantics.rb:263:10:263:15 | call to s31 | provenance | | +| semantics.rb:263:14:263:14 | h : [collection] [element :foo] | semantics.rb:263:10:263:15 | call to s31 | provenance | | +| semantics.rb:263:14:263:14 | h : [collection] [element] | semantics.rb:263:10:263:15 | call to s31 | provenance | | +| semantics.rb:263:14:263:14 | h : [collection] [element] | semantics.rb:263:10:263:15 | call to s31 | provenance | | +| semantics.rb:267:5:267:5 | [post] h : [collection] [element :foo] | semantics.rb:268:5:268:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:267:5:267:5 | [post] h : [collection] [element :foo] | semantics.rb:268:5:268:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:267:15:267:25 | call to source | semantics.rb:267:5:267:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:267:15:267:25 | call to source | semantics.rb:267:5:267:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element :foo] | semantics.rb:269:5:269:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element :foo] | semantics.rb:269:5:269:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element foo] | semantics.rb:269:5:269:5 | h : [collection] [element foo] | provenance | | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element foo] | semantics.rb:269:5:269:5 | h : [collection] [element foo] | provenance | | +| semantics.rb:268:5:268:5 | h : [collection] [element :foo] | semantics.rb:268:5:268:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:268:5:268:5 | h : [collection] [element :foo] | semantics.rb:268:5:268:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:268:16:268:26 | call to source | semantics.rb:268:5:268:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:268:16:268:26 | call to source | semantics.rb:268:5:268:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element :foo] | semantics.rb:270:5:270:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element :foo] | semantics.rb:270:5:270:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element foo] | semantics.rb:270:5:270:5 | h : [collection] [element foo] | provenance | | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element foo] | semantics.rb:270:5:270:5 | h : [collection] [element foo] | provenance | | +| semantics.rb:269:5:269:5 | h : [collection] [element :foo] | semantics.rb:269:5:269:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:269:5:269:5 | h : [collection] [element :foo] | semantics.rb:269:5:269:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:269:5:269:5 | h : [collection] [element foo] | semantics.rb:269:5:269:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:269:5:269:5 | h : [collection] [element foo] | semantics.rb:269:5:269:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element :foo] | semantics.rb:273:14:273:14 | h : [collection] [element :foo] | provenance | | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element :foo] | semantics.rb:273:14:273:14 | h : [collection] [element :foo] | provenance | | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element foo] | semantics.rb:273:14:273:14 | h : [collection] [element foo] | provenance | | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element foo] | semantics.rb:273:14:273:14 | h : [collection] [element foo] | provenance | | +| semantics.rb:270:5:270:5 | h : [collection] [element :foo] | semantics.rb:270:5:270:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:270:5:270:5 | h : [collection] [element :foo] | semantics.rb:270:5:270:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:270:5:270:5 | h : [collection] [element foo] | semantics.rb:270:5:270:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:270:5:270:5 | h : [collection] [element foo] | semantics.rb:270:5:270:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:271:5:271:5 | [post] h : [collection] [element] | semantics.rb:273:14:273:14 | h : [collection] [element] | provenance | | +| semantics.rb:271:5:271:5 | [post] h : [collection] [element] | semantics.rb:273:14:273:14 | h : [collection] [element] | provenance | | +| semantics.rb:271:12:271:22 | call to source | semantics.rb:271:5:271:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:271:12:271:22 | call to source | semantics.rb:271:5:271:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:273:14:273:14 | h : [collection] [element :foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | +| semantics.rb:273:14:273:14 | h : [collection] [element :foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | +| semantics.rb:273:14:273:14 | h : [collection] [element foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | +| semantics.rb:273:14:273:14 | h : [collection] [element foo] | semantics.rb:273:10:273:15 | call to s32 | provenance | | +| semantics.rb:273:14:273:14 | h : [collection] [element] | semantics.rb:273:10:273:15 | call to s32 | provenance | | +| semantics.rb:273:14:273:14 | h : [collection] [element] | semantics.rb:273:10:273:15 | call to s32 | provenance | | +| semantics.rb:281:5:281:5 | [post] h : [collection] [element] | semantics.rb:282:5:282:5 | h : [collection] [element] | provenance | | +| semantics.rb:281:5:281:5 | [post] h : [collection] [element] | semantics.rb:282:5:282:5 | h : [collection] [element] | provenance | | +| semantics.rb:281:12:281:22 | call to source | semantics.rb:281:5:281:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:281:12:281:22 | call to source | semantics.rb:281:5:281:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element nil] | semantics.rb:283:5:283:5 | h : [collection] [element nil] | provenance | | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element nil] | semantics.rb:283:5:283:5 | h : [collection] [element nil] | provenance | | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element] | semantics.rb:283:5:283:5 | h : [collection] [element] | provenance | | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element] | semantics.rb:283:5:283:5 | h : [collection] [element] | provenance | | +| semantics.rb:282:5:282:5 | h : [collection] [element] | semantics.rb:282:5:282:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:282:5:282:5 | h : [collection] [element] | semantics.rb:282:5:282:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:282:14:282:24 | call to source | semantics.rb:282:5:282:5 | [post] h : [collection] [element nil] | provenance | | +| semantics.rb:282:14:282:24 | call to source | semantics.rb:282:5:282:5 | [post] h : [collection] [element nil] | provenance | | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element nil] | semantics.rb:284:5:284:5 | h : [collection] [element nil] | provenance | | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element nil] | semantics.rb:284:5:284:5 | h : [collection] [element nil] | provenance | | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element true] | semantics.rb:284:5:284:5 | h : [collection] [element true] | provenance | | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element true] | semantics.rb:284:5:284:5 | h : [collection] [element true] | provenance | | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element] | semantics.rb:284:5:284:5 | h : [collection] [element] | provenance | | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element] | semantics.rb:284:5:284:5 | h : [collection] [element] | provenance | | +| semantics.rb:283:5:283:5 | h : [collection] [element nil] | semantics.rb:283:5:283:5 | [post] h : [collection] [element nil] | provenance | | +| semantics.rb:283:5:283:5 | h : [collection] [element nil] | semantics.rb:283:5:283:5 | [post] h : [collection] [element nil] | provenance | | +| semantics.rb:283:5:283:5 | h : [collection] [element] | semantics.rb:283:5:283:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:283:5:283:5 | h : [collection] [element] | semantics.rb:283:5:283:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:283:15:283:25 | call to source | semantics.rb:283:5:283:5 | [post] h : [collection] [element true] | provenance | | +| semantics.rb:283:15:283:25 | call to source | semantics.rb:283:5:283:5 | [post] h : [collection] [element true] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element false] | semantics.rb:286:14:286:14 | h : [collection] [element false] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element false] | semantics.rb:286:14:286:14 | h : [collection] [element false] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element nil] | semantics.rb:286:14:286:14 | h : [collection] [element nil] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element nil] | semantics.rb:286:14:286:14 | h : [collection] [element nil] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element true] | semantics.rb:286:14:286:14 | h : [collection] [element true] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element true] | semantics.rb:286:14:286:14 | h : [collection] [element true] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element] | semantics.rb:286:14:286:14 | h : [collection] [element] | provenance | | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element] | semantics.rb:286:14:286:14 | h : [collection] [element] | provenance | | +| semantics.rb:284:5:284:5 | h : [collection] [element nil] | semantics.rb:284:5:284:5 | [post] h : [collection] [element nil] | provenance | | +| semantics.rb:284:5:284:5 | h : [collection] [element nil] | semantics.rb:284:5:284:5 | [post] h : [collection] [element nil] | provenance | | +| semantics.rb:284:5:284:5 | h : [collection] [element true] | semantics.rb:284:5:284:5 | [post] h : [collection] [element true] | provenance | | +| semantics.rb:284:5:284:5 | h : [collection] [element true] | semantics.rb:284:5:284:5 | [post] h : [collection] [element true] | provenance | | +| semantics.rb:284:5:284:5 | h : [collection] [element] | semantics.rb:284:5:284:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:284:5:284:5 | h : [collection] [element] | semantics.rb:284:5:284:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:284:16:284:26 | call to source | semantics.rb:284:5:284:5 | [post] h : [collection] [element false] | provenance | | +| semantics.rb:284:16:284:26 | call to source | semantics.rb:284:5:284:5 | [post] h : [collection] [element false] | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element false] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element false] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element nil] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element nil] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element true] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element true] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:286:14:286:14 | h : [collection] [element] | semantics.rb:286:10:286:15 | call to s33 | provenance | | +| semantics.rb:290:5:290:5 | x : [collection] [element :foo] | semantics.rb:291:10:291:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:290:5:290:5 | x : [collection] [element :foo] | semantics.rb:291:10:291:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:290:5:290:5 | x : [collection] [element :foo] | semantics.rb:293:10:293:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:290:5:290:5 | x : [collection] [element :foo] | semantics.rb:293:10:293:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:290:9:290:24 | call to s35 : [collection] [element :foo] | semantics.rb:290:5:290:5 | x : [collection] [element :foo] | provenance | | +| semantics.rb:290:9:290:24 | call to s35 : [collection] [element :foo] | semantics.rb:290:5:290:5 | x : [collection] [element :foo] | provenance | | +| semantics.rb:290:13:290:23 | call to source | semantics.rb:290:9:290:24 | call to s35 : [collection] [element :foo] | provenance | | +| semantics.rb:290:13:290:23 | call to source | semantics.rb:290:9:290:24 | call to s35 : [collection] [element :foo] | provenance | | +| semantics.rb:291:10:291:10 | x : [collection] [element :foo] | semantics.rb:291:10:291:16 | ...[...] | provenance | | +| semantics.rb:291:10:291:10 | x : [collection] [element :foo] | semantics.rb:291:10:291:16 | ...[...] | provenance | | +| semantics.rb:293:10:293:10 | x : [collection] [element :foo] | semantics.rb:293:10:293:13 | ...[...] | provenance | | +| semantics.rb:293:10:293:10 | x : [collection] [element :foo] | semantics.rb:293:10:293:13 | ...[...] | provenance | | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semantics.rb:298:10:298:10 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semantics.rb:298:10:298:10 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semantics.rb:299:10:299:10 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semantics.rb:299:10:299:10 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semantics.rb:301:10:301:10 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semantics.rb:301:10:301:10 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:9:297:24 | call to s36 : [collection] [element foo] | semantics.rb:297:5:297:5 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:9:297:24 | call to s36 : [collection] [element foo] | semantics.rb:297:5:297:5 | x : [collection] [element foo] | provenance | | +| semantics.rb:297:13:297:23 | call to source | semantics.rb:297:9:297:24 | call to s36 : [collection] [element foo] | provenance | | +| semantics.rb:297:13:297:23 | call to source | semantics.rb:297:9:297:24 | call to s36 : [collection] [element foo] | provenance | | +| semantics.rb:298:10:298:10 | x : [collection] [element foo] | semantics.rb:298:10:298:16 | ...[...] | provenance | | +| semantics.rb:298:10:298:10 | x : [collection] [element foo] | semantics.rb:298:10:298:16 | ...[...] | provenance | | +| semantics.rb:299:10:299:10 | x : [collection] [element foo] | semantics.rb:299:10:299:17 | ...[...] | provenance | | +| semantics.rb:299:10:299:10 | x : [collection] [element foo] | semantics.rb:299:10:299:17 | ...[...] | provenance | | +| semantics.rb:301:10:301:10 | x : [collection] [element foo] | semantics.rb:301:10:301:13 | ...[...] | provenance | | +| semantics.rb:301:10:301:10 | x : [collection] [element foo] | semantics.rb:301:10:301:13 | ...[...] | provenance | | +| semantics.rb:305:5:305:5 | x : [collection] [element true] | semantics.rb:307:10:307:10 | x : [collection] [element true] | provenance | | +| semantics.rb:305:5:305:5 | x : [collection] [element true] | semantics.rb:307:10:307:10 | x : [collection] [element true] | provenance | | +| semantics.rb:305:5:305:5 | x : [collection] [element true] | semantics.rb:309:10:309:10 | x : [collection] [element true] | provenance | | +| semantics.rb:305:5:305:5 | x : [collection] [element true] | semantics.rb:309:10:309:10 | x : [collection] [element true] | provenance | | +| semantics.rb:305:9:305:24 | call to s37 : [collection] [element true] | semantics.rb:305:5:305:5 | x : [collection] [element true] | provenance | | +| semantics.rb:305:9:305:24 | call to s37 : [collection] [element true] | semantics.rb:305:5:305:5 | x : [collection] [element true] | provenance | | +| semantics.rb:305:13:305:23 | call to source | semantics.rb:305:9:305:24 | call to s37 : [collection] [element true] | provenance | | +| semantics.rb:305:13:305:23 | call to source | semantics.rb:305:9:305:24 | call to s37 : [collection] [element true] | provenance | | +| semantics.rb:307:10:307:10 | x : [collection] [element true] | semantics.rb:307:10:307:16 | ...[...] | provenance | | +| semantics.rb:307:10:307:10 | x : [collection] [element true] | semantics.rb:307:10:307:16 | ...[...] | provenance | | +| semantics.rb:309:10:309:10 | x : [collection] [element true] | semantics.rb:309:10:309:13 | ...[...] | provenance | | +| semantics.rb:309:10:309:10 | x : [collection] [element true] | semantics.rb:309:10:309:13 | ...[...] | provenance | | +| semantics.rb:313:5:313:5 | [post] h : [collection] [element foo] | semantics.rb:316:14:316:14 | h : [collection] [element foo] | provenance | | +| semantics.rb:313:5:313:5 | [post] h : [collection] [element foo] | semantics.rb:316:14:316:14 | h : [collection] [element foo] | provenance | | +| semantics.rb:313:16:313:26 | call to source | semantics.rb:313:5:313:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:313:16:313:26 | call to source | semantics.rb:313:5:313:5 | [post] h : [collection] [element foo] | provenance | | +| semantics.rb:316:14:316:14 | h : [collection] [element foo] | semantics.rb:316:10:316:15 | call to s38 | provenance | | +| semantics.rb:316:14:316:14 | h : [collection] [element foo] | semantics.rb:316:10:316:15 | call to s38 | provenance | | +| semantics.rb:320:5:320:5 | x : [collection] [element :foo] | semantics.rb:322:10:322:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:320:5:320:5 | x : [collection] [element :foo] | semantics.rb:322:10:322:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:320:5:320:5 | x : [collection] [element :foo] | semantics.rb:323:10:323:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:320:5:320:5 | x : [collection] [element :foo] | semantics.rb:323:10:323:10 | x : [collection] [element :foo] | provenance | | +| semantics.rb:320:9:320:24 | call to s39 : [collection] [element :foo] | semantics.rb:320:5:320:5 | x : [collection] [element :foo] | provenance | | +| semantics.rb:320:9:320:24 | call to s39 : [collection] [element :foo] | semantics.rb:320:5:320:5 | x : [collection] [element :foo] | provenance | | +| semantics.rb:320:13:320:23 | call to source | semantics.rb:320:9:320:24 | call to s39 : [collection] [element :foo] | provenance | | +| semantics.rb:320:13:320:23 | call to source | semantics.rb:320:9:320:24 | call to s39 : [collection] [element :foo] | provenance | | +| semantics.rb:322:10:322:10 | x : [collection] [element :foo] | semantics.rb:322:10:322:16 | ...[...] | provenance | | +| semantics.rb:322:10:322:10 | x : [collection] [element :foo] | semantics.rb:322:10:322:16 | ...[...] | provenance | | +| semantics.rb:323:10:323:10 | x : [collection] [element :foo] | semantics.rb:323:10:323:13 | ...[...] | provenance | | +| semantics.rb:323:10:323:10 | x : [collection] [element :foo] | semantics.rb:323:10:323:13 | ...[...] | provenance | | | semantics.rb:328:5:328:5 | [post] x [@foo] | semantics.rb:330:14:330:14 | x [@foo] | provenance | | | semantics.rb:328:5:328:5 | [post] x [@foo] | semantics.rb:330:14:330:14 | x [@foo] | provenance | | | semantics.rb:328:13:328:23 | call to source | semantics.rb:328:5:328:5 | [post] x [@foo] | provenance | | @@ -616,500 +616,500 @@ edges | semantics.rb:334:13:334:23 | call to source | semantics.rb:334:9:334:24 | call to s41 [@foo] | provenance | | | semantics.rb:335:10:335:10 | x [@foo] | semantics.rb:335:10:335:14 | call to foo | provenance | | | semantics.rb:335:10:335:10 | x [@foo] | semantics.rb:335:10:335:14 | call to foo | provenance | | -| semantics.rb:340:5:340:5 | [post] h [element 0] | semantics.rb:343:13:343:13 | h [element 0] | provenance | | -| semantics.rb:340:5:340:5 | [post] h [element 0] | semantics.rb:343:13:343:13 | h [element 0] | provenance | | -| semantics.rb:340:12:340:22 | call to source | semantics.rb:340:5:340:5 | [post] h [element 0] | provenance | | -| semantics.rb:340:12:340:22 | call to source | semantics.rb:340:5:340:5 | [post] h [element 0] | provenance | | -| semantics.rb:341:5:341:5 | [post] h [element] | semantics.rb:343:13:343:13 | h [element] | provenance | | -| semantics.rb:341:5:341:5 | [post] h [element] | semantics.rb:343:13:343:13 | h [element] | provenance | | -| semantics.rb:341:12:341:22 | call to source | semantics.rb:341:5:341:5 | [post] h [element] | provenance | | -| semantics.rb:341:12:341:22 | call to source | semantics.rb:341:5:341:5 | [post] h [element] | provenance | | -| semantics.rb:343:5:343:5 | x [element 0] | semantics.rb:345:10:345:10 | x [element 0] | provenance | | -| semantics.rb:343:5:343:5 | x [element 0] | semantics.rb:345:10:345:10 | x [element 0] | provenance | | -| semantics.rb:343:5:343:5 | x [element 0] | semantics.rb:347:10:347:10 | x [element 0] | provenance | | -| semantics.rb:343:5:343:5 | x [element 0] | semantics.rb:347:10:347:10 | x [element 0] | provenance | | -| semantics.rb:343:5:343:5 | x [element] | semantics.rb:345:10:345:10 | x [element] | provenance | | -| semantics.rb:343:5:343:5 | x [element] | semantics.rb:345:10:345:10 | x [element] | provenance | | -| semantics.rb:343:5:343:5 | x [element] | semantics.rb:346:10:346:10 | x [element] | provenance | | -| semantics.rb:343:5:343:5 | x [element] | semantics.rb:346:10:346:10 | x [element] | provenance | | -| semantics.rb:343:5:343:5 | x [element] | semantics.rb:347:10:347:10 | x [element] | provenance | | -| semantics.rb:343:5:343:5 | x [element] | semantics.rb:347:10:347:10 | x [element] | provenance | | -| semantics.rb:343:9:343:14 | call to s42 [element 0] | semantics.rb:343:5:343:5 | x [element 0] | provenance | | -| semantics.rb:343:9:343:14 | call to s42 [element 0] | semantics.rb:343:5:343:5 | x [element 0] | provenance | | -| semantics.rb:343:9:343:14 | call to s42 [element] | semantics.rb:343:5:343:5 | x [element] | provenance | | -| semantics.rb:343:9:343:14 | call to s42 [element] | semantics.rb:343:5:343:5 | x [element] | provenance | | -| semantics.rb:343:13:343:13 | h [element 0] | semantics.rb:343:9:343:14 | call to s42 [element 0] | provenance | | -| semantics.rb:343:13:343:13 | h [element 0] | semantics.rb:343:9:343:14 | call to s42 [element 0] | provenance | | -| semantics.rb:343:13:343:13 | h [element] | semantics.rb:343:9:343:14 | call to s42 [element] | provenance | | -| semantics.rb:343:13:343:13 | h [element] | semantics.rb:343:9:343:14 | call to s42 [element] | provenance | | -| semantics.rb:345:10:345:10 | x [element 0] | semantics.rb:345:10:345:13 | ...[...] | provenance | | -| semantics.rb:345:10:345:10 | x [element 0] | semantics.rb:345:10:345:13 | ...[...] | provenance | | -| semantics.rb:345:10:345:10 | x [element] | semantics.rb:345:10:345:13 | ...[...] | provenance | | -| semantics.rb:345:10:345:10 | x [element] | semantics.rb:345:10:345:13 | ...[...] | provenance | | -| semantics.rb:346:10:346:10 | x [element] | semantics.rb:346:10:346:13 | ...[...] | provenance | | -| semantics.rb:346:10:346:10 | x [element] | semantics.rb:346:10:346:13 | ...[...] | provenance | | -| semantics.rb:347:10:347:10 | x [element 0] | semantics.rb:347:10:347:13 | ...[...] | provenance | | -| semantics.rb:347:10:347:10 | x [element 0] | semantics.rb:347:10:347:13 | ...[...] | provenance | | -| semantics.rb:347:10:347:10 | x [element] | semantics.rb:347:10:347:13 | ...[...] | provenance | | -| semantics.rb:347:10:347:10 | x [element] | semantics.rb:347:10:347:13 | ...[...] | provenance | | -| semantics.rb:351:5:351:5 | [post] h [element 0] | semantics.rb:354:13:354:13 | h [element 0] | provenance | | -| semantics.rb:351:5:351:5 | [post] h [element 0] | semantics.rb:354:13:354:13 | h [element 0] | provenance | | -| semantics.rb:351:12:351:22 | call to source | semantics.rb:351:5:351:5 | [post] h [element 0] | provenance | | -| semantics.rb:351:12:351:22 | call to source | semantics.rb:351:5:351:5 | [post] h [element 0] | provenance | | -| semantics.rb:354:5:354:5 | x [element 0] | semantics.rb:356:10:356:10 | x [element 0] | provenance | | -| semantics.rb:354:5:354:5 | x [element 0] | semantics.rb:356:10:356:10 | x [element 0] | provenance | | -| semantics.rb:354:5:354:5 | x [element 0] | semantics.rb:358:10:358:10 | x [element 0] | provenance | | -| semantics.rb:354:5:354:5 | x [element 0] | semantics.rb:358:10:358:10 | x [element 0] | provenance | | -| semantics.rb:354:9:354:14 | call to s43 [element 0] | semantics.rb:354:5:354:5 | x [element 0] | provenance | | -| semantics.rb:354:9:354:14 | call to s43 [element 0] | semantics.rb:354:5:354:5 | x [element 0] | provenance | | -| semantics.rb:354:13:354:13 | h [element 0] | semantics.rb:354:9:354:14 | call to s43 [element 0] | provenance | | -| semantics.rb:354:13:354:13 | h [element 0] | semantics.rb:354:9:354:14 | call to s43 [element 0] | provenance | | -| semantics.rb:356:10:356:10 | x [element 0] | semantics.rb:356:10:356:13 | ...[...] | provenance | | -| semantics.rb:356:10:356:10 | x [element 0] | semantics.rb:356:10:356:13 | ...[...] | provenance | | -| semantics.rb:358:10:358:10 | x [element 0] | semantics.rb:358:10:358:13 | ...[...] | provenance | | -| semantics.rb:358:10:358:10 | x [element 0] | semantics.rb:358:10:358:13 | ...[...] | provenance | | -| semantics.rb:363:5:363:5 | [post] h [element 1] | semantics.rb:366:9:366:9 | h [element 1] | provenance | | -| semantics.rb:363:5:363:5 | [post] h [element 1] | semantics.rb:366:9:366:9 | h [element 1] | provenance | | -| semantics.rb:363:12:363:22 | call to source | semantics.rb:363:5:363:5 | [post] h [element 1] | provenance | | -| semantics.rb:363:12:363:22 | call to source | semantics.rb:363:5:363:5 | [post] h [element 1] | provenance | | -| semantics.rb:366:9:366:9 | [post] h [element 1] | semantics.rb:369:10:369:10 | h [element 1] | provenance | | -| semantics.rb:366:9:366:9 | [post] h [element 1] | semantics.rb:369:10:369:10 | h [element 1] | provenance | | -| semantics.rb:366:9:366:9 | [post] h [element 1] | semantics.rb:370:10:370:10 | h [element 1] | provenance | | -| semantics.rb:366:9:366:9 | [post] h [element 1] | semantics.rb:370:10:370:10 | h [element 1] | provenance | | -| semantics.rb:366:9:366:9 | h [element 1] | semantics.rb:366:9:366:9 | [post] h [element 1] | provenance | | -| semantics.rb:366:9:366:9 | h [element 1] | semantics.rb:366:9:366:9 | [post] h [element 1] | provenance | | -| semantics.rb:369:10:369:10 | h [element 1] | semantics.rb:369:10:369:13 | ...[...] | provenance | | -| semantics.rb:369:10:369:10 | h [element 1] | semantics.rb:369:10:369:13 | ...[...] | provenance | | -| semantics.rb:370:10:370:10 | h [element 1] | semantics.rb:370:10:370:13 | ...[...] | provenance | | -| semantics.rb:370:10:370:10 | h [element 1] | semantics.rb:370:10:370:13 | ...[...] | provenance | | -| semantics.rb:374:5:374:5 | [post] h [element 0] | semantics.rb:375:5:375:5 | h [element 0] | provenance | | -| semantics.rb:374:5:374:5 | [post] h [element 0] | semantics.rb:375:5:375:5 | h [element 0] | provenance | | -| semantics.rb:374:12:374:22 | call to source | semantics.rb:374:5:374:5 | [post] h [element 0] | provenance | | -| semantics.rb:374:12:374:22 | call to source | semantics.rb:374:5:374:5 | [post] h [element 0] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 0] | semantics.rb:378:10:378:10 | h [element 0] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 0] | semantics.rb:378:10:378:10 | h [element 0] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 0] | semantics.rb:380:10:380:10 | h [element 0] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 0] | semantics.rb:380:10:380:10 | h [element 0] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semantics.rb:379:10:379:10 | h [element 1] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semantics.rb:379:10:379:10 | h [element 1] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semantics.rb:380:10:380:10 | h [element 1] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semantics.rb:380:10:380:10 | h [element 1] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semantics.rb:382:9:382:9 | h [element 1] | provenance | | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semantics.rb:382:9:382:9 | h [element 1] | provenance | | -| semantics.rb:375:5:375:5 | h [element 0] | semantics.rb:375:5:375:5 | [post] h [element 0] | provenance | | -| semantics.rb:375:5:375:5 | h [element 0] | semantics.rb:375:5:375:5 | [post] h [element 0] | provenance | | -| semantics.rb:375:12:375:22 | call to source | semantics.rb:375:5:375:5 | [post] h [element 1] | provenance | | -| semantics.rb:375:12:375:22 | call to source | semantics.rb:375:5:375:5 | [post] h [element 1] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:378:10:378:10 | h [element] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:378:10:378:10 | h [element] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:379:10:379:10 | h [element] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:379:10:379:10 | h [element] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:380:10:380:10 | h [element] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:380:10:380:10 | h [element] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:382:9:382:9 | h [element] | provenance | | -| semantics.rb:376:5:376:5 | [post] h [element] | semantics.rb:382:9:382:9 | h [element] | provenance | | -| semantics.rb:376:12:376:22 | call to source | semantics.rb:376:5:376:5 | [post] h [element] | provenance | | -| semantics.rb:376:12:376:22 | call to source | semantics.rb:376:5:376:5 | [post] h [element] | provenance | | -| semantics.rb:378:10:378:10 | h [element 0] | semantics.rb:378:10:378:13 | ...[...] | provenance | | -| semantics.rb:378:10:378:10 | h [element 0] | semantics.rb:378:10:378:13 | ...[...] | provenance | | -| semantics.rb:378:10:378:10 | h [element] | semantics.rb:378:10:378:13 | ...[...] | provenance | | -| semantics.rb:378:10:378:10 | h [element] | semantics.rb:378:10:378:13 | ...[...] | provenance | | -| semantics.rb:379:10:379:10 | h [element 1] | semantics.rb:379:10:379:13 | ...[...] | provenance | | -| semantics.rb:379:10:379:10 | h [element 1] | semantics.rb:379:10:379:13 | ...[...] | provenance | | -| semantics.rb:379:10:379:10 | h [element] | semantics.rb:379:10:379:13 | ...[...] | provenance | | -| semantics.rb:379:10:379:10 | h [element] | semantics.rb:379:10:379:13 | ...[...] | provenance | | -| semantics.rb:380:10:380:10 | h [element 0] | semantics.rb:380:10:380:13 | ...[...] | provenance | | -| semantics.rb:380:10:380:10 | h [element 0] | semantics.rb:380:10:380:13 | ...[...] | provenance | | -| semantics.rb:380:10:380:10 | h [element 1] | semantics.rb:380:10:380:13 | ...[...] | provenance | | -| semantics.rb:380:10:380:10 | h [element 1] | semantics.rb:380:10:380:13 | ...[...] | provenance | | -| semantics.rb:380:10:380:10 | h [element] | semantics.rb:380:10:380:13 | ...[...] | provenance | | -| semantics.rb:380:10:380:10 | h [element] | semantics.rb:380:10:380:13 | ...[...] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element 1] | semantics.rb:385:10:385:10 | h [element 1] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element 1] | semantics.rb:385:10:385:10 | h [element 1] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element 1] | semantics.rb:386:10:386:10 | h [element 1] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element 1] | semantics.rb:386:10:386:10 | h [element 1] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element] | semantics.rb:384:10:384:10 | h [element] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element] | semantics.rb:384:10:384:10 | h [element] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element] | semantics.rb:385:10:385:10 | h [element] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element] | semantics.rb:385:10:385:10 | h [element] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element] | semantics.rb:386:10:386:10 | h [element] | provenance | | -| semantics.rb:382:9:382:9 | [post] h [element] | semantics.rb:386:10:386:10 | h [element] | provenance | | -| semantics.rb:382:9:382:9 | h [element 1] | semantics.rb:382:9:382:9 | [post] h [element 1] | provenance | | -| semantics.rb:382:9:382:9 | h [element 1] | semantics.rb:382:9:382:9 | [post] h [element 1] | provenance | | -| semantics.rb:382:9:382:9 | h [element] | semantics.rb:382:9:382:9 | [post] h [element] | provenance | | -| semantics.rb:382:9:382:9 | h [element] | semantics.rb:382:9:382:9 | [post] h [element] | provenance | | -| semantics.rb:384:10:384:10 | h [element] | semantics.rb:384:10:384:13 | ...[...] | provenance | | -| semantics.rb:384:10:384:10 | h [element] | semantics.rb:384:10:384:13 | ...[...] | provenance | | -| semantics.rb:385:10:385:10 | h [element 1] | semantics.rb:385:10:385:13 | ...[...] | provenance | | -| semantics.rb:385:10:385:10 | h [element 1] | semantics.rb:385:10:385:13 | ...[...] | provenance | | -| semantics.rb:385:10:385:10 | h [element] | semantics.rb:385:10:385:13 | ...[...] | provenance | | -| semantics.rb:385:10:385:10 | h [element] | semantics.rb:385:10:385:13 | ...[...] | provenance | | -| semantics.rb:386:10:386:10 | h [element 1] | semantics.rb:386:10:386:13 | ...[...] | provenance | | -| semantics.rb:386:10:386:10 | h [element 1] | semantics.rb:386:10:386:13 | ...[...] | provenance | | -| semantics.rb:386:10:386:10 | h [element] | semantics.rb:386:10:386:13 | ...[...] | provenance | | -| semantics.rb:386:10:386:10 | h [element] | semantics.rb:386:10:386:13 | ...[...] | provenance | | -| semantics.rb:390:5:390:5 | [post] h [element 0] | semantics.rb:391:5:391:5 | h [element 0] | provenance | | -| semantics.rb:390:5:390:5 | [post] h [element 0] | semantics.rb:391:5:391:5 | h [element 0] | provenance | | -| semantics.rb:390:12:390:22 | call to source | semantics.rb:390:5:390:5 | [post] h [element 0] | provenance | | -| semantics.rb:390:12:390:22 | call to source | semantics.rb:390:5:390:5 | [post] h [element 0] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 0] | semantics.rb:394:10:394:10 | h [element 0] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 0] | semantics.rb:394:10:394:10 | h [element 0] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 0] | semantics.rb:396:10:396:10 | h [element 0] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 0] | semantics.rb:396:10:396:10 | h [element 0] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semantics.rb:395:10:395:10 | h [element 1] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semantics.rb:395:10:395:10 | h [element 1] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semantics.rb:396:10:396:10 | h [element 1] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semantics.rb:396:10:396:10 | h [element 1] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semantics.rb:398:13:398:13 | h [element 1] | provenance | | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semantics.rb:398:13:398:13 | h [element 1] | provenance | | -| semantics.rb:391:5:391:5 | h [element 0] | semantics.rb:391:5:391:5 | [post] h [element 0] | provenance | | -| semantics.rb:391:5:391:5 | h [element 0] | semantics.rb:391:5:391:5 | [post] h [element 0] | provenance | | -| semantics.rb:391:12:391:22 | call to source | semantics.rb:391:5:391:5 | [post] h [element 1] | provenance | | -| semantics.rb:391:12:391:22 | call to source | semantics.rb:391:5:391:5 | [post] h [element 1] | provenance | | -| semantics.rb:392:5:392:5 | [post] h [element] | semantics.rb:394:10:394:10 | h [element] | provenance | | -| semantics.rb:392:5:392:5 | [post] h [element] | semantics.rb:394:10:394:10 | h [element] | provenance | | -| semantics.rb:392:5:392:5 | [post] h [element] | semantics.rb:395:10:395:10 | h [element] | provenance | | -| semantics.rb:392:5:392:5 | [post] h [element] | semantics.rb:395:10:395:10 | h [element] | provenance | | -| semantics.rb:392:5:392:5 | [post] h [element] | semantics.rb:396:10:396:10 | h [element] | provenance | | -| semantics.rb:392:5:392:5 | [post] h [element] | semantics.rb:396:10:396:10 | h [element] | provenance | | -| semantics.rb:392:12:392:22 | call to source | semantics.rb:392:5:392:5 | [post] h [element] | provenance | | -| semantics.rb:392:12:392:22 | call to source | semantics.rb:392:5:392:5 | [post] h [element] | provenance | | -| semantics.rb:394:10:394:10 | h [element 0] | semantics.rb:394:10:394:13 | ...[...] | provenance | | -| semantics.rb:394:10:394:10 | h [element 0] | semantics.rb:394:10:394:13 | ...[...] | provenance | | -| semantics.rb:394:10:394:10 | h [element] | semantics.rb:394:10:394:13 | ...[...] | provenance | | -| semantics.rb:394:10:394:10 | h [element] | semantics.rb:394:10:394:13 | ...[...] | provenance | | -| semantics.rb:395:10:395:10 | h [element 1] | semantics.rb:395:10:395:13 | ...[...] | provenance | | -| semantics.rb:395:10:395:10 | h [element 1] | semantics.rb:395:10:395:13 | ...[...] | provenance | | -| semantics.rb:395:10:395:10 | h [element] | semantics.rb:395:10:395:13 | ...[...] | provenance | | -| semantics.rb:395:10:395:10 | h [element] | semantics.rb:395:10:395:13 | ...[...] | provenance | | -| semantics.rb:396:10:396:10 | h [element 0] | semantics.rb:396:10:396:13 | ...[...] | provenance | | -| semantics.rb:396:10:396:10 | h [element 0] | semantics.rb:396:10:396:13 | ...[...] | provenance | | -| semantics.rb:396:10:396:10 | h [element 1] | semantics.rb:396:10:396:13 | ...[...] | provenance | | -| semantics.rb:396:10:396:10 | h [element 1] | semantics.rb:396:10:396:13 | ...[...] | provenance | | -| semantics.rb:396:10:396:10 | h [element] | semantics.rb:396:10:396:13 | ...[...] | provenance | | -| semantics.rb:396:10:396:10 | h [element] | semantics.rb:396:10:396:13 | ...[...] | provenance | | -| semantics.rb:398:5:398:5 | x [element 1] | semantics.rb:401:10:401:10 | x [element 1] | provenance | | -| semantics.rb:398:5:398:5 | x [element 1] | semantics.rb:401:10:401:10 | x [element 1] | provenance | | -| semantics.rb:398:5:398:5 | x [element 1] | semantics.rb:402:10:402:10 | x [element 1] | provenance | | -| semantics.rb:398:5:398:5 | x [element 1] | semantics.rb:402:10:402:10 | x [element 1] | provenance | | -| semantics.rb:398:9:398:14 | call to s46 [element 1] | semantics.rb:398:5:398:5 | x [element 1] | provenance | | -| semantics.rb:398:9:398:14 | call to s46 [element 1] | semantics.rb:398:5:398:5 | x [element 1] | provenance | | -| semantics.rb:398:13:398:13 | h [element 1] | semantics.rb:398:9:398:14 | call to s46 [element 1] | provenance | | -| semantics.rb:398:13:398:13 | h [element 1] | semantics.rb:398:9:398:14 | call to s46 [element 1] | provenance | | -| semantics.rb:401:10:401:10 | x [element 1] | semantics.rb:401:10:401:13 | ...[...] | provenance | | -| semantics.rb:401:10:401:10 | x [element 1] | semantics.rb:401:10:401:13 | ...[...] | provenance | | -| semantics.rb:402:10:402:10 | x [element 1] | semantics.rb:402:10:402:13 | ...[...] | provenance | | -| semantics.rb:402:10:402:10 | x [element 1] | semantics.rb:402:10:402:13 | ...[...] | provenance | | -| semantics.rb:406:5:406:5 | [post] h [element :foo] | semantics.rb:407:5:407:5 | h [element :foo] | provenance | | -| semantics.rb:406:5:406:5 | [post] h [element :foo] | semantics.rb:407:5:407:5 | h [element :foo] | provenance | | -| semantics.rb:406:15:406:25 | call to source | semantics.rb:406:5:406:5 | [post] h [element :foo] | provenance | | -| semantics.rb:406:15:406:25 | call to source | semantics.rb:406:5:406:5 | [post] h [element :foo] | provenance | | -| semantics.rb:407:5:407:5 | [post] h [element :bar] | semantics.rb:411:10:411:10 | h [element :bar] | provenance | | -| semantics.rb:407:5:407:5 | [post] h [element :bar] | semantics.rb:411:10:411:10 | h [element :bar] | provenance | | -| semantics.rb:407:5:407:5 | [post] h [element :bar] | semantics.rb:413:13:413:13 | h [element :bar] | provenance | | -| semantics.rb:407:5:407:5 | [post] h [element :bar] | semantics.rb:413:13:413:13 | h [element :bar] | provenance | | -| semantics.rb:407:5:407:5 | [post] h [element :foo] | semantics.rb:410:10:410:10 | h [element :foo] | provenance | | -| semantics.rb:407:5:407:5 | [post] h [element :foo] | semantics.rb:410:10:410:10 | h [element :foo] | provenance | | -| semantics.rb:407:5:407:5 | h [element :foo] | semantics.rb:407:5:407:5 | [post] h [element :foo] | provenance | | -| semantics.rb:407:5:407:5 | h [element :foo] | semantics.rb:407:5:407:5 | [post] h [element :foo] | provenance | | -| semantics.rb:407:15:407:25 | call to source | semantics.rb:407:5:407:5 | [post] h [element :bar] | provenance | | -| semantics.rb:407:15:407:25 | call to source | semantics.rb:407:5:407:5 | [post] h [element :bar] | provenance | | -| semantics.rb:408:5:408:5 | [post] h [element] | semantics.rb:410:10:410:10 | h [element] | provenance | | -| semantics.rb:408:5:408:5 | [post] h [element] | semantics.rb:410:10:410:10 | h [element] | provenance | | -| semantics.rb:408:5:408:5 | [post] h [element] | semantics.rb:411:10:411:10 | h [element] | provenance | | -| semantics.rb:408:5:408:5 | [post] h [element] | semantics.rb:411:10:411:10 | h [element] | provenance | | -| semantics.rb:408:12:408:22 | call to source | semantics.rb:408:5:408:5 | [post] h [element] | provenance | | -| semantics.rb:408:12:408:22 | call to source | semantics.rb:408:5:408:5 | [post] h [element] | provenance | | -| semantics.rb:410:10:410:10 | h [element :foo] | semantics.rb:410:10:410:16 | ...[...] | provenance | | -| semantics.rb:410:10:410:10 | h [element :foo] | semantics.rb:410:10:410:16 | ...[...] | provenance | | -| semantics.rb:410:10:410:10 | h [element] | semantics.rb:410:10:410:16 | ...[...] | provenance | | -| semantics.rb:410:10:410:10 | h [element] | semantics.rb:410:10:410:16 | ...[...] | provenance | | -| semantics.rb:411:10:411:10 | h [element :bar] | semantics.rb:411:10:411:16 | ...[...] | provenance | | -| semantics.rb:411:10:411:10 | h [element :bar] | semantics.rb:411:10:411:16 | ...[...] | provenance | | -| semantics.rb:411:10:411:10 | h [element] | semantics.rb:411:10:411:16 | ...[...] | provenance | | -| semantics.rb:411:10:411:10 | h [element] | semantics.rb:411:10:411:16 | ...[...] | provenance | | -| semantics.rb:413:5:413:5 | x [element :bar] | semantics.rb:416:10:416:10 | x [element :bar] | provenance | | -| semantics.rb:413:5:413:5 | x [element :bar] | semantics.rb:416:10:416:10 | x [element :bar] | provenance | | -| semantics.rb:413:9:413:14 | call to s47 [element :bar] | semantics.rb:413:5:413:5 | x [element :bar] | provenance | | -| semantics.rb:413:9:413:14 | call to s47 [element :bar] | semantics.rb:413:5:413:5 | x [element :bar] | provenance | | -| semantics.rb:413:13:413:13 | h [element :bar] | semantics.rb:413:9:413:14 | call to s47 [element :bar] | provenance | | -| semantics.rb:413:13:413:13 | h [element :bar] | semantics.rb:413:9:413:14 | call to s47 [element :bar] | provenance | | -| semantics.rb:416:10:416:10 | x [element :bar] | semantics.rb:416:10:416:16 | ...[...] | provenance | | -| semantics.rb:416:10:416:10 | x [element :bar] | semantics.rb:416:10:416:16 | ...[...] | provenance | | -| semantics.rb:420:5:420:5 | [post] h [element :foo] | semantics.rb:421:5:421:5 | h [element :foo] | provenance | | -| semantics.rb:420:5:420:5 | [post] h [element :foo] | semantics.rb:421:5:421:5 | h [element :foo] | provenance | | -| semantics.rb:420:15:420:25 | call to source | semantics.rb:420:5:420:5 | [post] h [element :foo] | provenance | | -| semantics.rb:420:15:420:25 | call to source | semantics.rb:420:5:420:5 | [post] h [element :foo] | provenance | | -| semantics.rb:421:5:421:5 | [post] h [element :bar] | semantics.rb:425:10:425:10 | h [element :bar] | provenance | | -| semantics.rb:421:5:421:5 | [post] h [element :bar] | semantics.rb:425:10:425:10 | h [element :bar] | provenance | | -| semantics.rb:421:5:421:5 | [post] h [element :bar] | semantics.rb:427:13:427:13 | h [element :bar] | provenance | | -| semantics.rb:421:5:421:5 | [post] h [element :bar] | semantics.rb:427:13:427:13 | h [element :bar] | provenance | | -| semantics.rb:421:5:421:5 | [post] h [element :foo] | semantics.rb:424:10:424:10 | h [element :foo] | provenance | | -| semantics.rb:421:5:421:5 | [post] h [element :foo] | semantics.rb:424:10:424:10 | h [element :foo] | provenance | | -| semantics.rb:421:5:421:5 | h [element :foo] | semantics.rb:421:5:421:5 | [post] h [element :foo] | provenance | | -| semantics.rb:421:5:421:5 | h [element :foo] | semantics.rb:421:5:421:5 | [post] h [element :foo] | provenance | | -| semantics.rb:421:15:421:25 | call to source | semantics.rb:421:5:421:5 | [post] h [element :bar] | provenance | | -| semantics.rb:421:15:421:25 | call to source | semantics.rb:421:5:421:5 | [post] h [element :bar] | provenance | | -| semantics.rb:422:5:422:5 | [post] h [element] | semantics.rb:424:10:424:10 | h [element] | provenance | | -| semantics.rb:422:5:422:5 | [post] h [element] | semantics.rb:424:10:424:10 | h [element] | provenance | | -| semantics.rb:422:5:422:5 | [post] h [element] | semantics.rb:425:10:425:10 | h [element] | provenance | | -| semantics.rb:422:5:422:5 | [post] h [element] | semantics.rb:425:10:425:10 | h [element] | provenance | | -| semantics.rb:422:12:422:22 | call to source | semantics.rb:422:5:422:5 | [post] h [element] | provenance | | -| semantics.rb:422:12:422:22 | call to source | semantics.rb:422:5:422:5 | [post] h [element] | provenance | | -| semantics.rb:424:10:424:10 | h [element :foo] | semantics.rb:424:10:424:16 | ...[...] | provenance | | -| semantics.rb:424:10:424:10 | h [element :foo] | semantics.rb:424:10:424:16 | ...[...] | provenance | | -| semantics.rb:424:10:424:10 | h [element] | semantics.rb:424:10:424:16 | ...[...] | provenance | | -| semantics.rb:424:10:424:10 | h [element] | semantics.rb:424:10:424:16 | ...[...] | provenance | | -| semantics.rb:425:10:425:10 | h [element :bar] | semantics.rb:425:10:425:16 | ...[...] | provenance | | -| semantics.rb:425:10:425:10 | h [element :bar] | semantics.rb:425:10:425:16 | ...[...] | provenance | | -| semantics.rb:425:10:425:10 | h [element] | semantics.rb:425:10:425:16 | ...[...] | provenance | | -| semantics.rb:425:10:425:10 | h [element] | semantics.rb:425:10:425:16 | ...[...] | provenance | | -| semantics.rb:427:5:427:5 | x [element :bar] | semantics.rb:430:10:430:10 | x [element :bar] | provenance | | -| semantics.rb:427:5:427:5 | x [element :bar] | semantics.rb:430:10:430:10 | x [element :bar] | provenance | | -| semantics.rb:427:9:427:14 | call to s48 [element :bar] | semantics.rb:427:5:427:5 | x [element :bar] | provenance | | -| semantics.rb:427:9:427:14 | call to s48 [element :bar] | semantics.rb:427:5:427:5 | x [element :bar] | provenance | | -| semantics.rb:427:13:427:13 | h [element :bar] | semantics.rb:427:9:427:14 | call to s48 [element :bar] | provenance | | -| semantics.rb:427:13:427:13 | h [element :bar] | semantics.rb:427:9:427:14 | call to s48 [element :bar] | provenance | | -| semantics.rb:430:10:430:10 | x [element :bar] | semantics.rb:430:10:430:16 | ...[...] | provenance | | -| semantics.rb:430:10:430:10 | x [element :bar] | semantics.rb:430:10:430:16 | ...[...] | provenance | | -| semantics.rb:434:5:434:5 | [post] h [element :foo] | semantics.rb:435:5:435:5 | h [element :foo] | provenance | | -| semantics.rb:434:5:434:5 | [post] h [element :foo] | semantics.rb:435:5:435:5 | h [element :foo] | provenance | | -| semantics.rb:434:15:434:25 | call to source | semantics.rb:434:5:434:5 | [post] h [element :foo] | provenance | | -| semantics.rb:434:15:434:25 | call to source | semantics.rb:434:5:434:5 | [post] h [element :foo] | provenance | | -| semantics.rb:435:5:435:5 | [post] h [element :bar] | semantics.rb:439:10:439:10 | h [element :bar] | provenance | | -| semantics.rb:435:5:435:5 | [post] h [element :bar] | semantics.rb:439:10:439:10 | h [element :bar] | provenance | | -| semantics.rb:435:5:435:5 | [post] h [element :bar] | semantics.rb:441:13:441:13 | h [element :bar] | provenance | | -| semantics.rb:435:5:435:5 | [post] h [element :bar] | semantics.rb:441:13:441:13 | h [element :bar] | provenance | | -| semantics.rb:435:5:435:5 | [post] h [element :foo] | semantics.rb:438:10:438:10 | h [element :foo] | provenance | | -| semantics.rb:435:5:435:5 | [post] h [element :foo] | semantics.rb:438:10:438:10 | h [element :foo] | provenance | | -| semantics.rb:435:5:435:5 | h [element :foo] | semantics.rb:435:5:435:5 | [post] h [element :foo] | provenance | | -| semantics.rb:435:5:435:5 | h [element :foo] | semantics.rb:435:5:435:5 | [post] h [element :foo] | provenance | | -| semantics.rb:435:15:435:25 | call to source | semantics.rb:435:5:435:5 | [post] h [element :bar] | provenance | | -| semantics.rb:435:15:435:25 | call to source | semantics.rb:435:5:435:5 | [post] h [element :bar] | provenance | | -| semantics.rb:436:5:436:5 | [post] h [element] | semantics.rb:438:10:438:10 | h [element] | provenance | | -| semantics.rb:436:5:436:5 | [post] h [element] | semantics.rb:438:10:438:10 | h [element] | provenance | | -| semantics.rb:436:5:436:5 | [post] h [element] | semantics.rb:439:10:439:10 | h [element] | provenance | | -| semantics.rb:436:5:436:5 | [post] h [element] | semantics.rb:439:10:439:10 | h [element] | provenance | | -| semantics.rb:436:5:436:5 | [post] h [element] | semantics.rb:441:13:441:13 | h [element] | provenance | | -| semantics.rb:436:5:436:5 | [post] h [element] | semantics.rb:441:13:441:13 | h [element] | provenance | | -| semantics.rb:436:12:436:22 | call to source | semantics.rb:436:5:436:5 | [post] h [element] | provenance | | -| semantics.rb:436:12:436:22 | call to source | semantics.rb:436:5:436:5 | [post] h [element] | provenance | | -| semantics.rb:438:10:438:10 | h [element :foo] | semantics.rb:438:10:438:16 | ...[...] | provenance | | -| semantics.rb:438:10:438:10 | h [element :foo] | semantics.rb:438:10:438:16 | ...[...] | provenance | | -| semantics.rb:438:10:438:10 | h [element] | semantics.rb:438:10:438:16 | ...[...] | provenance | | -| semantics.rb:438:10:438:10 | h [element] | semantics.rb:438:10:438:16 | ...[...] | provenance | | -| semantics.rb:439:10:439:10 | h [element :bar] | semantics.rb:439:10:439:16 | ...[...] | provenance | | -| semantics.rb:439:10:439:10 | h [element :bar] | semantics.rb:439:10:439:16 | ...[...] | provenance | | -| semantics.rb:439:10:439:10 | h [element] | semantics.rb:439:10:439:16 | ...[...] | provenance | | -| semantics.rb:439:10:439:10 | h [element] | semantics.rb:439:10:439:16 | ...[...] | provenance | | -| semantics.rb:441:5:441:5 | x [element :bar] | semantics.rb:444:10:444:10 | x [element :bar] | provenance | | -| semantics.rb:441:5:441:5 | x [element :bar] | semantics.rb:444:10:444:10 | x [element :bar] | provenance | | -| semantics.rb:441:5:441:5 | x [element] | semantics.rb:443:10:443:10 | x [element] | provenance | | -| semantics.rb:441:5:441:5 | x [element] | semantics.rb:443:10:443:10 | x [element] | provenance | | -| semantics.rb:441:5:441:5 | x [element] | semantics.rb:444:10:444:10 | x [element] | provenance | | -| semantics.rb:441:5:441:5 | x [element] | semantics.rb:444:10:444:10 | x [element] | provenance | | -| semantics.rb:441:9:441:14 | call to s49 [element :bar] | semantics.rb:441:5:441:5 | x [element :bar] | provenance | | -| semantics.rb:441:9:441:14 | call to s49 [element :bar] | semantics.rb:441:5:441:5 | x [element :bar] | provenance | | -| semantics.rb:441:9:441:14 | call to s49 [element] | semantics.rb:441:5:441:5 | x [element] | provenance | | -| semantics.rb:441:9:441:14 | call to s49 [element] | semantics.rb:441:5:441:5 | x [element] | provenance | | -| semantics.rb:441:13:441:13 | h [element :bar] | semantics.rb:441:9:441:14 | call to s49 [element :bar] | provenance | | -| semantics.rb:441:13:441:13 | h [element :bar] | semantics.rb:441:9:441:14 | call to s49 [element :bar] | provenance | | -| semantics.rb:441:13:441:13 | h [element] | semantics.rb:441:9:441:14 | call to s49 [element] | provenance | | -| semantics.rb:441:13:441:13 | h [element] | semantics.rb:441:9:441:14 | call to s49 [element] | provenance | | -| semantics.rb:443:10:443:10 | x [element] | semantics.rb:443:10:443:16 | ...[...] | provenance | | -| semantics.rb:443:10:443:10 | x [element] | semantics.rb:443:10:443:16 | ...[...] | provenance | | -| semantics.rb:444:10:444:10 | x [element :bar] | semantics.rb:444:10:444:16 | ...[...] | provenance | | -| semantics.rb:444:10:444:10 | x [element :bar] | semantics.rb:444:10:444:16 | ...[...] | provenance | | -| semantics.rb:444:10:444:10 | x [element] | semantics.rb:444:10:444:16 | ...[...] | provenance | | -| semantics.rb:444:10:444:10 | x [element] | semantics.rb:444:10:444:16 | ...[...] | provenance | | -| semantics.rb:448:5:448:5 | [post] h [element :foo] | semantics.rb:449:5:449:5 | h [element :foo] | provenance | | -| semantics.rb:448:5:448:5 | [post] h [element :foo] | semantics.rb:449:5:449:5 | h [element :foo] | provenance | | -| semantics.rb:448:15:448:25 | call to source | semantics.rb:448:5:448:5 | [post] h [element :foo] | provenance | | -| semantics.rb:448:15:448:25 | call to source | semantics.rb:448:5:448:5 | [post] h [element :foo] | provenance | | -| semantics.rb:449:5:449:5 | [post] h [element :bar] | semantics.rb:453:10:453:10 | h [element :bar] | provenance | | -| semantics.rb:449:5:449:5 | [post] h [element :bar] | semantics.rb:453:10:453:10 | h [element :bar] | provenance | | -| semantics.rb:449:5:449:5 | [post] h [element :bar] | semantics.rb:455:9:455:9 | h [element :bar] | provenance | | -| semantics.rb:449:5:449:5 | [post] h [element :bar] | semantics.rb:455:9:455:9 | h [element :bar] | provenance | | -| semantics.rb:449:5:449:5 | [post] h [element :foo] | semantics.rb:452:10:452:10 | h [element :foo] | provenance | | -| semantics.rb:449:5:449:5 | [post] h [element :foo] | semantics.rb:452:10:452:10 | h [element :foo] | provenance | | -| semantics.rb:449:5:449:5 | h [element :foo] | semantics.rb:449:5:449:5 | [post] h [element :foo] | provenance | | -| semantics.rb:449:5:449:5 | h [element :foo] | semantics.rb:449:5:449:5 | [post] h [element :foo] | provenance | | -| semantics.rb:449:15:449:25 | call to source | semantics.rb:449:5:449:5 | [post] h [element :bar] | provenance | | -| semantics.rb:449:15:449:25 | call to source | semantics.rb:449:5:449:5 | [post] h [element :bar] | provenance | | -| semantics.rb:450:5:450:5 | [post] h [element] | semantics.rb:452:10:452:10 | h [element] | provenance | | -| semantics.rb:450:5:450:5 | [post] h [element] | semantics.rb:452:10:452:10 | h [element] | provenance | | -| semantics.rb:450:5:450:5 | [post] h [element] | semantics.rb:453:10:453:10 | h [element] | provenance | | -| semantics.rb:450:5:450:5 | [post] h [element] | semantics.rb:453:10:453:10 | h [element] | provenance | | -| semantics.rb:450:12:450:22 | call to source | semantics.rb:450:5:450:5 | [post] h [element] | provenance | | -| semantics.rb:450:12:450:22 | call to source | semantics.rb:450:5:450:5 | [post] h [element] | provenance | | -| semantics.rb:452:10:452:10 | h [element :foo] | semantics.rb:452:10:452:16 | ...[...] | provenance | | -| semantics.rb:452:10:452:10 | h [element :foo] | semantics.rb:452:10:452:16 | ...[...] | provenance | | -| semantics.rb:452:10:452:10 | h [element] | semantics.rb:452:10:452:16 | ...[...] | provenance | | -| semantics.rb:452:10:452:10 | h [element] | semantics.rb:452:10:452:16 | ...[...] | provenance | | -| semantics.rb:453:10:453:10 | h [element :bar] | semantics.rb:453:10:453:16 | ...[...] | provenance | | -| semantics.rb:453:10:453:10 | h [element :bar] | semantics.rb:453:10:453:16 | ...[...] | provenance | | -| semantics.rb:453:10:453:10 | h [element] | semantics.rb:453:10:453:16 | ...[...] | provenance | | -| semantics.rb:453:10:453:10 | h [element] | semantics.rb:453:10:453:16 | ...[...] | provenance | | -| semantics.rb:455:9:455:9 | [post] h [element :bar] | semantics.rb:458:10:458:10 | h [element :bar] | provenance | | -| semantics.rb:455:9:455:9 | [post] h [element :bar] | semantics.rb:458:10:458:10 | h [element :bar] | provenance | | -| semantics.rb:455:9:455:9 | h [element :bar] | semantics.rb:455:9:455:9 | [post] h [element :bar] | provenance | | -| semantics.rb:455:9:455:9 | h [element :bar] | semantics.rb:455:9:455:9 | [post] h [element :bar] | provenance | | -| semantics.rb:458:10:458:10 | h [element :bar] | semantics.rb:458:10:458:16 | ...[...] | provenance | | -| semantics.rb:458:10:458:10 | h [element :bar] | semantics.rb:458:10:458:16 | ...[...] | provenance | | -| semantics.rb:462:5:462:5 | [post] h [element :foo] | semantics.rb:463:5:463:5 | h [element :foo] | provenance | | -| semantics.rb:462:5:462:5 | [post] h [element :foo] | semantics.rb:463:5:463:5 | h [element :foo] | provenance | | -| semantics.rb:462:15:462:25 | call to source | semantics.rb:462:5:462:5 | [post] h [element :foo] | provenance | | -| semantics.rb:462:15:462:25 | call to source | semantics.rb:462:5:462:5 | [post] h [element :foo] | provenance | | -| semantics.rb:463:5:463:5 | [post] h [element :bar] | semantics.rb:467:10:467:10 | h [element :bar] | provenance | | -| semantics.rb:463:5:463:5 | [post] h [element :bar] | semantics.rb:467:10:467:10 | h [element :bar] | provenance | | -| semantics.rb:463:5:463:5 | [post] h [element :bar] | semantics.rb:469:9:469:9 | h [element :bar] | provenance | | -| semantics.rb:463:5:463:5 | [post] h [element :bar] | semantics.rb:469:9:469:9 | h [element :bar] | provenance | | -| semantics.rb:463:5:463:5 | [post] h [element :foo] | semantics.rb:466:10:466:10 | h [element :foo] | provenance | | -| semantics.rb:463:5:463:5 | [post] h [element :foo] | semantics.rb:466:10:466:10 | h [element :foo] | provenance | | -| semantics.rb:463:5:463:5 | h [element :foo] | semantics.rb:463:5:463:5 | [post] h [element :foo] | provenance | | -| semantics.rb:463:5:463:5 | h [element :foo] | semantics.rb:463:5:463:5 | [post] h [element :foo] | provenance | | -| semantics.rb:463:15:463:25 | call to source | semantics.rb:463:5:463:5 | [post] h [element :bar] | provenance | | -| semantics.rb:463:15:463:25 | call to source | semantics.rb:463:5:463:5 | [post] h [element :bar] | provenance | | -| semantics.rb:464:5:464:5 | [post] h [element] | semantics.rb:466:10:466:10 | h [element] | provenance | | -| semantics.rb:464:5:464:5 | [post] h [element] | semantics.rb:466:10:466:10 | h [element] | provenance | | -| semantics.rb:464:5:464:5 | [post] h [element] | semantics.rb:467:10:467:10 | h [element] | provenance | | -| semantics.rb:464:5:464:5 | [post] h [element] | semantics.rb:467:10:467:10 | h [element] | provenance | | -| semantics.rb:464:5:464:5 | [post] h [element] | semantics.rb:469:9:469:9 | h [element] | provenance | | -| semantics.rb:464:5:464:5 | [post] h [element] | semantics.rb:469:9:469:9 | h [element] | provenance | | -| semantics.rb:464:12:464:22 | call to source | semantics.rb:464:5:464:5 | [post] h [element] | provenance | | -| semantics.rb:464:12:464:22 | call to source | semantics.rb:464:5:464:5 | [post] h [element] | provenance | | -| semantics.rb:466:10:466:10 | h [element :foo] | semantics.rb:466:10:466:16 | ...[...] | provenance | | -| semantics.rb:466:10:466:10 | h [element :foo] | semantics.rb:466:10:466:16 | ...[...] | provenance | | -| semantics.rb:466:10:466:10 | h [element] | semantics.rb:466:10:466:16 | ...[...] | provenance | | -| semantics.rb:466:10:466:10 | h [element] | semantics.rb:466:10:466:16 | ...[...] | provenance | | -| semantics.rb:467:10:467:10 | h [element :bar] | semantics.rb:467:10:467:16 | ...[...] | provenance | | -| semantics.rb:467:10:467:10 | h [element :bar] | semantics.rb:467:10:467:16 | ...[...] | provenance | | -| semantics.rb:467:10:467:10 | h [element] | semantics.rb:467:10:467:16 | ...[...] | provenance | | -| semantics.rb:467:10:467:10 | h [element] | semantics.rb:467:10:467:16 | ...[...] | provenance | | -| semantics.rb:469:9:469:9 | [post] h [element :bar] | semantics.rb:472:10:472:10 | h [element :bar] | provenance | | -| semantics.rb:469:9:469:9 | [post] h [element :bar] | semantics.rb:472:10:472:10 | h [element :bar] | provenance | | -| semantics.rb:469:9:469:9 | [post] h [element] | semantics.rb:471:10:471:10 | h [element] | provenance | | -| semantics.rb:469:9:469:9 | [post] h [element] | semantics.rb:471:10:471:10 | h [element] | provenance | | -| semantics.rb:469:9:469:9 | [post] h [element] | semantics.rb:472:10:472:10 | h [element] | provenance | | -| semantics.rb:469:9:469:9 | [post] h [element] | semantics.rb:472:10:472:10 | h [element] | provenance | | -| semantics.rb:469:9:469:9 | h [element :bar] | semantics.rb:469:9:469:9 | [post] h [element :bar] | provenance | | -| semantics.rb:469:9:469:9 | h [element :bar] | semantics.rb:469:9:469:9 | [post] h [element :bar] | provenance | | -| semantics.rb:469:9:469:9 | h [element] | semantics.rb:469:9:469:9 | [post] h [element] | provenance | | -| semantics.rb:469:9:469:9 | h [element] | semantics.rb:469:9:469:9 | [post] h [element] | provenance | | -| semantics.rb:471:10:471:10 | h [element] | semantics.rb:471:10:471:16 | ...[...] | provenance | | -| semantics.rb:471:10:471:10 | h [element] | semantics.rb:471:10:471:16 | ...[...] | provenance | | -| semantics.rb:472:10:472:10 | h [element :bar] | semantics.rb:472:10:472:16 | ...[...] | provenance | | -| semantics.rb:472:10:472:10 | h [element :bar] | semantics.rb:472:10:472:16 | ...[...] | provenance | | -| semantics.rb:472:10:472:10 | h [element] | semantics.rb:472:10:472:16 | ...[...] | provenance | | -| semantics.rb:472:10:472:10 | h [element] | semantics.rb:472:10:472:16 | ...[...] | provenance | | -| semantics.rb:476:5:476:5 | [post] h [element :foo] | semantics.rb:477:5:477:5 | h [element :foo] | provenance | | -| semantics.rb:476:5:476:5 | [post] h [element :foo] | semantics.rb:477:5:477:5 | h [element :foo] | provenance | | -| semantics.rb:476:15:476:25 | call to source | semantics.rb:476:5:476:5 | [post] h [element :foo] | provenance | | -| semantics.rb:476:15:476:25 | call to source | semantics.rb:476:5:476:5 | [post] h [element :foo] | provenance | | -| semantics.rb:477:5:477:5 | [post] h [element :bar] | semantics.rb:481:10:481:10 | h [element :bar] | provenance | | -| semantics.rb:477:5:477:5 | [post] h [element :bar] | semantics.rb:481:10:481:10 | h [element :bar] | provenance | | -| semantics.rb:477:5:477:5 | [post] h [element :bar] | semantics.rb:483:5:483:5 | h [element :bar] | provenance | | -| semantics.rb:477:5:477:5 | [post] h [element :bar] | semantics.rb:483:5:483:5 | h [element :bar] | provenance | | -| semantics.rb:477:5:477:5 | [post] h [element :foo] | semantics.rb:480:10:480:10 | h [element :foo] | provenance | | -| semantics.rb:477:5:477:5 | [post] h [element :foo] | semantics.rb:480:10:480:10 | h [element :foo] | provenance | | -| semantics.rb:477:5:477:5 | h [element :foo] | semantics.rb:477:5:477:5 | [post] h [element :foo] | provenance | | -| semantics.rb:477:5:477:5 | h [element :foo] | semantics.rb:477:5:477:5 | [post] h [element :foo] | provenance | | -| semantics.rb:477:15:477:25 | call to source | semantics.rb:477:5:477:5 | [post] h [element :bar] | provenance | | -| semantics.rb:477:15:477:25 | call to source | semantics.rb:477:5:477:5 | [post] h [element :bar] | provenance | | -| semantics.rb:478:5:478:5 | [post] h [element] | semantics.rb:480:10:480:10 | h [element] | provenance | | -| semantics.rb:478:5:478:5 | [post] h [element] | semantics.rb:480:10:480:10 | h [element] | provenance | | -| semantics.rb:478:5:478:5 | [post] h [element] | semantics.rb:481:10:481:10 | h [element] | provenance | | -| semantics.rb:478:5:478:5 | [post] h [element] | semantics.rb:481:10:481:10 | h [element] | provenance | | -| semantics.rb:478:12:478:22 | call to source | semantics.rb:478:5:478:5 | [post] h [element] | provenance | | -| semantics.rb:478:12:478:22 | call to source | semantics.rb:478:5:478:5 | [post] h [element] | provenance | | -| semantics.rb:480:10:480:10 | h [element :foo] | semantics.rb:480:10:480:16 | ...[...] | provenance | | -| semantics.rb:480:10:480:10 | h [element :foo] | semantics.rb:480:10:480:16 | ...[...] | provenance | | -| semantics.rb:480:10:480:10 | h [element] | semantics.rb:480:10:480:16 | ...[...] | provenance | | -| semantics.rb:480:10:480:10 | h [element] | semantics.rb:480:10:480:16 | ...[...] | provenance | | -| semantics.rb:481:10:481:10 | h [element :bar] | semantics.rb:481:10:481:16 | ...[...] | provenance | | -| semantics.rb:481:10:481:10 | h [element :bar] | semantics.rb:481:10:481:16 | ...[...] | provenance | | -| semantics.rb:481:10:481:10 | h [element] | semantics.rb:481:10:481:16 | ...[...] | provenance | | -| semantics.rb:481:10:481:10 | h [element] | semantics.rb:481:10:481:16 | ...[...] | provenance | | -| semantics.rb:483:5:483:5 | [post] h [element :bar] | semantics.rb:486:10:486:10 | h [element :bar] | provenance | | -| semantics.rb:483:5:483:5 | [post] h [element :bar] | semantics.rb:486:10:486:10 | h [element :bar] | provenance | | -| semantics.rb:483:5:483:5 | h [element :bar] | semantics.rb:483:5:483:5 | [post] h [element :bar] | provenance | | -| semantics.rb:483:5:483:5 | h [element :bar] | semantics.rb:483:5:483:5 | [post] h [element :bar] | provenance | | -| semantics.rb:486:10:486:10 | h [element :bar] | semantics.rb:486:10:486:16 | ...[...] | provenance | | -| semantics.rb:486:10:486:10 | h [element :bar] | semantics.rb:486:10:486:16 | ...[...] | provenance | | -| semantics.rb:490:5:490:5 | [post] h [element :foo] | semantics.rb:491:5:491:5 | h [element :foo] | provenance | | -| semantics.rb:490:5:490:5 | [post] h [element :foo] | semantics.rb:491:5:491:5 | h [element :foo] | provenance | | -| semantics.rb:490:15:490:25 | call to source | semantics.rb:490:5:490:5 | [post] h [element :foo] | provenance | | -| semantics.rb:490:15:490:25 | call to source | semantics.rb:490:5:490:5 | [post] h [element :foo] | provenance | | -| semantics.rb:491:5:491:5 | [post] h [element :bar] | semantics.rb:495:10:495:10 | h [element :bar] | provenance | | -| semantics.rb:491:5:491:5 | [post] h [element :bar] | semantics.rb:495:10:495:10 | h [element :bar] | provenance | | -| semantics.rb:491:5:491:5 | [post] h [element :bar] | semantics.rb:497:9:497:9 | h [element :bar] | provenance | | -| semantics.rb:491:5:491:5 | [post] h [element :bar] | semantics.rb:497:9:497:9 | h [element :bar] | provenance | | -| semantics.rb:491:5:491:5 | [post] h [element :foo] | semantics.rb:494:10:494:10 | h [element :foo] | provenance | | -| semantics.rb:491:5:491:5 | [post] h [element :foo] | semantics.rb:494:10:494:10 | h [element :foo] | provenance | | -| semantics.rb:491:5:491:5 | h [element :foo] | semantics.rb:491:5:491:5 | [post] h [element :foo] | provenance | | -| semantics.rb:491:5:491:5 | h [element :foo] | semantics.rb:491:5:491:5 | [post] h [element :foo] | provenance | | -| semantics.rb:491:15:491:25 | call to source | semantics.rb:491:5:491:5 | [post] h [element :bar] | provenance | | -| semantics.rb:491:15:491:25 | call to source | semantics.rb:491:5:491:5 | [post] h [element :bar] | provenance | | -| semantics.rb:492:5:492:5 | [post] h [element] | semantics.rb:494:10:494:10 | h [element] | provenance | | -| semantics.rb:492:5:492:5 | [post] h [element] | semantics.rb:494:10:494:10 | h [element] | provenance | | -| semantics.rb:492:5:492:5 | [post] h [element] | semantics.rb:495:10:495:10 | h [element] | provenance | | -| semantics.rb:492:5:492:5 | [post] h [element] | semantics.rb:495:10:495:10 | h [element] | provenance | | -| semantics.rb:492:12:492:22 | call to source | semantics.rb:492:5:492:5 | [post] h [element] | provenance | | -| semantics.rb:492:12:492:22 | call to source | semantics.rb:492:5:492:5 | [post] h [element] | provenance | | -| semantics.rb:494:10:494:10 | h [element :foo] | semantics.rb:494:10:494:16 | ...[...] | provenance | | -| semantics.rb:494:10:494:10 | h [element :foo] | semantics.rb:494:10:494:16 | ...[...] | provenance | | -| semantics.rb:494:10:494:10 | h [element] | semantics.rb:494:10:494:16 | ...[...] | provenance | | -| semantics.rb:494:10:494:10 | h [element] | semantics.rb:494:10:494:16 | ...[...] | provenance | | -| semantics.rb:495:10:495:10 | h [element :bar] | semantics.rb:495:10:495:16 | ...[...] | provenance | | -| semantics.rb:495:10:495:10 | h [element :bar] | semantics.rb:495:10:495:16 | ...[...] | provenance | | -| semantics.rb:495:10:495:10 | h [element] | semantics.rb:495:10:495:16 | ...[...] | provenance | | -| semantics.rb:495:10:495:10 | h [element] | semantics.rb:495:10:495:16 | ...[...] | provenance | | -| semantics.rb:497:5:497:5 | x [element :bar] | semantics.rb:500:10:500:10 | x [element :bar] | provenance | | -| semantics.rb:497:5:497:5 | x [element :bar] | semantics.rb:500:10:500:10 | x [element :bar] | provenance | | -| semantics.rb:497:9:497:9 | h [element :bar] | semantics.rb:497:9:497:15 | call to s53 [element :bar] | provenance | | -| semantics.rb:497:9:497:9 | h [element :bar] | semantics.rb:497:9:497:15 | call to s53 [element :bar] | provenance | | -| semantics.rb:497:9:497:15 | call to s53 [element :bar] | semantics.rb:497:5:497:5 | x [element :bar] | provenance | | -| semantics.rb:497:9:497:15 | call to s53 [element :bar] | semantics.rb:497:5:497:5 | x [element :bar] | provenance | | -| semantics.rb:500:10:500:10 | x [element :bar] | semantics.rb:500:10:500:16 | ...[...] | provenance | | -| semantics.rb:500:10:500:10 | x [element :bar] | semantics.rb:500:10:500:16 | ...[...] | provenance | | +| semantics.rb:340:5:340:5 | [post] h : [collection] [element 0] | semantics.rb:343:13:343:13 | h : [collection] [element 0] | provenance | | +| semantics.rb:340:5:340:5 | [post] h : [collection] [element 0] | semantics.rb:343:13:343:13 | h : [collection] [element 0] | provenance | | +| semantics.rb:340:12:340:22 | call to source | semantics.rb:340:5:340:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:340:12:340:22 | call to source | semantics.rb:340:5:340:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:341:5:341:5 | [post] h : [collection] [element] | semantics.rb:343:13:343:13 | h : [collection] [element] | provenance | | +| semantics.rb:341:5:341:5 | [post] h : [collection] [element] | semantics.rb:343:13:343:13 | h : [collection] [element] | provenance | | +| semantics.rb:341:12:341:22 | call to source | semantics.rb:341:5:341:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:341:12:341:22 | call to source | semantics.rb:341:5:341:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element 0] | semantics.rb:345:10:345:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element 0] | semantics.rb:345:10:345:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element 0] | semantics.rb:347:10:347:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element 0] | semantics.rb:347:10:347:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semantics.rb:345:10:345:10 | x : [collection] [element] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semantics.rb:345:10:345:10 | x : [collection] [element] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semantics.rb:346:10:346:10 | x : [collection] [element] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semantics.rb:346:10:346:10 | x : [collection] [element] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semantics.rb:347:10:347:10 | x : [collection] [element] | provenance | | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semantics.rb:347:10:347:10 | x : [collection] [element] | provenance | | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element 0] | semantics.rb:343:5:343:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element 0] | semantics.rb:343:5:343:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element] | semantics.rb:343:5:343:5 | x : [collection] [element] | provenance | | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element] | semantics.rb:343:5:343:5 | x : [collection] [element] | provenance | | +| semantics.rb:343:13:343:13 | h : [collection] [element 0] | semantics.rb:343:9:343:14 | call to s42 : [collection] [element 0] | provenance | | +| semantics.rb:343:13:343:13 | h : [collection] [element 0] | semantics.rb:343:9:343:14 | call to s42 : [collection] [element 0] | provenance | | +| semantics.rb:343:13:343:13 | h : [collection] [element] | semantics.rb:343:9:343:14 | call to s42 : [collection] [element] | provenance | | +| semantics.rb:343:13:343:13 | h : [collection] [element] | semantics.rb:343:9:343:14 | call to s42 : [collection] [element] | provenance | | +| semantics.rb:345:10:345:10 | x : [collection] [element 0] | semantics.rb:345:10:345:13 | ...[...] | provenance | | +| semantics.rb:345:10:345:10 | x : [collection] [element 0] | semantics.rb:345:10:345:13 | ...[...] | provenance | | +| semantics.rb:345:10:345:10 | x : [collection] [element] | semantics.rb:345:10:345:13 | ...[...] | provenance | | +| semantics.rb:345:10:345:10 | x : [collection] [element] | semantics.rb:345:10:345:13 | ...[...] | provenance | | +| semantics.rb:346:10:346:10 | x : [collection] [element] | semantics.rb:346:10:346:13 | ...[...] | provenance | | +| semantics.rb:346:10:346:10 | x : [collection] [element] | semantics.rb:346:10:346:13 | ...[...] | provenance | | +| semantics.rb:347:10:347:10 | x : [collection] [element 0] | semantics.rb:347:10:347:13 | ...[...] | provenance | | +| semantics.rb:347:10:347:10 | x : [collection] [element 0] | semantics.rb:347:10:347:13 | ...[...] | provenance | | +| semantics.rb:347:10:347:10 | x : [collection] [element] | semantics.rb:347:10:347:13 | ...[...] | provenance | | +| semantics.rb:347:10:347:10 | x : [collection] [element] | semantics.rb:347:10:347:13 | ...[...] | provenance | | +| semantics.rb:351:5:351:5 | [post] h : [collection] [element 0] | semantics.rb:354:13:354:13 | h : [collection] [element 0] | provenance | | +| semantics.rb:351:5:351:5 | [post] h : [collection] [element 0] | semantics.rb:354:13:354:13 | h : [collection] [element 0] | provenance | | +| semantics.rb:351:12:351:22 | call to source | semantics.rb:351:5:351:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:351:12:351:22 | call to source | semantics.rb:351:5:351:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:354:5:354:5 | x : [collection] [element 0] | semantics.rb:356:10:356:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:354:5:354:5 | x : [collection] [element 0] | semantics.rb:356:10:356:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:354:5:354:5 | x : [collection] [element 0] | semantics.rb:358:10:358:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:354:5:354:5 | x : [collection] [element 0] | semantics.rb:358:10:358:10 | x : [collection] [element 0] | provenance | | +| semantics.rb:354:9:354:14 | call to s43 : [collection] [element 0] | semantics.rb:354:5:354:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:354:9:354:14 | call to s43 : [collection] [element 0] | semantics.rb:354:5:354:5 | x : [collection] [element 0] | provenance | | +| semantics.rb:354:13:354:13 | h : [collection] [element 0] | semantics.rb:354:9:354:14 | call to s43 : [collection] [element 0] | provenance | | +| semantics.rb:354:13:354:13 | h : [collection] [element 0] | semantics.rb:354:9:354:14 | call to s43 : [collection] [element 0] | provenance | | +| semantics.rb:356:10:356:10 | x : [collection] [element 0] | semantics.rb:356:10:356:13 | ...[...] | provenance | | +| semantics.rb:356:10:356:10 | x : [collection] [element 0] | semantics.rb:356:10:356:13 | ...[...] | provenance | | +| semantics.rb:358:10:358:10 | x : [collection] [element 0] | semantics.rb:358:10:358:13 | ...[...] | provenance | | +| semantics.rb:358:10:358:10 | x : [collection] [element 0] | semantics.rb:358:10:358:13 | ...[...] | provenance | | +| semantics.rb:363:5:363:5 | [post] h : [collection] [element 1] | semantics.rb:366:9:366:9 | h : [collection] [element 1] | provenance | | +| semantics.rb:363:5:363:5 | [post] h : [collection] [element 1] | semantics.rb:366:9:366:9 | h : [collection] [element 1] | provenance | | +| semantics.rb:363:12:363:22 | call to source | semantics.rb:363:5:363:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:363:12:363:22 | call to source | semantics.rb:363:5:363:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | semantics.rb:369:10:369:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | semantics.rb:369:10:369:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | semantics.rb:370:10:370:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | semantics.rb:370:10:370:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:366:9:366:9 | h : [collection] [element 1] | semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:366:9:366:9 | h : [collection] [element 1] | semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:369:10:369:10 | h : [collection] [element 1] | semantics.rb:369:10:369:13 | ...[...] | provenance | | +| semantics.rb:369:10:369:10 | h : [collection] [element 1] | semantics.rb:369:10:369:13 | ...[...] | provenance | | +| semantics.rb:370:10:370:10 | h : [collection] [element 1] | semantics.rb:370:10:370:13 | ...[...] | provenance | | +| semantics.rb:370:10:370:10 | h : [collection] [element 1] | semantics.rb:370:10:370:13 | ...[...] | provenance | | +| semantics.rb:374:5:374:5 | [post] h : [collection] [element 0] | semantics.rb:375:5:375:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:374:5:374:5 | [post] h : [collection] [element 0] | semantics.rb:375:5:375:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:374:12:374:22 | call to source | semantics.rb:374:5:374:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:374:12:374:22 | call to source | semantics.rb:374:5:374:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | semantics.rb:378:10:378:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | semantics.rb:378:10:378:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | semantics.rb:380:10:380:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | semantics.rb:380:10:380:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semantics.rb:379:10:379:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semantics.rb:379:10:379:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semantics.rb:380:10:380:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semantics.rb:380:10:380:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semantics.rb:382:9:382:9 | h : [collection] [element 1] | provenance | | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semantics.rb:382:9:382:9 | h : [collection] [element 1] | provenance | | +| semantics.rb:375:5:375:5 | h : [collection] [element 0] | semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:375:5:375:5 | h : [collection] [element 0] | semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:375:12:375:22 | call to source | semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:375:12:375:22 | call to source | semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:378:10:378:10 | h : [collection] [element] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:378:10:378:10 | h : [collection] [element] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:379:10:379:10 | h : [collection] [element] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:379:10:379:10 | h : [collection] [element] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:380:10:380:10 | h : [collection] [element] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:380:10:380:10 | h : [collection] [element] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:382:9:382:9 | h : [collection] [element] | provenance | | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semantics.rb:382:9:382:9 | h : [collection] [element] | provenance | | +| semantics.rb:376:12:376:22 | call to source | semantics.rb:376:5:376:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:376:12:376:22 | call to source | semantics.rb:376:5:376:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:378:10:378:10 | h : [collection] [element 0] | semantics.rb:378:10:378:13 | ...[...] | provenance | | +| semantics.rb:378:10:378:10 | h : [collection] [element 0] | semantics.rb:378:10:378:13 | ...[...] | provenance | | +| semantics.rb:378:10:378:10 | h : [collection] [element] | semantics.rb:378:10:378:13 | ...[...] | provenance | | +| semantics.rb:378:10:378:10 | h : [collection] [element] | semantics.rb:378:10:378:13 | ...[...] | provenance | | +| semantics.rb:379:10:379:10 | h : [collection] [element 1] | semantics.rb:379:10:379:13 | ...[...] | provenance | | +| semantics.rb:379:10:379:10 | h : [collection] [element 1] | semantics.rb:379:10:379:13 | ...[...] | provenance | | +| semantics.rb:379:10:379:10 | h : [collection] [element] | semantics.rb:379:10:379:13 | ...[...] | provenance | | +| semantics.rb:379:10:379:10 | h : [collection] [element] | semantics.rb:379:10:379:13 | ...[...] | provenance | | +| semantics.rb:380:10:380:10 | h : [collection] [element 0] | semantics.rb:380:10:380:13 | ...[...] | provenance | | +| semantics.rb:380:10:380:10 | h : [collection] [element 0] | semantics.rb:380:10:380:13 | ...[...] | provenance | | +| semantics.rb:380:10:380:10 | h : [collection] [element 1] | semantics.rb:380:10:380:13 | ...[...] | provenance | | +| semantics.rb:380:10:380:10 | h : [collection] [element 1] | semantics.rb:380:10:380:13 | ...[...] | provenance | | +| semantics.rb:380:10:380:10 | h : [collection] [element] | semantics.rb:380:10:380:13 | ...[...] | provenance | | +| semantics.rb:380:10:380:10 | h : [collection] [element] | semantics.rb:380:10:380:13 | ...[...] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | semantics.rb:385:10:385:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | semantics.rb:385:10:385:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | semantics.rb:386:10:386:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | semantics.rb:386:10:386:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semantics.rb:384:10:384:10 | h : [collection] [element] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semantics.rb:384:10:384:10 | h : [collection] [element] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semantics.rb:385:10:385:10 | h : [collection] [element] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semantics.rb:385:10:385:10 | h : [collection] [element] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semantics.rb:386:10:386:10 | h : [collection] [element] | provenance | | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semantics.rb:386:10:386:10 | h : [collection] [element] | provenance | | +| semantics.rb:382:9:382:9 | h : [collection] [element 1] | semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:382:9:382:9 | h : [collection] [element 1] | semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:382:9:382:9 | h : [collection] [element] | semantics.rb:382:9:382:9 | [post] h : [collection] [element] | provenance | | +| semantics.rb:382:9:382:9 | h : [collection] [element] | semantics.rb:382:9:382:9 | [post] h : [collection] [element] | provenance | | +| semantics.rb:384:10:384:10 | h : [collection] [element] | semantics.rb:384:10:384:13 | ...[...] | provenance | | +| semantics.rb:384:10:384:10 | h : [collection] [element] | semantics.rb:384:10:384:13 | ...[...] | provenance | | +| semantics.rb:385:10:385:10 | h : [collection] [element 1] | semantics.rb:385:10:385:13 | ...[...] | provenance | | +| semantics.rb:385:10:385:10 | h : [collection] [element 1] | semantics.rb:385:10:385:13 | ...[...] | provenance | | +| semantics.rb:385:10:385:10 | h : [collection] [element] | semantics.rb:385:10:385:13 | ...[...] | provenance | | +| semantics.rb:385:10:385:10 | h : [collection] [element] | semantics.rb:385:10:385:13 | ...[...] | provenance | | +| semantics.rb:386:10:386:10 | h : [collection] [element 1] | semantics.rb:386:10:386:13 | ...[...] | provenance | | +| semantics.rb:386:10:386:10 | h : [collection] [element 1] | semantics.rb:386:10:386:13 | ...[...] | provenance | | +| semantics.rb:386:10:386:10 | h : [collection] [element] | semantics.rb:386:10:386:13 | ...[...] | provenance | | +| semantics.rb:386:10:386:10 | h : [collection] [element] | semantics.rb:386:10:386:13 | ...[...] | provenance | | +| semantics.rb:390:5:390:5 | [post] h : [collection] [element 0] | semantics.rb:391:5:391:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:390:5:390:5 | [post] h : [collection] [element 0] | semantics.rb:391:5:391:5 | h : [collection] [element 0] | provenance | | +| semantics.rb:390:12:390:22 | call to source | semantics.rb:390:5:390:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:390:12:390:22 | call to source | semantics.rb:390:5:390:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | semantics.rb:394:10:394:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | semantics.rb:394:10:394:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | semantics.rb:396:10:396:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | semantics.rb:396:10:396:10 | h : [collection] [element 0] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semantics.rb:395:10:395:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semantics.rb:395:10:395:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semantics.rb:396:10:396:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semantics.rb:396:10:396:10 | h : [collection] [element 1] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semantics.rb:398:13:398:13 | h : [collection] [element 1] | provenance | | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semantics.rb:398:13:398:13 | h : [collection] [element 1] | provenance | | +| semantics.rb:391:5:391:5 | h : [collection] [element 0] | semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:391:5:391:5 | h : [collection] [element 0] | semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | provenance | | +| semantics.rb:391:12:391:22 | call to source | semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:391:12:391:22 | call to source | semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | provenance | | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semantics.rb:394:10:394:10 | h : [collection] [element] | provenance | | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semantics.rb:394:10:394:10 | h : [collection] [element] | provenance | | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semantics.rb:395:10:395:10 | h : [collection] [element] | provenance | | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semantics.rb:395:10:395:10 | h : [collection] [element] | provenance | | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semantics.rb:396:10:396:10 | h : [collection] [element] | provenance | | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semantics.rb:396:10:396:10 | h : [collection] [element] | provenance | | +| semantics.rb:392:12:392:22 | call to source | semantics.rb:392:5:392:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:392:12:392:22 | call to source | semantics.rb:392:5:392:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:394:10:394:10 | h : [collection] [element 0] | semantics.rb:394:10:394:13 | ...[...] | provenance | | +| semantics.rb:394:10:394:10 | h : [collection] [element 0] | semantics.rb:394:10:394:13 | ...[...] | provenance | | +| semantics.rb:394:10:394:10 | h : [collection] [element] | semantics.rb:394:10:394:13 | ...[...] | provenance | | +| semantics.rb:394:10:394:10 | h : [collection] [element] | semantics.rb:394:10:394:13 | ...[...] | provenance | | +| semantics.rb:395:10:395:10 | h : [collection] [element 1] | semantics.rb:395:10:395:13 | ...[...] | provenance | | +| semantics.rb:395:10:395:10 | h : [collection] [element 1] | semantics.rb:395:10:395:13 | ...[...] | provenance | | +| semantics.rb:395:10:395:10 | h : [collection] [element] | semantics.rb:395:10:395:13 | ...[...] | provenance | | +| semantics.rb:395:10:395:10 | h : [collection] [element] | semantics.rb:395:10:395:13 | ...[...] | provenance | | +| semantics.rb:396:10:396:10 | h : [collection] [element 0] | semantics.rb:396:10:396:13 | ...[...] | provenance | | +| semantics.rb:396:10:396:10 | h : [collection] [element 0] | semantics.rb:396:10:396:13 | ...[...] | provenance | | +| semantics.rb:396:10:396:10 | h : [collection] [element 1] | semantics.rb:396:10:396:13 | ...[...] | provenance | | +| semantics.rb:396:10:396:10 | h : [collection] [element 1] | semantics.rb:396:10:396:13 | ...[...] | provenance | | +| semantics.rb:396:10:396:10 | h : [collection] [element] | semantics.rb:396:10:396:13 | ...[...] | provenance | | +| semantics.rb:396:10:396:10 | h : [collection] [element] | semantics.rb:396:10:396:13 | ...[...] | provenance | | +| semantics.rb:398:5:398:5 | x : [collection] [element 1] | semantics.rb:401:10:401:10 | x : [collection] [element 1] | provenance | | +| semantics.rb:398:5:398:5 | x : [collection] [element 1] | semantics.rb:401:10:401:10 | x : [collection] [element 1] | provenance | | +| semantics.rb:398:5:398:5 | x : [collection] [element 1] | semantics.rb:402:10:402:10 | x : [collection] [element 1] | provenance | | +| semantics.rb:398:5:398:5 | x : [collection] [element 1] | semantics.rb:402:10:402:10 | x : [collection] [element 1] | provenance | | +| semantics.rb:398:9:398:14 | call to s46 : [collection] [element 1] | semantics.rb:398:5:398:5 | x : [collection] [element 1] | provenance | | +| semantics.rb:398:9:398:14 | call to s46 : [collection] [element 1] | semantics.rb:398:5:398:5 | x : [collection] [element 1] | provenance | | +| semantics.rb:398:13:398:13 | h : [collection] [element 1] | semantics.rb:398:9:398:14 | call to s46 : [collection] [element 1] | provenance | | +| semantics.rb:398:13:398:13 | h : [collection] [element 1] | semantics.rb:398:9:398:14 | call to s46 : [collection] [element 1] | provenance | | +| semantics.rb:401:10:401:10 | x : [collection] [element 1] | semantics.rb:401:10:401:13 | ...[...] | provenance | | +| semantics.rb:401:10:401:10 | x : [collection] [element 1] | semantics.rb:401:10:401:13 | ...[...] | provenance | | +| semantics.rb:402:10:402:10 | x : [collection] [element 1] | semantics.rb:402:10:402:13 | ...[...] | provenance | | +| semantics.rb:402:10:402:10 | x : [collection] [element 1] | semantics.rb:402:10:402:13 | ...[...] | provenance | | +| semantics.rb:406:5:406:5 | [post] h : [collection] [element :foo] | semantics.rb:407:5:407:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:406:5:406:5 | [post] h : [collection] [element :foo] | semantics.rb:407:5:407:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:406:15:406:25 | call to source | semantics.rb:406:5:406:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:406:15:406:25 | call to source | semantics.rb:406:5:406:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | semantics.rb:411:10:411:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | semantics.rb:411:10:411:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | semantics.rb:413:13:413:13 | h : [collection] [element :bar] | provenance | | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | semantics.rb:413:13:413:13 | h : [collection] [element :bar] | provenance | | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :foo] | semantics.rb:410:10:410:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :foo] | semantics.rb:410:10:410:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:407:5:407:5 | h : [collection] [element :foo] | semantics.rb:407:5:407:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:407:5:407:5 | h : [collection] [element :foo] | semantics.rb:407:5:407:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:407:15:407:25 | call to source | semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:407:15:407:25 | call to source | semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:408:5:408:5 | [post] h : [collection] [element] | semantics.rb:410:10:410:10 | h : [collection] [element] | provenance | | +| semantics.rb:408:5:408:5 | [post] h : [collection] [element] | semantics.rb:410:10:410:10 | h : [collection] [element] | provenance | | +| semantics.rb:408:5:408:5 | [post] h : [collection] [element] | semantics.rb:411:10:411:10 | h : [collection] [element] | provenance | | +| semantics.rb:408:5:408:5 | [post] h : [collection] [element] | semantics.rb:411:10:411:10 | h : [collection] [element] | provenance | | +| semantics.rb:408:12:408:22 | call to source | semantics.rb:408:5:408:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:408:12:408:22 | call to source | semantics.rb:408:5:408:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:410:10:410:10 | h : [collection] [element :foo] | semantics.rb:410:10:410:16 | ...[...] | provenance | | +| semantics.rb:410:10:410:10 | h : [collection] [element :foo] | semantics.rb:410:10:410:16 | ...[...] | provenance | | +| semantics.rb:410:10:410:10 | h : [collection] [element] | semantics.rb:410:10:410:16 | ...[...] | provenance | | +| semantics.rb:410:10:410:10 | h : [collection] [element] | semantics.rb:410:10:410:16 | ...[...] | provenance | | +| semantics.rb:411:10:411:10 | h : [collection] [element :bar] | semantics.rb:411:10:411:16 | ...[...] | provenance | | +| semantics.rb:411:10:411:10 | h : [collection] [element :bar] | semantics.rb:411:10:411:16 | ...[...] | provenance | | +| semantics.rb:411:10:411:10 | h : [collection] [element] | semantics.rb:411:10:411:16 | ...[...] | provenance | | +| semantics.rb:411:10:411:10 | h : [collection] [element] | semantics.rb:411:10:411:16 | ...[...] | provenance | | +| semantics.rb:413:5:413:5 | x : [collection] [element :bar] | semantics.rb:416:10:416:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:413:5:413:5 | x : [collection] [element :bar] | semantics.rb:416:10:416:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:413:9:413:14 | call to s47 : [collection] [element :bar] | semantics.rb:413:5:413:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:413:9:413:14 | call to s47 : [collection] [element :bar] | semantics.rb:413:5:413:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:413:13:413:13 | h : [collection] [element :bar] | semantics.rb:413:9:413:14 | call to s47 : [collection] [element :bar] | provenance | | +| semantics.rb:413:13:413:13 | h : [collection] [element :bar] | semantics.rb:413:9:413:14 | call to s47 : [collection] [element :bar] | provenance | | +| semantics.rb:416:10:416:10 | x : [collection] [element :bar] | semantics.rb:416:10:416:16 | ...[...] | provenance | | +| semantics.rb:416:10:416:10 | x : [collection] [element :bar] | semantics.rb:416:10:416:16 | ...[...] | provenance | | +| semantics.rb:420:5:420:5 | [post] h : [collection] [element :foo] | semantics.rb:421:5:421:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:420:5:420:5 | [post] h : [collection] [element :foo] | semantics.rb:421:5:421:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:420:15:420:25 | call to source | semantics.rb:420:5:420:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:420:15:420:25 | call to source | semantics.rb:420:5:420:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | semantics.rb:425:10:425:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | semantics.rb:425:10:425:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | semantics.rb:427:13:427:13 | h : [collection] [element :bar] | provenance | | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | semantics.rb:427:13:427:13 | h : [collection] [element :bar] | provenance | | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :foo] | semantics.rb:424:10:424:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :foo] | semantics.rb:424:10:424:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:421:5:421:5 | h : [collection] [element :foo] | semantics.rb:421:5:421:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:421:5:421:5 | h : [collection] [element :foo] | semantics.rb:421:5:421:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:421:15:421:25 | call to source | semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:421:15:421:25 | call to source | semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:422:5:422:5 | [post] h : [collection] [element] | semantics.rb:424:10:424:10 | h : [collection] [element] | provenance | | +| semantics.rb:422:5:422:5 | [post] h : [collection] [element] | semantics.rb:424:10:424:10 | h : [collection] [element] | provenance | | +| semantics.rb:422:5:422:5 | [post] h : [collection] [element] | semantics.rb:425:10:425:10 | h : [collection] [element] | provenance | | +| semantics.rb:422:5:422:5 | [post] h : [collection] [element] | semantics.rb:425:10:425:10 | h : [collection] [element] | provenance | | +| semantics.rb:422:12:422:22 | call to source | semantics.rb:422:5:422:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:422:12:422:22 | call to source | semantics.rb:422:5:422:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:424:10:424:10 | h : [collection] [element :foo] | semantics.rb:424:10:424:16 | ...[...] | provenance | | +| semantics.rb:424:10:424:10 | h : [collection] [element :foo] | semantics.rb:424:10:424:16 | ...[...] | provenance | | +| semantics.rb:424:10:424:10 | h : [collection] [element] | semantics.rb:424:10:424:16 | ...[...] | provenance | | +| semantics.rb:424:10:424:10 | h : [collection] [element] | semantics.rb:424:10:424:16 | ...[...] | provenance | | +| semantics.rb:425:10:425:10 | h : [collection] [element :bar] | semantics.rb:425:10:425:16 | ...[...] | provenance | | +| semantics.rb:425:10:425:10 | h : [collection] [element :bar] | semantics.rb:425:10:425:16 | ...[...] | provenance | | +| semantics.rb:425:10:425:10 | h : [collection] [element] | semantics.rb:425:10:425:16 | ...[...] | provenance | | +| semantics.rb:425:10:425:10 | h : [collection] [element] | semantics.rb:425:10:425:16 | ...[...] | provenance | | +| semantics.rb:427:5:427:5 | x : [collection] [element :bar] | semantics.rb:430:10:430:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:427:5:427:5 | x : [collection] [element :bar] | semantics.rb:430:10:430:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:427:9:427:14 | call to s48 : [collection] [element :bar] | semantics.rb:427:5:427:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:427:9:427:14 | call to s48 : [collection] [element :bar] | semantics.rb:427:5:427:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:427:13:427:13 | h : [collection] [element :bar] | semantics.rb:427:9:427:14 | call to s48 : [collection] [element :bar] | provenance | | +| semantics.rb:427:13:427:13 | h : [collection] [element :bar] | semantics.rb:427:9:427:14 | call to s48 : [collection] [element :bar] | provenance | | +| semantics.rb:430:10:430:10 | x : [collection] [element :bar] | semantics.rb:430:10:430:16 | ...[...] | provenance | | +| semantics.rb:430:10:430:10 | x : [collection] [element :bar] | semantics.rb:430:10:430:16 | ...[...] | provenance | | +| semantics.rb:434:5:434:5 | [post] h : [collection] [element :foo] | semantics.rb:435:5:435:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:434:5:434:5 | [post] h : [collection] [element :foo] | semantics.rb:435:5:435:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:434:15:434:25 | call to source | semantics.rb:434:5:434:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:434:15:434:25 | call to source | semantics.rb:434:5:434:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | semantics.rb:439:10:439:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | semantics.rb:439:10:439:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | semantics.rb:441:13:441:13 | h : [collection] [element :bar] | provenance | | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | semantics.rb:441:13:441:13 | h : [collection] [element :bar] | provenance | | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :foo] | semantics.rb:438:10:438:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :foo] | semantics.rb:438:10:438:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:435:5:435:5 | h : [collection] [element :foo] | semantics.rb:435:5:435:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:435:5:435:5 | h : [collection] [element :foo] | semantics.rb:435:5:435:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:435:15:435:25 | call to source | semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:435:15:435:25 | call to source | semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semantics.rb:438:10:438:10 | h : [collection] [element] | provenance | | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semantics.rb:438:10:438:10 | h : [collection] [element] | provenance | | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semantics.rb:439:10:439:10 | h : [collection] [element] | provenance | | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semantics.rb:439:10:439:10 | h : [collection] [element] | provenance | | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semantics.rb:441:13:441:13 | h : [collection] [element] | provenance | | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semantics.rb:441:13:441:13 | h : [collection] [element] | provenance | | +| semantics.rb:436:12:436:22 | call to source | semantics.rb:436:5:436:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:436:12:436:22 | call to source | semantics.rb:436:5:436:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:438:10:438:10 | h : [collection] [element :foo] | semantics.rb:438:10:438:16 | ...[...] | provenance | | +| semantics.rb:438:10:438:10 | h : [collection] [element :foo] | semantics.rb:438:10:438:16 | ...[...] | provenance | | +| semantics.rb:438:10:438:10 | h : [collection] [element] | semantics.rb:438:10:438:16 | ...[...] | provenance | | +| semantics.rb:438:10:438:10 | h : [collection] [element] | semantics.rb:438:10:438:16 | ...[...] | provenance | | +| semantics.rb:439:10:439:10 | h : [collection] [element :bar] | semantics.rb:439:10:439:16 | ...[...] | provenance | | +| semantics.rb:439:10:439:10 | h : [collection] [element :bar] | semantics.rb:439:10:439:16 | ...[...] | provenance | | +| semantics.rb:439:10:439:10 | h : [collection] [element] | semantics.rb:439:10:439:16 | ...[...] | provenance | | +| semantics.rb:439:10:439:10 | h : [collection] [element] | semantics.rb:439:10:439:16 | ...[...] | provenance | | +| semantics.rb:441:5:441:5 | x : [collection] [element :bar] | semantics.rb:444:10:444:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:441:5:441:5 | x : [collection] [element :bar] | semantics.rb:444:10:444:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:441:5:441:5 | x : [collection] [element] | semantics.rb:443:10:443:10 | x : [collection] [element] | provenance | | +| semantics.rb:441:5:441:5 | x : [collection] [element] | semantics.rb:443:10:443:10 | x : [collection] [element] | provenance | | +| semantics.rb:441:5:441:5 | x : [collection] [element] | semantics.rb:444:10:444:10 | x : [collection] [element] | provenance | | +| semantics.rb:441:5:441:5 | x : [collection] [element] | semantics.rb:444:10:444:10 | x : [collection] [element] | provenance | | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element :bar] | semantics.rb:441:5:441:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element :bar] | semantics.rb:441:5:441:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element] | semantics.rb:441:5:441:5 | x : [collection] [element] | provenance | | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element] | semantics.rb:441:5:441:5 | x : [collection] [element] | provenance | | +| semantics.rb:441:13:441:13 | h : [collection] [element :bar] | semantics.rb:441:9:441:14 | call to s49 : [collection] [element :bar] | provenance | | +| semantics.rb:441:13:441:13 | h : [collection] [element :bar] | semantics.rb:441:9:441:14 | call to s49 : [collection] [element :bar] | provenance | | +| semantics.rb:441:13:441:13 | h : [collection] [element] | semantics.rb:441:9:441:14 | call to s49 : [collection] [element] | provenance | | +| semantics.rb:441:13:441:13 | h : [collection] [element] | semantics.rb:441:9:441:14 | call to s49 : [collection] [element] | provenance | | +| semantics.rb:443:10:443:10 | x : [collection] [element] | semantics.rb:443:10:443:16 | ...[...] | provenance | | +| semantics.rb:443:10:443:10 | x : [collection] [element] | semantics.rb:443:10:443:16 | ...[...] | provenance | | +| semantics.rb:444:10:444:10 | x : [collection] [element :bar] | semantics.rb:444:10:444:16 | ...[...] | provenance | | +| semantics.rb:444:10:444:10 | x : [collection] [element :bar] | semantics.rb:444:10:444:16 | ...[...] | provenance | | +| semantics.rb:444:10:444:10 | x : [collection] [element] | semantics.rb:444:10:444:16 | ...[...] | provenance | | +| semantics.rb:444:10:444:10 | x : [collection] [element] | semantics.rb:444:10:444:16 | ...[...] | provenance | | +| semantics.rb:448:5:448:5 | [post] h : [collection] [element :foo] | semantics.rb:449:5:449:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:448:5:448:5 | [post] h : [collection] [element :foo] | semantics.rb:449:5:449:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:448:15:448:25 | call to source | semantics.rb:448:5:448:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:448:15:448:25 | call to source | semantics.rb:448:5:448:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | semantics.rb:453:10:453:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | semantics.rb:453:10:453:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | semantics.rb:455:9:455:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | semantics.rb:455:9:455:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :foo] | semantics.rb:452:10:452:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :foo] | semantics.rb:452:10:452:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:449:5:449:5 | h : [collection] [element :foo] | semantics.rb:449:5:449:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:449:5:449:5 | h : [collection] [element :foo] | semantics.rb:449:5:449:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:449:15:449:25 | call to source | semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:449:15:449:25 | call to source | semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:450:5:450:5 | [post] h : [collection] [element] | semantics.rb:452:10:452:10 | h : [collection] [element] | provenance | | +| semantics.rb:450:5:450:5 | [post] h : [collection] [element] | semantics.rb:452:10:452:10 | h : [collection] [element] | provenance | | +| semantics.rb:450:5:450:5 | [post] h : [collection] [element] | semantics.rb:453:10:453:10 | h : [collection] [element] | provenance | | +| semantics.rb:450:5:450:5 | [post] h : [collection] [element] | semantics.rb:453:10:453:10 | h : [collection] [element] | provenance | | +| semantics.rb:450:12:450:22 | call to source | semantics.rb:450:5:450:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:450:12:450:22 | call to source | semantics.rb:450:5:450:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:452:10:452:10 | h : [collection] [element :foo] | semantics.rb:452:10:452:16 | ...[...] | provenance | | +| semantics.rb:452:10:452:10 | h : [collection] [element :foo] | semantics.rb:452:10:452:16 | ...[...] | provenance | | +| semantics.rb:452:10:452:10 | h : [collection] [element] | semantics.rb:452:10:452:16 | ...[...] | provenance | | +| semantics.rb:452:10:452:10 | h : [collection] [element] | semantics.rb:452:10:452:16 | ...[...] | provenance | | +| semantics.rb:453:10:453:10 | h : [collection] [element :bar] | semantics.rb:453:10:453:16 | ...[...] | provenance | | +| semantics.rb:453:10:453:10 | h : [collection] [element :bar] | semantics.rb:453:10:453:16 | ...[...] | provenance | | +| semantics.rb:453:10:453:10 | h : [collection] [element] | semantics.rb:453:10:453:16 | ...[...] | provenance | | +| semantics.rb:453:10:453:10 | h : [collection] [element] | semantics.rb:453:10:453:16 | ...[...] | provenance | | +| semantics.rb:455:9:455:9 | [post] h : [collection] [element :bar] | semantics.rb:458:10:458:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:455:9:455:9 | [post] h : [collection] [element :bar] | semantics.rb:458:10:458:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:455:9:455:9 | h : [collection] [element :bar] | semantics.rb:455:9:455:9 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:455:9:455:9 | h : [collection] [element :bar] | semantics.rb:455:9:455:9 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:458:10:458:10 | h : [collection] [element :bar] | semantics.rb:458:10:458:16 | ...[...] | provenance | | +| semantics.rb:458:10:458:10 | h : [collection] [element :bar] | semantics.rb:458:10:458:16 | ...[...] | provenance | | +| semantics.rb:462:5:462:5 | [post] h : [collection] [element :foo] | semantics.rb:463:5:463:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:462:5:462:5 | [post] h : [collection] [element :foo] | semantics.rb:463:5:463:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:462:15:462:25 | call to source | semantics.rb:462:5:462:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:462:15:462:25 | call to source | semantics.rb:462:5:462:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | semantics.rb:467:10:467:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | semantics.rb:467:10:467:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | semantics.rb:469:9:469:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | semantics.rb:469:9:469:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :foo] | semantics.rb:466:10:466:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :foo] | semantics.rb:466:10:466:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:463:5:463:5 | h : [collection] [element :foo] | semantics.rb:463:5:463:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:463:5:463:5 | h : [collection] [element :foo] | semantics.rb:463:5:463:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:463:15:463:25 | call to source | semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:463:15:463:25 | call to source | semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semantics.rb:466:10:466:10 | h : [collection] [element] | provenance | | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semantics.rb:466:10:466:10 | h : [collection] [element] | provenance | | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semantics.rb:467:10:467:10 | h : [collection] [element] | provenance | | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semantics.rb:467:10:467:10 | h : [collection] [element] | provenance | | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semantics.rb:469:9:469:9 | h : [collection] [element] | provenance | | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semantics.rb:469:9:469:9 | h : [collection] [element] | provenance | | +| semantics.rb:464:12:464:22 | call to source | semantics.rb:464:5:464:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:464:12:464:22 | call to source | semantics.rb:464:5:464:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:466:10:466:10 | h : [collection] [element :foo] | semantics.rb:466:10:466:16 | ...[...] | provenance | | +| semantics.rb:466:10:466:10 | h : [collection] [element :foo] | semantics.rb:466:10:466:16 | ...[...] | provenance | | +| semantics.rb:466:10:466:10 | h : [collection] [element] | semantics.rb:466:10:466:16 | ...[...] | provenance | | +| semantics.rb:466:10:466:10 | h : [collection] [element] | semantics.rb:466:10:466:16 | ...[...] | provenance | | +| semantics.rb:467:10:467:10 | h : [collection] [element :bar] | semantics.rb:467:10:467:16 | ...[...] | provenance | | +| semantics.rb:467:10:467:10 | h : [collection] [element :bar] | semantics.rb:467:10:467:16 | ...[...] | provenance | | +| semantics.rb:467:10:467:10 | h : [collection] [element] | semantics.rb:467:10:467:16 | ...[...] | provenance | | +| semantics.rb:467:10:467:10 | h : [collection] [element] | semantics.rb:467:10:467:16 | ...[...] | provenance | | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element :bar] | semantics.rb:472:10:472:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element :bar] | semantics.rb:472:10:472:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element] | semantics.rb:471:10:471:10 | h : [collection] [element] | provenance | | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element] | semantics.rb:471:10:471:10 | h : [collection] [element] | provenance | | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element] | semantics.rb:472:10:472:10 | h : [collection] [element] | provenance | | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element] | semantics.rb:472:10:472:10 | h : [collection] [element] | provenance | | +| semantics.rb:469:9:469:9 | h : [collection] [element :bar] | semantics.rb:469:9:469:9 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:469:9:469:9 | h : [collection] [element :bar] | semantics.rb:469:9:469:9 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:469:9:469:9 | h : [collection] [element] | semantics.rb:469:9:469:9 | [post] h : [collection] [element] | provenance | | +| semantics.rb:469:9:469:9 | h : [collection] [element] | semantics.rb:469:9:469:9 | [post] h : [collection] [element] | provenance | | +| semantics.rb:471:10:471:10 | h : [collection] [element] | semantics.rb:471:10:471:16 | ...[...] | provenance | | +| semantics.rb:471:10:471:10 | h : [collection] [element] | semantics.rb:471:10:471:16 | ...[...] | provenance | | +| semantics.rb:472:10:472:10 | h : [collection] [element :bar] | semantics.rb:472:10:472:16 | ...[...] | provenance | | +| semantics.rb:472:10:472:10 | h : [collection] [element :bar] | semantics.rb:472:10:472:16 | ...[...] | provenance | | +| semantics.rb:472:10:472:10 | h : [collection] [element] | semantics.rb:472:10:472:16 | ...[...] | provenance | | +| semantics.rb:472:10:472:10 | h : [collection] [element] | semantics.rb:472:10:472:16 | ...[...] | provenance | | +| semantics.rb:476:5:476:5 | [post] h : [collection] [element :foo] | semantics.rb:477:5:477:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:476:5:476:5 | [post] h : [collection] [element :foo] | semantics.rb:477:5:477:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:476:15:476:25 | call to source | semantics.rb:476:5:476:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:476:15:476:25 | call to source | semantics.rb:476:5:476:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | semantics.rb:481:10:481:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | semantics.rb:481:10:481:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | semantics.rb:483:5:483:5 | h : [collection] [element :bar] | provenance | | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | semantics.rb:483:5:483:5 | h : [collection] [element :bar] | provenance | | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :foo] | semantics.rb:480:10:480:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :foo] | semantics.rb:480:10:480:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:477:5:477:5 | h : [collection] [element :foo] | semantics.rb:477:5:477:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:477:5:477:5 | h : [collection] [element :foo] | semantics.rb:477:5:477:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:477:15:477:25 | call to source | semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:477:15:477:25 | call to source | semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:478:5:478:5 | [post] h : [collection] [element] | semantics.rb:480:10:480:10 | h : [collection] [element] | provenance | | +| semantics.rb:478:5:478:5 | [post] h : [collection] [element] | semantics.rb:480:10:480:10 | h : [collection] [element] | provenance | | +| semantics.rb:478:5:478:5 | [post] h : [collection] [element] | semantics.rb:481:10:481:10 | h : [collection] [element] | provenance | | +| semantics.rb:478:5:478:5 | [post] h : [collection] [element] | semantics.rb:481:10:481:10 | h : [collection] [element] | provenance | | +| semantics.rb:478:12:478:22 | call to source | semantics.rb:478:5:478:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:478:12:478:22 | call to source | semantics.rb:478:5:478:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:480:10:480:10 | h : [collection] [element :foo] | semantics.rb:480:10:480:16 | ...[...] | provenance | | +| semantics.rb:480:10:480:10 | h : [collection] [element :foo] | semantics.rb:480:10:480:16 | ...[...] | provenance | | +| semantics.rb:480:10:480:10 | h : [collection] [element] | semantics.rb:480:10:480:16 | ...[...] | provenance | | +| semantics.rb:480:10:480:10 | h : [collection] [element] | semantics.rb:480:10:480:16 | ...[...] | provenance | | +| semantics.rb:481:10:481:10 | h : [collection] [element :bar] | semantics.rb:481:10:481:16 | ...[...] | provenance | | +| semantics.rb:481:10:481:10 | h : [collection] [element :bar] | semantics.rb:481:10:481:16 | ...[...] | provenance | | +| semantics.rb:481:10:481:10 | h : [collection] [element] | semantics.rb:481:10:481:16 | ...[...] | provenance | | +| semantics.rb:481:10:481:10 | h : [collection] [element] | semantics.rb:481:10:481:16 | ...[...] | provenance | | +| semantics.rb:483:5:483:5 | [post] h : [collection] [element :bar] | semantics.rb:486:10:486:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:483:5:483:5 | [post] h : [collection] [element :bar] | semantics.rb:486:10:486:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:483:5:483:5 | h : [collection] [element :bar] | semantics.rb:483:5:483:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:483:5:483:5 | h : [collection] [element :bar] | semantics.rb:483:5:483:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:486:10:486:10 | h : [collection] [element :bar] | semantics.rb:486:10:486:16 | ...[...] | provenance | | +| semantics.rb:486:10:486:10 | h : [collection] [element :bar] | semantics.rb:486:10:486:16 | ...[...] | provenance | | +| semantics.rb:490:5:490:5 | [post] h : [collection] [element :foo] | semantics.rb:491:5:491:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:490:5:490:5 | [post] h : [collection] [element :foo] | semantics.rb:491:5:491:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:490:15:490:25 | call to source | semantics.rb:490:5:490:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:490:15:490:25 | call to source | semantics.rb:490:5:490:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | semantics.rb:495:10:495:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | semantics.rb:495:10:495:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | semantics.rb:497:9:497:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | semantics.rb:497:9:497:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :foo] | semantics.rb:494:10:494:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :foo] | semantics.rb:494:10:494:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:491:5:491:5 | h : [collection] [element :foo] | semantics.rb:491:5:491:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:491:5:491:5 | h : [collection] [element :foo] | semantics.rb:491:5:491:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:491:15:491:25 | call to source | semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:491:15:491:25 | call to source | semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:492:5:492:5 | [post] h : [collection] [element] | semantics.rb:494:10:494:10 | h : [collection] [element] | provenance | | +| semantics.rb:492:5:492:5 | [post] h : [collection] [element] | semantics.rb:494:10:494:10 | h : [collection] [element] | provenance | | +| semantics.rb:492:5:492:5 | [post] h : [collection] [element] | semantics.rb:495:10:495:10 | h : [collection] [element] | provenance | | +| semantics.rb:492:5:492:5 | [post] h : [collection] [element] | semantics.rb:495:10:495:10 | h : [collection] [element] | provenance | | +| semantics.rb:492:12:492:22 | call to source | semantics.rb:492:5:492:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:492:12:492:22 | call to source | semantics.rb:492:5:492:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:494:10:494:10 | h : [collection] [element :foo] | semantics.rb:494:10:494:16 | ...[...] | provenance | | +| semantics.rb:494:10:494:10 | h : [collection] [element :foo] | semantics.rb:494:10:494:16 | ...[...] | provenance | | +| semantics.rb:494:10:494:10 | h : [collection] [element] | semantics.rb:494:10:494:16 | ...[...] | provenance | | +| semantics.rb:494:10:494:10 | h : [collection] [element] | semantics.rb:494:10:494:16 | ...[...] | provenance | | +| semantics.rb:495:10:495:10 | h : [collection] [element :bar] | semantics.rb:495:10:495:16 | ...[...] | provenance | | +| semantics.rb:495:10:495:10 | h : [collection] [element :bar] | semantics.rb:495:10:495:16 | ...[...] | provenance | | +| semantics.rb:495:10:495:10 | h : [collection] [element] | semantics.rb:495:10:495:16 | ...[...] | provenance | | +| semantics.rb:495:10:495:10 | h : [collection] [element] | semantics.rb:495:10:495:16 | ...[...] | provenance | | +| semantics.rb:497:5:497:5 | x : [collection] [element :bar] | semantics.rb:500:10:500:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:497:5:497:5 | x : [collection] [element :bar] | semantics.rb:500:10:500:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:497:9:497:9 | h : [collection] [element :bar] | semantics.rb:497:9:497:15 | call to s53 : [collection] [element :bar] | provenance | | +| semantics.rb:497:9:497:9 | h : [collection] [element :bar] | semantics.rb:497:9:497:15 | call to s53 : [collection] [element :bar] | provenance | | +| semantics.rb:497:9:497:15 | call to s53 : [collection] [element :bar] | semantics.rb:497:5:497:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:497:9:497:15 | call to s53 : [collection] [element :bar] | semantics.rb:497:5:497:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:500:10:500:10 | x : [collection] [element :bar] | semantics.rb:500:10:500:16 | ...[...] | provenance | | +| semantics.rb:500:10:500:10 | x : [collection] [element :bar] | semantics.rb:500:10:500:16 | ...[...] | provenance | | | semantics.rb:502:10:502:20 | call to source | semantics.rb:502:10:502:26 | call to s53 | provenance | | | semantics.rb:502:10:502:20 | call to source | semantics.rb:502:10:502:26 | call to s53 | provenance | | -| semantics.rb:506:5:506:5 | [post] h [element :foo] | semantics.rb:507:5:507:5 | h [element :foo] | provenance | | -| semantics.rb:506:5:506:5 | [post] h [element :foo] | semantics.rb:507:5:507:5 | h [element :foo] | provenance | | -| semantics.rb:506:15:506:25 | call to source | semantics.rb:506:5:506:5 | [post] h [element :foo] | provenance | | -| semantics.rb:506:15:506:25 | call to source | semantics.rb:506:5:506:5 | [post] h [element :foo] | provenance | | -| semantics.rb:507:5:507:5 | [post] h [element :bar] | semantics.rb:511:10:511:10 | h [element :bar] | provenance | | -| semantics.rb:507:5:507:5 | [post] h [element :bar] | semantics.rb:511:10:511:10 | h [element :bar] | provenance | | -| semantics.rb:507:5:507:5 | [post] h [element :bar] | semantics.rb:513:9:513:9 | h [element :bar] | provenance | | -| semantics.rb:507:5:507:5 | [post] h [element :bar] | semantics.rb:513:9:513:9 | h [element :bar] | provenance | | -| semantics.rb:507:5:507:5 | [post] h [element :foo] | semantics.rb:510:10:510:10 | h [element :foo] | provenance | | -| semantics.rb:507:5:507:5 | [post] h [element :foo] | semantics.rb:510:10:510:10 | h [element :foo] | provenance | | -| semantics.rb:507:5:507:5 | h [element :foo] | semantics.rb:507:5:507:5 | [post] h [element :foo] | provenance | | -| semantics.rb:507:5:507:5 | h [element :foo] | semantics.rb:507:5:507:5 | [post] h [element :foo] | provenance | | -| semantics.rb:507:15:507:25 | call to source | semantics.rb:507:5:507:5 | [post] h [element :bar] | provenance | | -| semantics.rb:507:15:507:25 | call to source | semantics.rb:507:5:507:5 | [post] h [element :bar] | provenance | | -| semantics.rb:508:5:508:5 | [post] h [element] | semantics.rb:510:10:510:10 | h [element] | provenance | | -| semantics.rb:508:5:508:5 | [post] h [element] | semantics.rb:510:10:510:10 | h [element] | provenance | | -| semantics.rb:508:5:508:5 | [post] h [element] | semantics.rb:511:10:511:10 | h [element] | provenance | | -| semantics.rb:508:5:508:5 | [post] h [element] | semantics.rb:511:10:511:10 | h [element] | provenance | | -| semantics.rb:508:12:508:22 | call to source | semantics.rb:508:5:508:5 | [post] h [element] | provenance | | -| semantics.rb:508:12:508:22 | call to source | semantics.rb:508:5:508:5 | [post] h [element] | provenance | | -| semantics.rb:510:10:510:10 | h [element :foo] | semantics.rb:510:10:510:16 | ...[...] | provenance | | -| semantics.rb:510:10:510:10 | h [element :foo] | semantics.rb:510:10:510:16 | ...[...] | provenance | | -| semantics.rb:510:10:510:10 | h [element] | semantics.rb:510:10:510:16 | ...[...] | provenance | | -| semantics.rb:510:10:510:10 | h [element] | semantics.rb:510:10:510:16 | ...[...] | provenance | | -| semantics.rb:511:10:511:10 | h [element :bar] | semantics.rb:511:10:511:16 | ...[...] | provenance | | -| semantics.rb:511:10:511:10 | h [element :bar] | semantics.rb:511:10:511:16 | ...[...] | provenance | | -| semantics.rb:511:10:511:10 | h [element] | semantics.rb:511:10:511:16 | ...[...] | provenance | | -| semantics.rb:511:10:511:10 | h [element] | semantics.rb:511:10:511:16 | ...[...] | provenance | | -| semantics.rb:513:5:513:5 | x [element :bar] | semantics.rb:516:10:516:10 | x [element :bar] | provenance | | -| semantics.rb:513:5:513:5 | x [element :bar] | semantics.rb:516:10:516:10 | x [element :bar] | provenance | | -| semantics.rb:513:9:513:9 | h [element :bar] | semantics.rb:513:9:513:15 | call to s54 [element :bar] | provenance | | -| semantics.rb:513:9:513:9 | h [element :bar] | semantics.rb:513:9:513:15 | call to s54 [element :bar] | provenance | | -| semantics.rb:513:9:513:15 | call to s54 [element :bar] | semantics.rb:513:5:513:5 | x [element :bar] | provenance | | -| semantics.rb:513:9:513:15 | call to s54 [element :bar] | semantics.rb:513:5:513:5 | x [element :bar] | provenance | | -| semantics.rb:516:10:516:10 | x [element :bar] | semantics.rb:516:10:516:16 | ...[...] | provenance | | -| semantics.rb:516:10:516:10 | x [element :bar] | semantics.rb:516:10:516:16 | ...[...] | provenance | | +| semantics.rb:506:5:506:5 | [post] h : [collection] [element :foo] | semantics.rb:507:5:507:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:506:5:506:5 | [post] h : [collection] [element :foo] | semantics.rb:507:5:507:5 | h : [collection] [element :foo] | provenance | | +| semantics.rb:506:15:506:25 | call to source | semantics.rb:506:5:506:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:506:15:506:25 | call to source | semantics.rb:506:5:506:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | semantics.rb:511:10:511:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | semantics.rb:511:10:511:10 | h : [collection] [element :bar] | provenance | | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | semantics.rb:513:9:513:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | semantics.rb:513:9:513:9 | h : [collection] [element :bar] | provenance | | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :foo] | semantics.rb:510:10:510:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :foo] | semantics.rb:510:10:510:10 | h : [collection] [element :foo] | provenance | | +| semantics.rb:507:5:507:5 | h : [collection] [element :foo] | semantics.rb:507:5:507:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:507:5:507:5 | h : [collection] [element :foo] | semantics.rb:507:5:507:5 | [post] h : [collection] [element :foo] | provenance | | +| semantics.rb:507:15:507:25 | call to source | semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:507:15:507:25 | call to source | semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | provenance | | +| semantics.rb:508:5:508:5 | [post] h : [collection] [element] | semantics.rb:510:10:510:10 | h : [collection] [element] | provenance | | +| semantics.rb:508:5:508:5 | [post] h : [collection] [element] | semantics.rb:510:10:510:10 | h : [collection] [element] | provenance | | +| semantics.rb:508:5:508:5 | [post] h : [collection] [element] | semantics.rb:511:10:511:10 | h : [collection] [element] | provenance | | +| semantics.rb:508:5:508:5 | [post] h : [collection] [element] | semantics.rb:511:10:511:10 | h : [collection] [element] | provenance | | +| semantics.rb:508:12:508:22 | call to source | semantics.rb:508:5:508:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:508:12:508:22 | call to source | semantics.rb:508:5:508:5 | [post] h : [collection] [element] | provenance | | +| semantics.rb:510:10:510:10 | h : [collection] [element :foo] | semantics.rb:510:10:510:16 | ...[...] | provenance | | +| semantics.rb:510:10:510:10 | h : [collection] [element :foo] | semantics.rb:510:10:510:16 | ...[...] | provenance | | +| semantics.rb:510:10:510:10 | h : [collection] [element] | semantics.rb:510:10:510:16 | ...[...] | provenance | | +| semantics.rb:510:10:510:10 | h : [collection] [element] | semantics.rb:510:10:510:16 | ...[...] | provenance | | +| semantics.rb:511:10:511:10 | h : [collection] [element :bar] | semantics.rb:511:10:511:16 | ...[...] | provenance | | +| semantics.rb:511:10:511:10 | h : [collection] [element :bar] | semantics.rb:511:10:511:16 | ...[...] | provenance | | +| semantics.rb:511:10:511:10 | h : [collection] [element] | semantics.rb:511:10:511:16 | ...[...] | provenance | | +| semantics.rb:511:10:511:10 | h : [collection] [element] | semantics.rb:511:10:511:16 | ...[...] | provenance | | +| semantics.rb:513:5:513:5 | x : [collection] [element :bar] | semantics.rb:516:10:516:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:513:5:513:5 | x : [collection] [element :bar] | semantics.rb:516:10:516:10 | x : [collection] [element :bar] | provenance | | +| semantics.rb:513:9:513:9 | h : [collection] [element :bar] | semantics.rb:513:9:513:15 | call to s54 : [collection] [element :bar] | provenance | | +| semantics.rb:513:9:513:9 | h : [collection] [element :bar] | semantics.rb:513:9:513:15 | call to s54 : [collection] [element :bar] | provenance | | +| semantics.rb:513:9:513:15 | call to s54 : [collection] [element :bar] | semantics.rb:513:5:513:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:513:9:513:15 | call to s54 : [collection] [element :bar] | semantics.rb:513:5:513:5 | x : [collection] [element :bar] | provenance | | +| semantics.rb:516:10:516:10 | x : [collection] [element :bar] | semantics.rb:516:10:516:16 | ...[...] | provenance | | +| semantics.rb:516:10:516:10 | x : [collection] [element :bar] | semantics.rb:516:10:516:16 | ...[...] | provenance | | nodes | semantics.rb:2:5:2:5 | a | semmle.label | a | | semantics.rb:2:5:2:5 | a | semmle.label | a | @@ -1283,14 +1283,14 @@ nodes | semantics.rb:108:5:108:5 | b | semmle.label | b | | semantics.rb:108:9:108:18 | call to source | semmle.label | call to source | | semantics.rb:108:9:108:18 | call to source | semmle.label | call to source | -| semantics.rb:109:10:109:28 | call to s15 [element :foo] | semmle.label | call to s15 [element :foo] | -| semantics.rb:109:10:109:28 | call to s15 [element :foo] | semmle.label | call to s15 [element :foo] | +| semantics.rb:109:10:109:28 | call to s15 : Hash [element :foo] | semmle.label | call to s15 : Hash [element :foo] | +| semantics.rb:109:10:109:28 | call to s15 : Hash [element :foo] | semmle.label | call to s15 : Hash [element :foo] | | semantics.rb:109:10:109:34 | ...[...] | semmle.label | ...[...] | | semantics.rb:109:10:109:34 | ...[...] | semmle.label | ...[...] | | semantics.rb:109:19:109:19 | a | semmle.label | a | | semantics.rb:109:19:109:19 | a | semmle.label | a | -| semantics.rb:110:10:110:28 | call to s15 [element :bar] | semmle.label | call to s15 [element :bar] | -| semantics.rb:110:10:110:28 | call to s15 [element :bar] | semmle.label | call to s15 [element :bar] | +| semantics.rb:110:10:110:28 | call to s15 : Hash [element :bar] | semmle.label | call to s15 : Hash [element :bar] | +| semantics.rb:110:10:110:28 | call to s15 : Hash [element :bar] | semmle.label | call to s15 : Hash [element :bar] | | semantics.rb:110:10:110:34 | ...[...] | semmle.label | ...[...] | | semantics.rb:110:10:110:34 | ...[...] | semmle.label | ...[...] | | semantics.rb:110:27:110:27 | b | semmle.label | b | @@ -1303,18 +1303,18 @@ nodes | semantics.rb:115:5:115:5 | b | semmle.label | b | | semantics.rb:115:9:115:18 | call to source | semmle.label | call to source | | semantics.rb:115:9:115:18 | call to source | semmle.label | call to source | -| semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] | -| semantics.rb:116:5:116:5 | h [element :a] | semmle.label | h [element :a] | -| semantics.rb:116:9:116:22 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| semantics.rb:116:9:116:22 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| semantics.rb:116:5:116:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| semantics.rb:116:5:116:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| semantics.rb:116:9:116:22 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| semantics.rb:116:9:116:22 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | semantics.rb:116:14:116:14 | a | semmle.label | a | | semantics.rb:116:14:116:14 | a | semmle.label | a | | semantics.rb:117:10:117:17 | call to s16 | semmle.label | call to s16 | | semantics.rb:117:10:117:17 | call to s16 | semmle.label | call to s16 | -| semantics.rb:117:14:117:16 | ** ... [element :a] | semmle.label | ** ... [element :a] | -| semantics.rb:117:14:117:16 | ** ... [element :a] | semmle.label | ** ... [element :a] | -| semantics.rb:117:16:117:16 | h [element :a] | semmle.label | h [element :a] | -| semantics.rb:117:16:117:16 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:117:14:117:16 | ** ... : Hash [element :a] | semmle.label | ** ... : Hash [element :a] | +| semantics.rb:117:14:117:16 | ** ... : Hash [element :a] | semmle.label | ** ... : Hash [element :a] | +| semantics.rb:117:16:117:16 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| semantics.rb:117:16:117:16 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | | semantics.rb:119:10:119:18 | call to s16 | semmle.label | call to s16 | | semantics.rb:119:10:119:18 | call to s16 | semmle.label | call to s16 | | semantics.rb:119:17:119:17 | a | semmle.label | a | @@ -1323,10 +1323,10 @@ nodes | semantics.rb:121:10:121:23 | call to s16 | semmle.label | call to s16 | | semantics.rb:121:17:121:17 | b | semmle.label | b | | semantics.rb:121:17:121:17 | b | semmle.label | b | -| semantics.rb:121:20:121:22 | ** ... [element :a] | semmle.label | ** ... [element :a] | -| semantics.rb:121:20:121:22 | ** ... [element :a] | semmle.label | ** ... [element :a] | -| semantics.rb:121:22:121:22 | h [element :a] | semmle.label | h [element :a] | -| semantics.rb:121:22:121:22 | h [element :a] | semmle.label | h [element :a] | +| semantics.rb:121:20:121:22 | ** ... : Hash [element :a] | semmle.label | ** ... : Hash [element :a] | +| semantics.rb:121:20:121:22 | ** ... : Hash [element :a] | semmle.label | ** ... : Hash [element :a] | +| semantics.rb:121:22:121:22 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| semantics.rb:121:22:121:22 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | | semantics.rb:125:5:125:5 | a | semmle.label | a | | semantics.rb:125:5:125:5 | a | semmle.label | a | | semantics.rb:125:9:125:18 | call to source | semmle.label | call to source | @@ -1338,14 +1338,14 @@ nodes | semantics.rb:127:10:127:18 | call to s17 | semmle.label | call to s17 | | semantics.rb:127:14:127:14 | a | semmle.label | a | | semantics.rb:127:17:127:17 | b | semmle.label | b | -| semantics.rb:128:10:128:18 | call to s17 [element 0] | semmle.label | call to s17 [element 0] | -| semantics.rb:128:10:128:18 | call to s17 [element 0] | semmle.label | call to s17 [element 0] | +| semantics.rb:128:10:128:18 | call to s17 : Array [element 0] | semmle.label | call to s17 : Array [element 0] | +| semantics.rb:128:10:128:18 | call to s17 : Array [element 0] | semmle.label | call to s17 : Array [element 0] | | semantics.rb:128:10:128:21 | ...[...] | semmle.label | ...[...] | | semantics.rb:128:10:128:21 | ...[...] | semmle.label | ...[...] | | semantics.rb:128:14:128:14 | a | semmle.label | a | | semantics.rb:128:14:128:14 | a | semmle.label | a | -| semantics.rb:129:10:129:18 | call to s17 [element 1] | semmle.label | call to s17 [element 1] | -| semantics.rb:129:10:129:18 | call to s17 [element 1] | semmle.label | call to s17 [element 1] | +| semantics.rb:129:10:129:18 | call to s17 : Array [element 1] | semmle.label | call to s17 : Array [element 1] | +| semantics.rb:129:10:129:18 | call to s17 : Array [element 1] | semmle.label | call to s17 : Array [element 1] | | semantics.rb:129:10:129:21 | ...[...] | semmle.label | ...[...] | | semantics.rb:129:10:129:21 | ...[...] | semmle.label | ...[...] | | semantics.rb:129:17:129:17 | b | semmle.label | b | @@ -1358,28 +1358,28 @@ nodes | semantics.rb:134:5:134:5 | b | semmle.label | b | | semantics.rb:134:9:134:18 | call to source | semmle.label | call to source | | semantics.rb:134:9:134:18 | call to source | semmle.label | call to source | -| semantics.rb:135:5:135:7 | arr [element 0] | semmle.label | arr [element 0] | -| semantics.rb:135:5:135:7 | arr [element 0] | semmle.label | arr [element 0] | -| semantics.rb:135:5:135:7 | arr [element 1] | semmle.label | arr [element 1] | -| semantics.rb:135:5:135:7 | arr [element 1] | semmle.label | arr [element 1] | -| semantics.rb:135:11:135:16 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| semantics.rb:135:11:135:16 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| semantics.rb:135:11:135:16 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| semantics.rb:135:11:135:16 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| semantics.rb:135:5:135:7 | arr : Array [element 0] | semmle.label | arr : Array [element 0] | +| semantics.rb:135:5:135:7 | arr : Array [element 0] | semmle.label | arr : Array [element 0] | +| semantics.rb:135:5:135:7 | arr : Array [element 1] | semmle.label | arr : Array [element 1] | +| semantics.rb:135:5:135:7 | arr : Array [element 1] | semmle.label | arr : Array [element 1] | +| semantics.rb:135:11:135:16 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| semantics.rb:135:11:135:16 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| semantics.rb:135:11:135:16 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| semantics.rb:135:11:135:16 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | semantics.rb:135:12:135:12 | a | semmle.label | a | | semantics.rb:135:12:135:12 | a | semmle.label | a | | semantics.rb:135:15:135:15 | b | semmle.label | b | | semantics.rb:135:15:135:15 | b | semmle.label | b | | semantics.rb:136:10:136:18 | call to s18 | semmle.label | call to s18 | | semantics.rb:136:10:136:18 | call to s18 | semmle.label | call to s18 | -| semantics.rb:136:14:136:17 | * ... [element 0] | semmle.label | * ... [element 0] | -| semantics.rb:136:14:136:17 | * ... [element 0] | semmle.label | * ... [element 0] | -| semantics.rb:136:14:136:17 | * ... [element 1] | semmle.label | * ... [element 1] | -| semantics.rb:136:14:136:17 | * ... [element 1] | semmle.label | * ... [element 1] | -| semantics.rb:136:15:136:17 | arr [element 0] | semmle.label | arr [element 0] | -| semantics.rb:136:15:136:17 | arr [element 0] | semmle.label | arr [element 0] | -| semantics.rb:136:15:136:17 | arr [element 1] | semmle.label | arr [element 1] | -| semantics.rb:136:15:136:17 | arr [element 1] | semmle.label | arr [element 1] | +| semantics.rb:136:14:136:17 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| semantics.rb:136:14:136:17 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| semantics.rb:136:14:136:17 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| semantics.rb:136:14:136:17 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| semantics.rb:136:15:136:17 | arr : Array [element 0] | semmle.label | arr : Array [element 0] | +| semantics.rb:136:15:136:17 | arr : Array [element 0] | semmle.label | arr : Array [element 0] | +| semantics.rb:136:15:136:17 | arr : Array [element 1] | semmle.label | arr : Array [element 1] | +| semantics.rb:136:15:136:17 | arr : Array [element 1] | semmle.label | arr : Array [element 1] | | semantics.rb:137:10:137:15 | call to s18 | semmle.label | call to s18 | | semantics.rb:137:10:137:15 | call to s18 | semmle.label | call to s18 | | semantics.rb:137:14:137:14 | a | semmle.label | a | @@ -1388,28 +1388,28 @@ nodes | semantics.rb:142:5:142:5 | b | semmle.label | b | | semantics.rb:142:9:142:18 | call to source | semmle.label | call to source | | semantics.rb:142:9:142:18 | call to source | semmle.label | call to source | -| semantics.rb:146:5:146:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:146:5:146:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:146:5:146:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:146:5:146:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:148:10:148:15 | call to s19 | semmle.label | call to s19 | | semantics.rb:148:10:148:15 | call to s19 | semmle.label | call to s19 | -| semantics.rb:148:14:148:14 | h [element] | semmle.label | h [element] | -| semantics.rb:148:14:148:14 | h [element] | semmle.label | h [element] | +| semantics.rb:148:14:148:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:148:14:148:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:152:5:152:5 | a | semmle.label | a | | semantics.rb:152:5:152:5 | a | semmle.label | a | | semantics.rb:152:9:152:18 | call to source | semmle.label | call to source | | semantics.rb:152:9:152:18 | call to source | semmle.label | call to source | -| semantics.rb:153:5:153:5 | x [element] | semmle.label | x [element] | -| semantics.rb:153:5:153:5 | x [element] | semmle.label | x [element] | -| semantics.rb:153:9:153:14 | call to s20 [element] | semmle.label | call to s20 [element] | -| semantics.rb:153:9:153:14 | call to s20 [element] | semmle.label | call to s20 [element] | +| semantics.rb:153:5:153:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:153:5:153:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:153:9:153:14 | call to s20 : [collection] [element] | semmle.label | call to s20 : [collection] [element] | +| semantics.rb:153:9:153:14 | call to s20 : [collection] [element] | semmle.label | call to s20 : [collection] [element] | | semantics.rb:153:13:153:13 | a | semmle.label | a | | semantics.rb:153:13:153:13 | a | semmle.label | a | -| semantics.rb:154:10:154:10 | x [element] | semmle.label | x [element] | -| semantics.rb:154:10:154:10 | x [element] | semmle.label | x [element] | +| semantics.rb:154:10:154:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:154:10:154:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:154:10:154:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:154:10:154:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:155:10:155:10 | x [element] | semmle.label | x [element] | -| semantics.rb:155:10:155:10 | x [element] | semmle.label | x [element] | +| semantics.rb:155:10:155:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:155:10:155:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:155:10:155:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:155:10:155:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:159:5:159:5 | a | semmle.label | a | @@ -1420,96 +1420,96 @@ nodes | semantics.rb:160:5:160:5 | b | semmle.label | b | | semantics.rb:160:9:160:18 | call to source | semmle.label | call to source | | semantics.rb:160:9:160:18 | call to source | semmle.label | call to source | -| semantics.rb:163:5:163:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:163:5:163:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:164:5:164:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:164:5:164:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:163:5:163:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:163:5:163:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:164:5:164:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:164:5:164:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:166:10:166:15 | call to s21 | semmle.label | call to s21 | | semantics.rb:166:10:166:15 | call to s21 | semmle.label | call to s21 | -| semantics.rb:166:14:166:14 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:166:14:166:14 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:166:14:166:14 | h [element] | semmle.label | h [element] | -| semantics.rb:166:14:166:14 | h [element] | semmle.label | h [element] | +| semantics.rb:166:14:166:14 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:166:14:166:14 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:166:14:166:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:166:14:166:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:170:5:170:5 | a | semmle.label | a | | semantics.rb:170:5:170:5 | a | semmle.label | a | | semantics.rb:170:9:170:18 | call to source | semmle.label | call to source | | semantics.rb:170:9:170:18 | call to source | semmle.label | call to source | -| semantics.rb:171:5:171:5 | x [element] | semmle.label | x [element] | -| semantics.rb:171:5:171:5 | x [element] | semmle.label | x [element] | -| semantics.rb:171:9:171:14 | call to s22 [element] | semmle.label | call to s22 [element] | -| semantics.rb:171:9:171:14 | call to s22 [element] | semmle.label | call to s22 [element] | +| semantics.rb:171:5:171:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:171:5:171:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:171:9:171:14 | call to s22 : [collection] [element] | semmle.label | call to s22 : [collection] [element] | +| semantics.rb:171:9:171:14 | call to s22 : [collection] [element] | semmle.label | call to s22 : [collection] [element] | | semantics.rb:171:13:171:13 | a | semmle.label | a | | semantics.rb:171:13:171:13 | a | semmle.label | a | -| semantics.rb:172:10:172:10 | x [element] | semmle.label | x [element] | -| semantics.rb:172:10:172:10 | x [element] | semmle.label | x [element] | +| semantics.rb:172:10:172:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:172:10:172:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:172:10:172:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:172:10:172:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:173:10:173:10 | x [element] | semmle.label | x [element] | -| semantics.rb:173:10:173:10 | x [element] | semmle.label | x [element] | +| semantics.rb:173:10:173:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:173:10:173:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:173:10:173:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:173:10:173:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:177:5:177:5 | a | semmle.label | a | | semantics.rb:177:5:177:5 | a | semmle.label | a | | semantics.rb:177:9:177:18 | call to source | semmle.label | call to source | | semantics.rb:177:9:177:18 | call to source | semmle.label | call to source | -| semantics.rb:180:5:180:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:180:5:180:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:181:5:181:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:181:5:181:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:181:5:181:5 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:181:5:181:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:180:5:180:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:180:5:180:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:181:5:181:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:181:5:181:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:181:5:181:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:181:5:181:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | | semantics.rb:182:10:182:15 | call to s23 | semmle.label | call to s23 | | semantics.rb:182:10:182:15 | call to s23 | semmle.label | call to s23 | -| semantics.rb:182:14:182:14 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:182:14:182:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:182:14:182:14 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:182:14:182:14 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | | semantics.rb:186:5:186:5 | a | semmle.label | a | | semantics.rb:186:5:186:5 | a | semmle.label | a | | semantics.rb:186:9:186:18 | call to source | semmle.label | call to source | | semantics.rb:186:9:186:18 | call to source | semmle.label | call to source | -| semantics.rb:187:5:187:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:187:5:187:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:187:9:187:14 | call to s24 [element 0] | semmle.label | call to s24 [element 0] | -| semantics.rb:187:9:187:14 | call to s24 [element 0] | semmle.label | call to s24 [element 0] | +| semantics.rb:187:5:187:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:187:5:187:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:187:9:187:14 | call to s24 : [collection] [element 0] | semmle.label | call to s24 : [collection] [element 0] | +| semantics.rb:187:9:187:14 | call to s24 : [collection] [element 0] | semmle.label | call to s24 : [collection] [element 0] | | semantics.rb:187:13:187:13 | a | semmle.label | a | | semantics.rb:187:13:187:13 | a | semmle.label | a | -| semantics.rb:188:10:188:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:188:10:188:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:188:10:188:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:188:10:188:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | semantics.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:190:10:190:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:190:10:190:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:190:10:190:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:190:10:190:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | semantics.rb:190:10:190:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:190:10:190:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:194:5:194:5 | a | semmle.label | a | | semantics.rb:194:5:194:5 | a | semmle.label | a | | semantics.rb:194:9:194:18 | call to source | semmle.label | call to source | | semantics.rb:194:9:194:18 | call to source | semmle.label | call to source | -| semantics.rb:197:5:197:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:197:5:197:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:198:5:198:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:198:5:198:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:198:5:198:5 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:198:5:198:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:197:5:197:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:197:5:197:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:198:5:198:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:198:5:198:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:198:5:198:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:198:5:198:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | | semantics.rb:199:10:199:15 | call to s25 | semmle.label | call to s25 | | semantics.rb:199:10:199:15 | call to s25 | semmle.label | call to s25 | -| semantics.rb:199:14:199:14 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:199:14:199:14 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:199:14:199:14 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:199:14:199:14 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | | semantics.rb:203:5:203:5 | a | semmle.label | a | | semantics.rb:203:5:203:5 | a | semmle.label | a | | semantics.rb:203:9:203:18 | call to source | semmle.label | call to source | | semantics.rb:203:9:203:18 | call to source | semmle.label | call to source | -| semantics.rb:204:5:204:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:204:5:204:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:204:9:204:14 | call to s26 [element 0] | semmle.label | call to s26 [element 0] | -| semantics.rb:204:9:204:14 | call to s26 [element 0] | semmle.label | call to s26 [element 0] | +| semantics.rb:204:5:204:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:204:5:204:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:204:9:204:14 | call to s26 : [collection] [element 0] | semmle.label | call to s26 : [collection] [element 0] | +| semantics.rb:204:9:204:14 | call to s26 : [collection] [element 0] | semmle.label | call to s26 : [collection] [element 0] | | semantics.rb:204:13:204:13 | a | semmle.label | a | | semantics.rb:204:13:204:13 | a | semmle.label | a | -| semantics.rb:205:10:205:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:205:10:205:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:205:10:205:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:205:10:205:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | semantics.rb:205:10:205:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:205:10:205:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:207:10:207:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:207:10:207:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:207:10:207:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:207:10:207:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | semantics.rb:207:10:207:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:207:10:207:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:212:5:212:5 | b | semmle.label | b | @@ -1524,48 +1524,48 @@ nodes | semantics.rb:214:5:214:5 | d | semmle.label | d | | semantics.rb:214:9:214:18 | call to source | semmle.label | call to source | | semantics.rb:214:9:214:18 | call to source | semmle.label | call to source | -| semantics.rb:218:5:218:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:218:5:218:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:219:5:219:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:219:5:219:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:219:5:219:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | -| semantics.rb:219:5:219:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | -| semantics.rb:219:5:219:5 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:219:5:219:5 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:220:5:220:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:220:5:220:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:218:5:218:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:218:5:218:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 2] | semmle.label | [post] h : [collection] [element 2] | +| semantics.rb:219:5:219:5 | [post] h : [collection] [element 2] | semmle.label | [post] h : [collection] [element 2] | +| semantics.rb:219:5:219:5 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:219:5:219:5 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:220:5:220:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:220:5:220:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:222:10:222:15 | call to s27 | semmle.label | call to s27 | | semantics.rb:222:10:222:15 | call to s27 | semmle.label | call to s27 | -| semantics.rb:222:14:222:14 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:222:14:222:14 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:222:14:222:14 | h [element 2] | semmle.label | h [element 2] | -| semantics.rb:222:14:222:14 | h [element 2] | semmle.label | h [element 2] | -| semantics.rb:222:14:222:14 | h [element] | semmle.label | h [element] | -| semantics.rb:222:14:222:14 | h [element] | semmle.label | h [element] | +| semantics.rb:222:14:222:14 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:222:14:222:14 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:222:14:222:14 | h : [collection] [element 2] | semmle.label | h : [collection] [element 2] | +| semantics.rb:222:14:222:14 | h : [collection] [element 2] | semmle.label | h : [collection] [element 2] | +| semantics.rb:222:14:222:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:222:14:222:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:226:5:226:5 | a | semmle.label | a | | semantics.rb:226:5:226:5 | a | semmle.label | a | | semantics.rb:226:9:226:18 | call to source | semmle.label | call to source | | semantics.rb:226:9:226:18 | call to source | semmle.label | call to source | -| semantics.rb:227:5:227:5 | x [element] | semmle.label | x [element] | -| semantics.rb:227:5:227:5 | x [element] | semmle.label | x [element] | -| semantics.rb:227:9:227:14 | call to s28 [element] | semmle.label | call to s28 [element] | -| semantics.rb:227:9:227:14 | call to s28 [element] | semmle.label | call to s28 [element] | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:227:5:227:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:227:9:227:14 | call to s28 : [collection] [element] | semmle.label | call to s28 : [collection] [element] | +| semantics.rb:227:9:227:14 | call to s28 : [collection] [element] | semmle.label | call to s28 : [collection] [element] | | semantics.rb:227:13:227:13 | a | semmle.label | a | | semantics.rb:227:13:227:13 | a | semmle.label | a | -| semantics.rb:228:10:228:10 | x [element] | semmle.label | x [element] | -| semantics.rb:228:10:228:10 | x [element] | semmle.label | x [element] | +| semantics.rb:228:10:228:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:228:10:228:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:228:10:228:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:228:10:228:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:229:10:229:10 | x [element] | semmle.label | x [element] | -| semantics.rb:229:10:229:10 | x [element] | semmle.label | x [element] | +| semantics.rb:229:10:229:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:229:10:229:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:229:10:229:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:229:10:229:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:230:10:230:10 | x [element] | semmle.label | x [element] | -| semantics.rb:230:10:230:10 | x [element] | semmle.label | x [element] | +| semantics.rb:230:10:230:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:230:10:230:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:231:10:231:10 | x [element] | semmle.label | x [element] | -| semantics.rb:231:10:231:10 | x [element] | semmle.label | x [element] | +| semantics.rb:231:10:231:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:231:10:231:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:231:10:231:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:231:10:231:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:236:5:236:5 | b | semmle.label | b | @@ -1576,224 +1576,224 @@ nodes | semantics.rb:237:5:237:5 | c | semmle.label | c | | semantics.rb:237:9:237:18 | call to source | semmle.label | call to source | | semantics.rb:237:9:237:18 | call to source | semmle.label | call to source | -| semantics.rb:241:5:241:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:241:5:241:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:242:5:242:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:242:5:242:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:242:5:242:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | -| semantics.rb:242:5:242:5 | [post] h [element 2] | semmle.label | [post] h [element 2] | -| semantics.rb:242:5:242:5 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:242:5:242:5 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:241:5:241:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:241:5:241:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 2] | semmle.label | [post] h : [collection] [element 2] | +| semantics.rb:242:5:242:5 | [post] h : [collection] [element 2] | semmle.label | [post] h : [collection] [element 2] | +| semantics.rb:242:5:242:5 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:242:5:242:5 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | | semantics.rb:245:10:245:15 | call to s29 | semmle.label | call to s29 | | semantics.rb:245:10:245:15 | call to s29 | semmle.label | call to s29 | -| semantics.rb:245:14:245:14 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:245:14:245:14 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:245:14:245:14 | h [element 2] | semmle.label | h [element 2] | -| semantics.rb:245:14:245:14 | h [element 2] | semmle.label | h [element 2] | +| semantics.rb:245:14:245:14 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:245:14:245:14 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:245:14:245:14 | h : [collection] [element 2] | semmle.label | h : [collection] [element 2] | +| semantics.rb:245:14:245:14 | h : [collection] [element 2] | semmle.label | h : [collection] [element 2] | | semantics.rb:249:5:249:5 | a | semmle.label | a | | semantics.rb:249:5:249:5 | a | semmle.label | a | | semantics.rb:249:9:249:18 | call to source | semmle.label | call to source | | semantics.rb:249:9:249:18 | call to source | semmle.label | call to source | -| semantics.rb:250:5:250:5 | x [element] | semmle.label | x [element] | -| semantics.rb:250:5:250:5 | x [element] | semmle.label | x [element] | -| semantics.rb:250:9:250:14 | call to s30 [element] | semmle.label | call to s30 [element] | -| semantics.rb:250:9:250:14 | call to s30 [element] | semmle.label | call to s30 [element] | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:250:5:250:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:250:9:250:14 | call to s30 : [collection] [element] | semmle.label | call to s30 : [collection] [element] | +| semantics.rb:250:9:250:14 | call to s30 : [collection] [element] | semmle.label | call to s30 : [collection] [element] | | semantics.rb:250:13:250:13 | a | semmle.label | a | | semantics.rb:250:13:250:13 | a | semmle.label | a | -| semantics.rb:251:10:251:10 | x [element] | semmle.label | x [element] | -| semantics.rb:251:10:251:10 | x [element] | semmle.label | x [element] | +| semantics.rb:251:10:251:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:251:10:251:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:251:10:251:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:251:10:251:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:252:10:252:10 | x [element] | semmle.label | x [element] | -| semantics.rb:252:10:252:10 | x [element] | semmle.label | x [element] | +| semantics.rb:252:10:252:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:252:10:252:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:252:10:252:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:252:10:252:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:253:10:253:10 | x [element] | semmle.label | x [element] | -| semantics.rb:253:10:253:10 | x [element] | semmle.label | x [element] | +| semantics.rb:253:10:253:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:253:10:253:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:253:10:253:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:253:10:253:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:254:10:254:10 | x [element] | semmle.label | x [element] | -| semantics.rb:254:10:254:10 | x [element] | semmle.label | x [element] | +| semantics.rb:254:10:254:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:254:10:254:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:254:10:254:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:254:10:254:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:258:5:258:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:258:5:258:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:258:5:258:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:258:5:258:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:258:15:258:25 | call to source | semmle.label | call to source | | semantics.rb:258:15:258:25 | call to source | semmle.label | call to source | -| semantics.rb:259:5:259:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:259:5:259:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:259:5:259:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:259:5:259:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:260:5:260:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:260:5:260:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:260:5:260:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:260:5:260:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:261:5:261:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:261:5:261:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:259:5:259:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:259:5:259:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:259:5:259:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:259:5:259:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:260:5:260:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:260:5:260:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:260:5:260:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:260:5:260:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:261:5:261:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:261:5:261:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:261:12:261:22 | call to source | semmle.label | call to source | | semantics.rb:261:12:261:22 | call to source | semmle.label | call to source | | semantics.rb:263:10:263:15 | call to s31 | semmle.label | call to s31 | | semantics.rb:263:10:263:15 | call to s31 | semmle.label | call to s31 | -| semantics.rb:263:14:263:14 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:263:14:263:14 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:263:14:263:14 | h [element] | semmle.label | h [element] | -| semantics.rb:263:14:263:14 | h [element] | semmle.label | h [element] | -| semantics.rb:267:5:267:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:267:5:267:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:263:14:263:14 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:263:14:263:14 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:263:14:263:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:263:14:263:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:267:5:267:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:267:5:267:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:267:15:267:25 | call to source | semmle.label | call to source | | semantics.rb:267:15:267:25 | call to source | semmle.label | call to source | -| semantics.rb:268:5:268:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:268:5:268:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:268:5:268:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | -| semantics.rb:268:5:268:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | -| semantics.rb:268:5:268:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:268:5:268:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | +| semantics.rb:268:5:268:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | +| semantics.rb:268:5:268:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:268:5:268:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:268:16:268:26 | call to source | semmle.label | call to source | | semantics.rb:268:16:268:26 | call to source | semmle.label | call to source | -| semantics.rb:269:5:269:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:269:5:269:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:269:5:269:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | -| semantics.rb:269:5:269:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | -| semantics.rb:269:5:269:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:269:5:269:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:269:5:269:5 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:269:5:269:5 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:270:5:270:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:270:5:270:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:270:5:270:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | -| semantics.rb:270:5:270:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | -| semantics.rb:270:5:270:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:270:5:270:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:270:5:270:5 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:270:5:270:5 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:271:5:271:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:271:5:271:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | +| semantics.rb:269:5:269:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | +| semantics.rb:269:5:269:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:269:5:269:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:269:5:269:5 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:269:5:269:5 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | +| semantics.rb:270:5:270:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | +| semantics.rb:270:5:270:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:270:5:270:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:270:5:270:5 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:270:5:270:5 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:271:5:271:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:271:5:271:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:271:12:271:22 | call to source | semmle.label | call to source | | semantics.rb:271:12:271:22 | call to source | semmle.label | call to source | | semantics.rb:273:10:273:15 | call to s32 | semmle.label | call to s32 | | semantics.rb:273:10:273:15 | call to s32 | semmle.label | call to s32 | -| semantics.rb:273:14:273:14 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:273:14:273:14 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:273:14:273:14 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:273:14:273:14 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:273:14:273:14 | h [element] | semmle.label | h [element] | -| semantics.rb:273:14:273:14 | h [element] | semmle.label | h [element] | -| semantics.rb:281:5:281:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:281:5:281:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:273:14:273:14 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:273:14:273:14 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:273:14:273:14 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:273:14:273:14 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:273:14:273:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:273:14:273:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:281:5:281:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:281:5:281:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:281:12:281:22 | call to source | semmle.label | call to source | | semantics.rb:281:12:281:22 | call to source | semmle.label | call to source | -| semantics.rb:282:5:282:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | -| semantics.rb:282:5:282:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | -| semantics.rb:282:5:282:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:282:5:282:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:282:5:282:5 | h [element] | semmle.label | h [element] | -| semantics.rb:282:5:282:5 | h [element] | semmle.label | h [element] | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element nil] | semmle.label | [post] h : [collection] [element nil] | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element nil] | semmle.label | [post] h : [collection] [element nil] | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:282:5:282:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:282:5:282:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:282:5:282:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:282:14:282:24 | call to source | semmle.label | call to source | | semantics.rb:282:14:282:24 | call to source | semmle.label | call to source | -| semantics.rb:283:5:283:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | -| semantics.rb:283:5:283:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | -| semantics.rb:283:5:283:5 | [post] h [element true] | semmle.label | [post] h [element true] | -| semantics.rb:283:5:283:5 | [post] h [element true] | semmle.label | [post] h [element true] | -| semantics.rb:283:5:283:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:283:5:283:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:283:5:283:5 | h [element nil] | semmle.label | h [element nil] | -| semantics.rb:283:5:283:5 | h [element nil] | semmle.label | h [element nil] | -| semantics.rb:283:5:283:5 | h [element] | semmle.label | h [element] | -| semantics.rb:283:5:283:5 | h [element] | semmle.label | h [element] | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element nil] | semmle.label | [post] h : [collection] [element nil] | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element nil] | semmle.label | [post] h : [collection] [element nil] | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element true] | semmle.label | [post] h : [collection] [element true] | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element true] | semmle.label | [post] h : [collection] [element true] | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:283:5:283:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:283:5:283:5 | h : [collection] [element nil] | semmle.label | h : [collection] [element nil] | +| semantics.rb:283:5:283:5 | h : [collection] [element nil] | semmle.label | h : [collection] [element nil] | +| semantics.rb:283:5:283:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:283:5:283:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:283:15:283:25 | call to source | semmle.label | call to source | | semantics.rb:283:15:283:25 | call to source | semmle.label | call to source | -| semantics.rb:284:5:284:5 | [post] h [element false] | semmle.label | [post] h [element false] | -| semantics.rb:284:5:284:5 | [post] h [element false] | semmle.label | [post] h [element false] | -| semantics.rb:284:5:284:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | -| semantics.rb:284:5:284:5 | [post] h [element nil] | semmle.label | [post] h [element nil] | -| semantics.rb:284:5:284:5 | [post] h [element true] | semmle.label | [post] h [element true] | -| semantics.rb:284:5:284:5 | [post] h [element true] | semmle.label | [post] h [element true] | -| semantics.rb:284:5:284:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:284:5:284:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:284:5:284:5 | h [element nil] | semmle.label | h [element nil] | -| semantics.rb:284:5:284:5 | h [element nil] | semmle.label | h [element nil] | -| semantics.rb:284:5:284:5 | h [element true] | semmle.label | h [element true] | -| semantics.rb:284:5:284:5 | h [element true] | semmle.label | h [element true] | -| semantics.rb:284:5:284:5 | h [element] | semmle.label | h [element] | -| semantics.rb:284:5:284:5 | h [element] | semmle.label | h [element] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element false] | semmle.label | [post] h : [collection] [element false] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element false] | semmle.label | [post] h : [collection] [element false] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element nil] | semmle.label | [post] h : [collection] [element nil] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element nil] | semmle.label | [post] h : [collection] [element nil] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element true] | semmle.label | [post] h : [collection] [element true] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element true] | semmle.label | [post] h : [collection] [element true] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:284:5:284:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:284:5:284:5 | h : [collection] [element nil] | semmle.label | h : [collection] [element nil] | +| semantics.rb:284:5:284:5 | h : [collection] [element nil] | semmle.label | h : [collection] [element nil] | +| semantics.rb:284:5:284:5 | h : [collection] [element true] | semmle.label | h : [collection] [element true] | +| semantics.rb:284:5:284:5 | h : [collection] [element true] | semmle.label | h : [collection] [element true] | +| semantics.rb:284:5:284:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:284:5:284:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:284:16:284:26 | call to source | semmle.label | call to source | | semantics.rb:284:16:284:26 | call to source | semmle.label | call to source | | semantics.rb:286:10:286:15 | call to s33 | semmle.label | call to s33 | | semantics.rb:286:10:286:15 | call to s33 | semmle.label | call to s33 | -| semantics.rb:286:14:286:14 | h [element false] | semmle.label | h [element false] | -| semantics.rb:286:14:286:14 | h [element false] | semmle.label | h [element false] | -| semantics.rb:286:14:286:14 | h [element nil] | semmle.label | h [element nil] | -| semantics.rb:286:14:286:14 | h [element nil] | semmle.label | h [element nil] | -| semantics.rb:286:14:286:14 | h [element true] | semmle.label | h [element true] | -| semantics.rb:286:14:286:14 | h [element true] | semmle.label | h [element true] | -| semantics.rb:286:14:286:14 | h [element] | semmle.label | h [element] | -| semantics.rb:286:14:286:14 | h [element] | semmle.label | h [element] | -| semantics.rb:290:5:290:5 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:290:5:290:5 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:290:9:290:24 | call to s35 [element :foo] | semmle.label | call to s35 [element :foo] | -| semantics.rb:290:9:290:24 | call to s35 [element :foo] | semmle.label | call to s35 [element :foo] | +| semantics.rb:286:14:286:14 | h : [collection] [element false] | semmle.label | h : [collection] [element false] | +| semantics.rb:286:14:286:14 | h : [collection] [element false] | semmle.label | h : [collection] [element false] | +| semantics.rb:286:14:286:14 | h : [collection] [element nil] | semmle.label | h : [collection] [element nil] | +| semantics.rb:286:14:286:14 | h : [collection] [element nil] | semmle.label | h : [collection] [element nil] | +| semantics.rb:286:14:286:14 | h : [collection] [element true] | semmle.label | h : [collection] [element true] | +| semantics.rb:286:14:286:14 | h : [collection] [element true] | semmle.label | h : [collection] [element true] | +| semantics.rb:286:14:286:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:286:14:286:14 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:290:5:290:5 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:290:5:290:5 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:290:9:290:24 | call to s35 : [collection] [element :foo] | semmle.label | call to s35 : [collection] [element :foo] | +| semantics.rb:290:9:290:24 | call to s35 : [collection] [element :foo] | semmle.label | call to s35 : [collection] [element :foo] | | semantics.rb:290:13:290:23 | call to source | semmle.label | call to source | | semantics.rb:290:13:290:23 | call to source | semmle.label | call to source | -| semantics.rb:291:10:291:10 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:291:10:291:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:291:10:291:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:291:10:291:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | | semantics.rb:291:10:291:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:291:10:291:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:293:10:293:10 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:293:10:293:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:293:10:293:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:293:10:293:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | | semantics.rb:293:10:293:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:293:10:293:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:297:5:297:5 | x [element foo] | semmle.label | x [element foo] | -| semantics.rb:297:5:297:5 | x [element foo] | semmle.label | x [element foo] | -| semantics.rb:297:9:297:24 | call to s36 [element foo] | semmle.label | call to s36 [element foo] | -| semantics.rb:297:9:297:24 | call to s36 [element foo] | semmle.label | call to s36 [element foo] | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | +| semantics.rb:297:5:297:5 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | +| semantics.rb:297:9:297:24 | call to s36 : [collection] [element foo] | semmle.label | call to s36 : [collection] [element foo] | +| semantics.rb:297:9:297:24 | call to s36 : [collection] [element foo] | semmle.label | call to s36 : [collection] [element foo] | | semantics.rb:297:13:297:23 | call to source | semmle.label | call to source | | semantics.rb:297:13:297:23 | call to source | semmle.label | call to source | -| semantics.rb:298:10:298:10 | x [element foo] | semmle.label | x [element foo] | -| semantics.rb:298:10:298:10 | x [element foo] | semmle.label | x [element foo] | +| semantics.rb:298:10:298:10 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | +| semantics.rb:298:10:298:10 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | | semantics.rb:298:10:298:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:298:10:298:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:299:10:299:10 | x [element foo] | semmle.label | x [element foo] | -| semantics.rb:299:10:299:10 | x [element foo] | semmle.label | x [element foo] | +| semantics.rb:299:10:299:10 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | +| semantics.rb:299:10:299:10 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | | semantics.rb:299:10:299:17 | ...[...] | semmle.label | ...[...] | | semantics.rb:299:10:299:17 | ...[...] | semmle.label | ...[...] | -| semantics.rb:301:10:301:10 | x [element foo] | semmle.label | x [element foo] | -| semantics.rb:301:10:301:10 | x [element foo] | semmle.label | x [element foo] | +| semantics.rb:301:10:301:10 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | +| semantics.rb:301:10:301:10 | x : [collection] [element foo] | semmle.label | x : [collection] [element foo] | | semantics.rb:301:10:301:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:301:10:301:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:305:5:305:5 | x [element true] | semmle.label | x [element true] | -| semantics.rb:305:5:305:5 | x [element true] | semmle.label | x [element true] | -| semantics.rb:305:9:305:24 | call to s37 [element true] | semmle.label | call to s37 [element true] | -| semantics.rb:305:9:305:24 | call to s37 [element true] | semmle.label | call to s37 [element true] | +| semantics.rb:305:5:305:5 | x : [collection] [element true] | semmle.label | x : [collection] [element true] | +| semantics.rb:305:5:305:5 | x : [collection] [element true] | semmle.label | x : [collection] [element true] | +| semantics.rb:305:9:305:24 | call to s37 : [collection] [element true] | semmle.label | call to s37 : [collection] [element true] | +| semantics.rb:305:9:305:24 | call to s37 : [collection] [element true] | semmle.label | call to s37 : [collection] [element true] | | semantics.rb:305:13:305:23 | call to source | semmle.label | call to source | | semantics.rb:305:13:305:23 | call to source | semmle.label | call to source | -| semantics.rb:307:10:307:10 | x [element true] | semmle.label | x [element true] | -| semantics.rb:307:10:307:10 | x [element true] | semmle.label | x [element true] | +| semantics.rb:307:10:307:10 | x : [collection] [element true] | semmle.label | x : [collection] [element true] | +| semantics.rb:307:10:307:10 | x : [collection] [element true] | semmle.label | x : [collection] [element true] | | semantics.rb:307:10:307:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:307:10:307:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:309:10:309:10 | x [element true] | semmle.label | x [element true] | -| semantics.rb:309:10:309:10 | x [element true] | semmle.label | x [element true] | +| semantics.rb:309:10:309:10 | x : [collection] [element true] | semmle.label | x : [collection] [element true] | +| semantics.rb:309:10:309:10 | x : [collection] [element true] | semmle.label | x : [collection] [element true] | | semantics.rb:309:10:309:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:309:10:309:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:313:5:313:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | -| semantics.rb:313:5:313:5 | [post] h [element foo] | semmle.label | [post] h [element foo] | +| semantics.rb:313:5:313:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | +| semantics.rb:313:5:313:5 | [post] h : [collection] [element foo] | semmle.label | [post] h : [collection] [element foo] | | semantics.rb:313:16:313:26 | call to source | semmle.label | call to source | | semantics.rb:313:16:313:26 | call to source | semmle.label | call to source | | semantics.rb:316:10:316:15 | call to s38 | semmle.label | call to s38 | | semantics.rb:316:10:316:15 | call to s38 | semmle.label | call to s38 | -| semantics.rb:316:14:316:14 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:316:14:316:14 | h [element foo] | semmle.label | h [element foo] | -| semantics.rb:320:5:320:5 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:320:5:320:5 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:320:9:320:24 | call to s39 [element :foo] | semmle.label | call to s39 [element :foo] | -| semantics.rb:320:9:320:24 | call to s39 [element :foo] | semmle.label | call to s39 [element :foo] | +| semantics.rb:316:14:316:14 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:316:14:316:14 | h : [collection] [element foo] | semmle.label | h : [collection] [element foo] | +| semantics.rb:320:5:320:5 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:320:5:320:5 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:320:9:320:24 | call to s39 : [collection] [element :foo] | semmle.label | call to s39 : [collection] [element :foo] | +| semantics.rb:320:9:320:24 | call to s39 : [collection] [element :foo] | semmle.label | call to s39 : [collection] [element :foo] | | semantics.rb:320:13:320:23 | call to source | semmle.label | call to source | | semantics.rb:320:13:320:23 | call to source | semmle.label | call to source | -| semantics.rb:322:10:322:10 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:322:10:322:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:322:10:322:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:322:10:322:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | | semantics.rb:322:10:322:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:322:10:322:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:323:10:323:10 | x [element :foo] | semmle.label | x [element :foo] | -| semantics.rb:323:10:323:10 | x [element :foo] | semmle.label | x [element :foo] | +| semantics.rb:323:10:323:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | +| semantics.rb:323:10:323:10 | x : [collection] [element :foo] | semmle.label | x : [collection] [element :foo] | | semantics.rb:323:10:323:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:323:10:323:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:328:5:328:5 | [post] x [@foo] | semmle.label | [post] x [@foo] | @@ -1814,508 +1814,508 @@ nodes | semantics.rb:335:10:335:10 | x [@foo] | semmle.label | x [@foo] | | semantics.rb:335:10:335:14 | call to foo | semmle.label | call to foo | | semantics.rb:335:10:335:14 | call to foo | semmle.label | call to foo | -| semantics.rb:340:5:340:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:340:5:340:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:340:5:340:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:340:5:340:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | | semantics.rb:340:12:340:22 | call to source | semmle.label | call to source | | semantics.rb:340:12:340:22 | call to source | semmle.label | call to source | -| semantics.rb:341:5:341:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:341:5:341:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:341:5:341:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:341:5:341:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:341:12:341:22 | call to source | semmle.label | call to source | | semantics.rb:341:12:341:22 | call to source | semmle.label | call to source | -| semantics.rb:343:5:343:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:343:5:343:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:343:5:343:5 | x [element] | semmle.label | x [element] | -| semantics.rb:343:5:343:5 | x [element] | semmle.label | x [element] | -| semantics.rb:343:9:343:14 | call to s42 [element 0] | semmle.label | call to s42 [element 0] | -| semantics.rb:343:9:343:14 | call to s42 [element 0] | semmle.label | call to s42 [element 0] | -| semantics.rb:343:9:343:14 | call to s42 [element] | semmle.label | call to s42 [element] | -| semantics.rb:343:9:343:14 | call to s42 [element] | semmle.label | call to s42 [element] | -| semantics.rb:343:13:343:13 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:343:13:343:13 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:343:13:343:13 | h [element] | semmle.label | h [element] | -| semantics.rb:343:13:343:13 | h [element] | semmle.label | h [element] | -| semantics.rb:345:10:345:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:345:10:345:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:345:10:345:10 | x [element] | semmle.label | x [element] | -| semantics.rb:345:10:345:10 | x [element] | semmle.label | x [element] | +| semantics.rb:343:5:343:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:343:5:343:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:343:5:343:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element 0] | semmle.label | call to s42 : [collection] [element 0] | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element 0] | semmle.label | call to s42 : [collection] [element 0] | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element] | semmle.label | call to s42 : [collection] [element] | +| semantics.rb:343:9:343:14 | call to s42 : [collection] [element] | semmle.label | call to s42 : [collection] [element] | +| semantics.rb:343:13:343:13 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:343:13:343:13 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:343:13:343:13 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:343:13:343:13 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:345:10:345:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:345:10:345:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:345:10:345:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:345:10:345:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:346:10:346:10 | x [element] | semmle.label | x [element] | -| semantics.rb:346:10:346:10 | x [element] | semmle.label | x [element] | +| semantics.rb:346:10:346:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:346:10:346:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:346:10:346:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:346:10:346:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:347:10:347:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:347:10:347:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:347:10:347:10 | x [element] | semmle.label | x [element] | -| semantics.rb:347:10:347:10 | x [element] | semmle.label | x [element] | +| semantics.rb:347:10:347:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:347:10:347:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:347:10:347:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:347:10:347:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:347:10:347:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:347:10:347:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:351:5:351:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:351:5:351:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:351:5:351:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:351:5:351:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | | semantics.rb:351:12:351:22 | call to source | semmle.label | call to source | | semantics.rb:351:12:351:22 | call to source | semmle.label | call to source | -| semantics.rb:354:5:354:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:354:5:354:5 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:354:9:354:14 | call to s43 [element 0] | semmle.label | call to s43 [element 0] | -| semantics.rb:354:9:354:14 | call to s43 [element 0] | semmle.label | call to s43 [element 0] | -| semantics.rb:354:13:354:13 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:354:13:354:13 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:356:10:356:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:356:10:356:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:354:5:354:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:354:5:354:5 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:354:9:354:14 | call to s43 : [collection] [element 0] | semmle.label | call to s43 : [collection] [element 0] | +| semantics.rb:354:9:354:14 | call to s43 : [collection] [element 0] | semmle.label | call to s43 : [collection] [element 0] | +| semantics.rb:354:13:354:13 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:354:13:354:13 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:356:10:356:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:356:10:356:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | semantics.rb:356:10:356:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:356:10:356:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:358:10:358:10 | x [element 0] | semmle.label | x [element 0] | -| semantics.rb:358:10:358:10 | x [element 0] | semmle.label | x [element 0] | +| semantics.rb:358:10:358:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | +| semantics.rb:358:10:358:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | semantics.rb:358:10:358:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:358:10:358:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:363:5:363:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:363:5:363:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | +| semantics.rb:363:5:363:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:363:5:363:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | | semantics.rb:363:12:363:22 | call to source | semmle.label | call to source | | semantics.rb:363:12:363:22 | call to source | semmle.label | call to source | -| semantics.rb:366:9:366:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:366:9:366:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:366:9:366:9 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:366:9:366:9 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:369:10:369:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:369:10:369:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:366:9:366:9 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:366:9:366:9 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:366:9:366:9 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:369:10:369:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:369:10:369:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | | semantics.rb:369:10:369:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:369:10:369:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:370:10:370:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:370:10:370:10 | h [element 1] | semmle.label | h [element 1] | +| semantics.rb:370:10:370:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:370:10:370:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | | semantics.rb:370:10:370:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:370:10:370:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:374:5:374:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:374:5:374:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:374:5:374:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:374:5:374:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | | semantics.rb:374:12:374:22 | call to source | semmle.label | call to source | | semantics.rb:374:12:374:22 | call to source | semmle.label | call to source | -| semantics.rb:375:5:375:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:375:5:375:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:375:5:375:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:375:5:375:5 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:375:5:375:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:375:5:375:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:375:5:375:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:375:5:375:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | | semantics.rb:375:12:375:22 | call to source | semmle.label | call to source | | semantics.rb:375:12:375:22 | call to source | semmle.label | call to source | -| semantics.rb:376:5:376:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:376:5:376:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:376:5:376:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:376:12:376:22 | call to source | semmle.label | call to source | | semantics.rb:376:12:376:22 | call to source | semmle.label | call to source | -| semantics.rb:378:10:378:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:378:10:378:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:378:10:378:10 | h [element] | semmle.label | h [element] | -| semantics.rb:378:10:378:10 | h [element] | semmle.label | h [element] | +| semantics.rb:378:10:378:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:378:10:378:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:378:10:378:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:378:10:378:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:379:10:379:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:379:10:379:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:379:10:379:10 | h [element] | semmle.label | h [element] | -| semantics.rb:379:10:379:10 | h [element] | semmle.label | h [element] | +| semantics.rb:379:10:379:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:379:10:379:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:379:10:379:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:379:10:379:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:379:10:379:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:379:10:379:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:380:10:380:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:380:10:380:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:380:10:380:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:380:10:380:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:380:10:380:10 | h [element] | semmle.label | h [element] | -| semantics.rb:380:10:380:10 | h [element] | semmle.label | h [element] | +| semantics.rb:380:10:380:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:380:10:380:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:380:10:380:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:380:10:380:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:380:10:380:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:380:10:380:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:380:10:380:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:380:10:380:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:382:9:382:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:382:9:382:9 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:382:9:382:9 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:382:9:382:9 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:382:9:382:9 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:382:9:382:9 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:382:9:382:9 | h [element] | semmle.label | h [element] | -| semantics.rb:382:9:382:9 | h [element] | semmle.label | h [element] | -| semantics.rb:384:10:384:10 | h [element] | semmle.label | h [element] | -| semantics.rb:384:10:384:10 | h [element] | semmle.label | h [element] | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:382:9:382:9 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:382:9:382:9 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:382:9:382:9 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:382:9:382:9 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:382:9:382:9 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:384:10:384:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:384:10:384:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:384:10:384:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:384:10:384:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:385:10:385:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:385:10:385:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:385:10:385:10 | h [element] | semmle.label | h [element] | -| semantics.rb:385:10:385:10 | h [element] | semmle.label | h [element] | +| semantics.rb:385:10:385:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:385:10:385:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:385:10:385:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:385:10:385:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:385:10:385:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:385:10:385:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:386:10:386:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:386:10:386:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:386:10:386:10 | h [element] | semmle.label | h [element] | -| semantics.rb:386:10:386:10 | h [element] | semmle.label | h [element] | +| semantics.rb:386:10:386:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:386:10:386:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:386:10:386:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:386:10:386:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:386:10:386:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:386:10:386:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:390:5:390:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:390:5:390:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | +| semantics.rb:390:5:390:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:390:5:390:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | | semantics.rb:390:12:390:22 | call to source | semmle.label | call to source | | semantics.rb:390:12:390:22 | call to source | semmle.label | call to source | -| semantics.rb:391:5:391:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:391:5:391:5 | [post] h [element 0] | semmle.label | [post] h [element 0] | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:391:5:391:5 | [post] h [element 1] | semmle.label | [post] h [element 1] | -| semantics.rb:391:5:391:5 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:391:5:391:5 | h [element 0] | semmle.label | h [element 0] | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 0] | semmle.label | [post] h : [collection] [element 0] | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:391:5:391:5 | [post] h : [collection] [element 1] | semmle.label | [post] h : [collection] [element 1] | +| semantics.rb:391:5:391:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:391:5:391:5 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | | semantics.rb:391:12:391:22 | call to source | semmle.label | call to source | | semantics.rb:391:12:391:22 | call to source | semmle.label | call to source | -| semantics.rb:392:5:392:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:392:5:392:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:392:5:392:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:392:12:392:22 | call to source | semmle.label | call to source | | semantics.rb:392:12:392:22 | call to source | semmle.label | call to source | -| semantics.rb:394:10:394:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:394:10:394:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:394:10:394:10 | h [element] | semmle.label | h [element] | -| semantics.rb:394:10:394:10 | h [element] | semmle.label | h [element] | +| semantics.rb:394:10:394:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:394:10:394:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:394:10:394:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:394:10:394:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:394:10:394:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:394:10:394:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:395:10:395:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:395:10:395:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:395:10:395:10 | h [element] | semmle.label | h [element] | -| semantics.rb:395:10:395:10 | h [element] | semmle.label | h [element] | +| semantics.rb:395:10:395:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:395:10:395:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:395:10:395:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:395:10:395:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:395:10:395:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:395:10:395:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:396:10:396:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:396:10:396:10 | h [element 0] | semmle.label | h [element 0] | -| semantics.rb:396:10:396:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:396:10:396:10 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:396:10:396:10 | h [element] | semmle.label | h [element] | -| semantics.rb:396:10:396:10 | h [element] | semmle.label | h [element] | +| semantics.rb:396:10:396:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:396:10:396:10 | h : [collection] [element 0] | semmle.label | h : [collection] [element 0] | +| semantics.rb:396:10:396:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:396:10:396:10 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:396:10:396:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:396:10:396:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:396:10:396:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:396:10:396:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:398:5:398:5 | x [element 1] | semmle.label | x [element 1] | -| semantics.rb:398:5:398:5 | x [element 1] | semmle.label | x [element 1] | -| semantics.rb:398:9:398:14 | call to s46 [element 1] | semmle.label | call to s46 [element 1] | -| semantics.rb:398:9:398:14 | call to s46 [element 1] | semmle.label | call to s46 [element 1] | -| semantics.rb:398:13:398:13 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:398:13:398:13 | h [element 1] | semmle.label | h [element 1] | -| semantics.rb:401:10:401:10 | x [element 1] | semmle.label | x [element 1] | -| semantics.rb:401:10:401:10 | x [element 1] | semmle.label | x [element 1] | +| semantics.rb:398:5:398:5 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | +| semantics.rb:398:5:398:5 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | +| semantics.rb:398:9:398:14 | call to s46 : [collection] [element 1] | semmle.label | call to s46 : [collection] [element 1] | +| semantics.rb:398:9:398:14 | call to s46 : [collection] [element 1] | semmle.label | call to s46 : [collection] [element 1] | +| semantics.rb:398:13:398:13 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:398:13:398:13 | h : [collection] [element 1] | semmle.label | h : [collection] [element 1] | +| semantics.rb:401:10:401:10 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | +| semantics.rb:401:10:401:10 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | | semantics.rb:401:10:401:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:401:10:401:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:402:10:402:10 | x [element 1] | semmle.label | x [element 1] | -| semantics.rb:402:10:402:10 | x [element 1] | semmle.label | x [element 1] | +| semantics.rb:402:10:402:10 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | +| semantics.rb:402:10:402:10 | x : [collection] [element 1] | semmle.label | x : [collection] [element 1] | | semantics.rb:402:10:402:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:402:10:402:13 | ...[...] | semmle.label | ...[...] | -| semantics.rb:406:5:406:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:406:5:406:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:406:5:406:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:406:5:406:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:406:15:406:25 | call to source | semmle.label | call to source | | semantics.rb:406:15:406:25 | call to source | semmle.label | call to source | -| semantics.rb:407:5:407:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:407:5:407:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:407:5:407:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:407:5:407:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:407:5:407:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:407:5:407:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:407:5:407:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:407:5:407:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:407:5:407:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:407:15:407:25 | call to source | semmle.label | call to source | | semantics.rb:407:15:407:25 | call to source | semmle.label | call to source | -| semantics.rb:408:5:408:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:408:5:408:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:408:5:408:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:408:5:408:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:408:12:408:22 | call to source | semmle.label | call to source | | semantics.rb:408:12:408:22 | call to source | semmle.label | call to source | -| semantics.rb:410:10:410:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:410:10:410:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:410:10:410:10 | h [element] | semmle.label | h [element] | -| semantics.rb:410:10:410:10 | h [element] | semmle.label | h [element] | +| semantics.rb:410:10:410:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:410:10:410:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:410:10:410:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:410:10:410:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:410:10:410:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:410:10:410:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:411:10:411:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:411:10:411:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:411:10:411:10 | h [element] | semmle.label | h [element] | -| semantics.rb:411:10:411:10 | h [element] | semmle.label | h [element] | +| semantics.rb:411:10:411:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:411:10:411:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:411:10:411:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:411:10:411:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:411:10:411:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:411:10:411:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:413:5:413:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:413:5:413:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:413:9:413:14 | call to s47 [element :bar] | semmle.label | call to s47 [element :bar] | -| semantics.rb:413:9:413:14 | call to s47 [element :bar] | semmle.label | call to s47 [element :bar] | -| semantics.rb:413:13:413:13 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:413:13:413:13 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:416:10:416:10 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:416:10:416:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:413:5:413:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:413:5:413:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:413:9:413:14 | call to s47 : [collection] [element :bar] | semmle.label | call to s47 : [collection] [element :bar] | +| semantics.rb:413:9:413:14 | call to s47 : [collection] [element :bar] | semmle.label | call to s47 : [collection] [element :bar] | +| semantics.rb:413:13:413:13 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:413:13:413:13 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:416:10:416:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:416:10:416:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | | semantics.rb:416:10:416:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:416:10:416:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:420:5:420:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:420:5:420:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:420:5:420:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:420:5:420:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:420:15:420:25 | call to source | semmle.label | call to source | | semantics.rb:420:15:420:25 | call to source | semmle.label | call to source | -| semantics.rb:421:5:421:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:421:5:421:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:421:5:421:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:421:5:421:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:421:5:421:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:421:5:421:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:421:5:421:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:421:5:421:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:421:5:421:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:421:15:421:25 | call to source | semmle.label | call to source | | semantics.rb:421:15:421:25 | call to source | semmle.label | call to source | -| semantics.rb:422:5:422:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:422:5:422:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:422:5:422:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:422:5:422:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:422:12:422:22 | call to source | semmle.label | call to source | | semantics.rb:422:12:422:22 | call to source | semmle.label | call to source | -| semantics.rb:424:10:424:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:424:10:424:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:424:10:424:10 | h [element] | semmle.label | h [element] | -| semantics.rb:424:10:424:10 | h [element] | semmle.label | h [element] | +| semantics.rb:424:10:424:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:424:10:424:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:424:10:424:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:424:10:424:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:424:10:424:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:424:10:424:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:425:10:425:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:425:10:425:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:425:10:425:10 | h [element] | semmle.label | h [element] | -| semantics.rb:425:10:425:10 | h [element] | semmle.label | h [element] | +| semantics.rb:425:10:425:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:425:10:425:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:425:10:425:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:425:10:425:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:425:10:425:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:425:10:425:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:427:5:427:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:427:5:427:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:427:9:427:14 | call to s48 [element :bar] | semmle.label | call to s48 [element :bar] | -| semantics.rb:427:9:427:14 | call to s48 [element :bar] | semmle.label | call to s48 [element :bar] | -| semantics.rb:427:13:427:13 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:427:13:427:13 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:430:10:430:10 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:430:10:430:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:427:5:427:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:427:5:427:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:427:9:427:14 | call to s48 : [collection] [element :bar] | semmle.label | call to s48 : [collection] [element :bar] | +| semantics.rb:427:9:427:14 | call to s48 : [collection] [element :bar] | semmle.label | call to s48 : [collection] [element :bar] | +| semantics.rb:427:13:427:13 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:427:13:427:13 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:430:10:430:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:430:10:430:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | | semantics.rb:430:10:430:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:430:10:430:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:434:5:434:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:434:5:434:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:434:5:434:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:434:5:434:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:434:15:434:25 | call to source | semmle.label | call to source | | semantics.rb:434:15:434:25 | call to source | semmle.label | call to source | -| semantics.rb:435:5:435:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:435:5:435:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:435:5:435:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:435:5:435:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:435:5:435:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:435:5:435:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:435:5:435:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:435:5:435:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:435:5:435:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:435:15:435:25 | call to source | semmle.label | call to source | | semantics.rb:435:15:435:25 | call to source | semmle.label | call to source | -| semantics.rb:436:5:436:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:436:5:436:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:436:5:436:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:436:12:436:22 | call to source | semmle.label | call to source | | semantics.rb:436:12:436:22 | call to source | semmle.label | call to source | -| semantics.rb:438:10:438:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:438:10:438:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:438:10:438:10 | h [element] | semmle.label | h [element] | -| semantics.rb:438:10:438:10 | h [element] | semmle.label | h [element] | +| semantics.rb:438:10:438:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:438:10:438:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:438:10:438:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:438:10:438:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:438:10:438:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:438:10:438:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:439:10:439:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:439:10:439:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:439:10:439:10 | h [element] | semmle.label | h [element] | -| semantics.rb:439:10:439:10 | h [element] | semmle.label | h [element] | +| semantics.rb:439:10:439:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:439:10:439:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:439:10:439:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:439:10:439:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:439:10:439:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:439:10:439:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:441:5:441:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:441:5:441:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:441:5:441:5 | x [element] | semmle.label | x [element] | -| semantics.rb:441:5:441:5 | x [element] | semmle.label | x [element] | -| semantics.rb:441:9:441:14 | call to s49 [element :bar] | semmle.label | call to s49 [element :bar] | -| semantics.rb:441:9:441:14 | call to s49 [element :bar] | semmle.label | call to s49 [element :bar] | -| semantics.rb:441:9:441:14 | call to s49 [element] | semmle.label | call to s49 [element] | -| semantics.rb:441:9:441:14 | call to s49 [element] | semmle.label | call to s49 [element] | -| semantics.rb:441:13:441:13 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:441:13:441:13 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:441:13:441:13 | h [element] | semmle.label | h [element] | -| semantics.rb:441:13:441:13 | h [element] | semmle.label | h [element] | -| semantics.rb:443:10:443:10 | x [element] | semmle.label | x [element] | -| semantics.rb:443:10:443:10 | x [element] | semmle.label | x [element] | +| semantics.rb:441:5:441:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:441:5:441:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:441:5:441:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:441:5:441:5 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element :bar] | semmle.label | call to s49 : [collection] [element :bar] | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element :bar] | semmle.label | call to s49 : [collection] [element :bar] | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element] | semmle.label | call to s49 : [collection] [element] | +| semantics.rb:441:9:441:14 | call to s49 : [collection] [element] | semmle.label | call to s49 : [collection] [element] | +| semantics.rb:441:13:441:13 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:441:13:441:13 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:441:13:441:13 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:441:13:441:13 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:443:10:443:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:443:10:443:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:443:10:443:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:443:10:443:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:444:10:444:10 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:444:10:444:10 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:444:10:444:10 | x [element] | semmle.label | x [element] | -| semantics.rb:444:10:444:10 | x [element] | semmle.label | x [element] | +| semantics.rb:444:10:444:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:444:10:444:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:444:10:444:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| semantics.rb:444:10:444:10 | x : [collection] [element] | semmle.label | x : [collection] [element] | | semantics.rb:444:10:444:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:444:10:444:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:448:5:448:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:448:5:448:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:448:5:448:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:448:5:448:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:448:15:448:25 | call to source | semmle.label | call to source | | semantics.rb:448:15:448:25 | call to source | semmle.label | call to source | -| semantics.rb:449:5:449:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:449:5:449:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:449:5:449:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:449:5:449:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:449:5:449:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:449:5:449:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:449:5:449:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:449:5:449:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:449:5:449:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:449:15:449:25 | call to source | semmle.label | call to source | | semantics.rb:449:15:449:25 | call to source | semmle.label | call to source | -| semantics.rb:450:5:450:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:450:5:450:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:450:5:450:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:450:5:450:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:450:12:450:22 | call to source | semmle.label | call to source | | semantics.rb:450:12:450:22 | call to source | semmle.label | call to source | -| semantics.rb:452:10:452:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:452:10:452:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:452:10:452:10 | h [element] | semmle.label | h [element] | -| semantics.rb:452:10:452:10 | h [element] | semmle.label | h [element] | +| semantics.rb:452:10:452:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:452:10:452:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:452:10:452:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:452:10:452:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:452:10:452:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:452:10:452:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:453:10:453:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:453:10:453:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:453:10:453:10 | h [element] | semmle.label | h [element] | -| semantics.rb:453:10:453:10 | h [element] | semmle.label | h [element] | +| semantics.rb:453:10:453:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:453:10:453:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:453:10:453:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:453:10:453:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:453:10:453:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:453:10:453:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:455:9:455:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:455:9:455:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:455:9:455:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:455:9:455:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:458:10:458:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:458:10:458:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:455:9:455:9 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:455:9:455:9 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:455:9:455:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:455:9:455:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:458:10:458:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:458:10:458:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | | semantics.rb:458:10:458:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:458:10:458:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:462:5:462:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:462:5:462:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:462:5:462:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:462:5:462:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:462:15:462:25 | call to source | semmle.label | call to source | | semantics.rb:462:15:462:25 | call to source | semmle.label | call to source | -| semantics.rb:463:5:463:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:463:5:463:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:463:5:463:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:463:5:463:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:463:5:463:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:463:5:463:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:463:5:463:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:463:5:463:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:463:5:463:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:463:15:463:25 | call to source | semmle.label | call to source | | semantics.rb:463:15:463:25 | call to source | semmle.label | call to source | -| semantics.rb:464:5:464:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:464:5:464:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:464:5:464:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:464:12:464:22 | call to source | semmle.label | call to source | | semantics.rb:464:12:464:22 | call to source | semmle.label | call to source | -| semantics.rb:466:10:466:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:466:10:466:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:466:10:466:10 | h [element] | semmle.label | h [element] | -| semantics.rb:466:10:466:10 | h [element] | semmle.label | h [element] | +| semantics.rb:466:10:466:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:466:10:466:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:466:10:466:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:466:10:466:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:466:10:466:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:466:10:466:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:467:10:467:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:467:10:467:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:467:10:467:10 | h [element] | semmle.label | h [element] | -| semantics.rb:467:10:467:10 | h [element] | semmle.label | h [element] | +| semantics.rb:467:10:467:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:467:10:467:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:467:10:467:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:467:10:467:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:467:10:467:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:467:10:467:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:469:9:469:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:469:9:469:9 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:469:9:469:9 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:469:9:469:9 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:469:9:469:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:469:9:469:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:469:9:469:9 | h [element] | semmle.label | h [element] | -| semantics.rb:469:9:469:9 | h [element] | semmle.label | h [element] | -| semantics.rb:471:10:471:10 | h [element] | semmle.label | h [element] | -| semantics.rb:471:10:471:10 | h [element] | semmle.label | h [element] | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:469:9:469:9 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:469:9:469:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:469:9:469:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:469:9:469:9 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:469:9:469:9 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:471:10:471:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:471:10:471:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:471:10:471:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:471:10:471:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:472:10:472:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:472:10:472:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:472:10:472:10 | h [element] | semmle.label | h [element] | -| semantics.rb:472:10:472:10 | h [element] | semmle.label | h [element] | +| semantics.rb:472:10:472:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:472:10:472:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:472:10:472:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:472:10:472:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:472:10:472:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:472:10:472:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:476:5:476:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:476:5:476:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:476:5:476:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:476:5:476:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:476:15:476:25 | call to source | semmle.label | call to source | | semantics.rb:476:15:476:25 | call to source | semmle.label | call to source | -| semantics.rb:477:5:477:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:477:5:477:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:477:5:477:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:477:5:477:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:477:5:477:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:477:5:477:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:477:5:477:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:477:5:477:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:477:5:477:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:477:15:477:25 | call to source | semmle.label | call to source | | semantics.rb:477:15:477:25 | call to source | semmle.label | call to source | -| semantics.rb:478:5:478:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:478:5:478:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:478:5:478:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:478:5:478:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:478:12:478:22 | call to source | semmle.label | call to source | | semantics.rb:478:12:478:22 | call to source | semmle.label | call to source | -| semantics.rb:480:10:480:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:480:10:480:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:480:10:480:10 | h [element] | semmle.label | h [element] | -| semantics.rb:480:10:480:10 | h [element] | semmle.label | h [element] | +| semantics.rb:480:10:480:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:480:10:480:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:480:10:480:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:480:10:480:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:480:10:480:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:480:10:480:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:481:10:481:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:481:10:481:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:481:10:481:10 | h [element] | semmle.label | h [element] | -| semantics.rb:481:10:481:10 | h [element] | semmle.label | h [element] | +| semantics.rb:481:10:481:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:481:10:481:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:481:10:481:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:481:10:481:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:481:10:481:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:481:10:481:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:483:5:483:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:483:5:483:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:483:5:483:5 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:483:5:483:5 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:486:10:486:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:486:10:486:10 | h [element :bar] | semmle.label | h [element :bar] | +| semantics.rb:483:5:483:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:483:5:483:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:483:5:483:5 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:483:5:483:5 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:486:10:486:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:486:10:486:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | | semantics.rb:486:10:486:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:486:10:486:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:490:5:490:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:490:5:490:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:490:5:490:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:490:5:490:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:490:15:490:25 | call to source | semmle.label | call to source | | semantics.rb:490:15:490:25 | call to source | semmle.label | call to source | -| semantics.rb:491:5:491:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:491:5:491:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:491:5:491:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:491:5:491:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:491:5:491:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:491:5:491:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:491:5:491:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:491:5:491:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:491:5:491:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:491:15:491:25 | call to source | semmle.label | call to source | | semantics.rb:491:15:491:25 | call to source | semmle.label | call to source | -| semantics.rb:492:5:492:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:492:5:492:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:492:5:492:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:492:5:492:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:492:12:492:22 | call to source | semmle.label | call to source | | semantics.rb:492:12:492:22 | call to source | semmle.label | call to source | -| semantics.rb:494:10:494:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:494:10:494:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:494:10:494:10 | h [element] | semmle.label | h [element] | -| semantics.rb:494:10:494:10 | h [element] | semmle.label | h [element] | +| semantics.rb:494:10:494:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:494:10:494:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:494:10:494:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:494:10:494:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:494:10:494:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:494:10:494:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:495:10:495:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:495:10:495:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:495:10:495:10 | h [element] | semmle.label | h [element] | -| semantics.rb:495:10:495:10 | h [element] | semmle.label | h [element] | +| semantics.rb:495:10:495:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:495:10:495:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:495:10:495:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:495:10:495:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:495:10:495:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:495:10:495:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:497:5:497:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:497:5:497:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:497:9:497:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:497:9:497:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:497:9:497:15 | call to s53 [element :bar] | semmle.label | call to s53 [element :bar] | -| semantics.rb:497:9:497:15 | call to s53 [element :bar] | semmle.label | call to s53 [element :bar] | -| semantics.rb:500:10:500:10 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:500:10:500:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:497:5:497:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:497:5:497:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:497:9:497:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:497:9:497:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:497:9:497:15 | call to s53 : [collection] [element :bar] | semmle.label | call to s53 : [collection] [element :bar] | +| semantics.rb:497:9:497:15 | call to s53 : [collection] [element :bar] | semmle.label | call to s53 : [collection] [element :bar] | +| semantics.rb:500:10:500:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:500:10:500:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | | semantics.rb:500:10:500:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:500:10:500:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:502:10:502:20 | call to source | semmle.label | call to source | | semantics.rb:502:10:502:20 | call to source | semmle.label | call to source | | semantics.rb:502:10:502:26 | call to s53 | semmle.label | call to s53 | | semantics.rb:502:10:502:26 | call to s53 | semmle.label | call to s53 | -| semantics.rb:506:5:506:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:506:5:506:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | +| semantics.rb:506:5:506:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:506:5:506:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | | semantics.rb:506:15:506:25 | call to source | semmle.label | call to source | | semantics.rb:506:15:506:25 | call to source | semmle.label | call to source | -| semantics.rb:507:5:507:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:507:5:507:5 | [post] h [element :bar] | semmle.label | [post] h [element :bar] | -| semantics.rb:507:5:507:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:507:5:507:5 | [post] h [element :foo] | semmle.label | [post] h [element :foo] | -| semantics.rb:507:5:507:5 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:507:5:507:5 | h [element :foo] | semmle.label | h [element :foo] | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :bar] | semmle.label | [post] h : [collection] [element :bar] | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:507:5:507:5 | [post] h : [collection] [element :foo] | semmle.label | [post] h : [collection] [element :foo] | +| semantics.rb:507:5:507:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:507:5:507:5 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | | semantics.rb:507:15:507:25 | call to source | semmle.label | call to source | | semantics.rb:507:15:507:25 | call to source | semmle.label | call to source | -| semantics.rb:508:5:508:5 | [post] h [element] | semmle.label | [post] h [element] | -| semantics.rb:508:5:508:5 | [post] h [element] | semmle.label | [post] h [element] | +| semantics.rb:508:5:508:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | +| semantics.rb:508:5:508:5 | [post] h : [collection] [element] | semmle.label | [post] h : [collection] [element] | | semantics.rb:508:12:508:22 | call to source | semmle.label | call to source | | semantics.rb:508:12:508:22 | call to source | semmle.label | call to source | -| semantics.rb:510:10:510:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:510:10:510:10 | h [element :foo] | semmle.label | h [element :foo] | -| semantics.rb:510:10:510:10 | h [element] | semmle.label | h [element] | -| semantics.rb:510:10:510:10 | h [element] | semmle.label | h [element] | +| semantics.rb:510:10:510:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:510:10:510:10 | h : [collection] [element :foo] | semmle.label | h : [collection] [element :foo] | +| semantics.rb:510:10:510:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:510:10:510:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:510:10:510:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:510:10:510:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:511:10:511:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:511:10:511:10 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:511:10:511:10 | h [element] | semmle.label | h [element] | -| semantics.rb:511:10:511:10 | h [element] | semmle.label | h [element] | +| semantics.rb:511:10:511:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:511:10:511:10 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:511:10:511:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| semantics.rb:511:10:511:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | semantics.rb:511:10:511:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:511:10:511:16 | ...[...] | semmle.label | ...[...] | -| semantics.rb:513:5:513:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:513:5:513:5 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:513:9:513:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:513:9:513:9 | h [element :bar] | semmle.label | h [element :bar] | -| semantics.rb:513:9:513:15 | call to s54 [element :bar] | semmle.label | call to s54 [element :bar] | -| semantics.rb:513:9:513:15 | call to s54 [element :bar] | semmle.label | call to s54 [element :bar] | -| semantics.rb:516:10:516:10 | x [element :bar] | semmle.label | x [element :bar] | -| semantics.rb:516:10:516:10 | x [element :bar] | semmle.label | x [element :bar] | +| semantics.rb:513:5:513:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:513:5:513:5 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:513:9:513:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:513:9:513:9 | h : [collection] [element :bar] | semmle.label | h : [collection] [element :bar] | +| semantics.rb:513:9:513:15 | call to s54 : [collection] [element :bar] | semmle.label | call to s54 : [collection] [element :bar] | +| semantics.rb:513:9:513:15 | call to s54 : [collection] [element :bar] | semmle.label | call to s54 : [collection] [element :bar] | +| semantics.rb:516:10:516:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | +| semantics.rb:516:10:516:10 | x : [collection] [element :bar] | semmle.label | x : [collection] [element :bar] | | semantics.rb:516:10:516:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:516:10:516:16 | ...[...] | semmle.label | ...[...] | subpaths diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index 1bdf43dbb64..2b3159fce5b 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -5,254 +5,263 @@ edges | blocks.rb:18:11:18:11 | x | blocks.rb:24:18:24:18 | x | provenance | | | blocks.rb:24:3:24:11 | call to source | blocks.rb:17:10:17:10 | x | provenance | | | blocks.rb:24:18:24:18 | x | blocks.rb:25:8:25:8 | x | provenance | | -| captured_variables.rb:9:24:9:24 | x | captured_variables.rb:11:5:11:6 | fn [captured x] | provenance | | -| captured_variables.rb:11:5:11:6 | fn [captured x] | captured_variables.rb:10:20:10:20 | x | provenance | | +| captured_variables.rb:9:24:9:24 | x | captured_variables.rb:11:5:11:6 | fn : [lambda] [captured x] | provenance | | +| captured_variables.rb:11:5:11:6 | fn : [lambda] [captured x] | captured_variables.rb:10:20:10:20 | x | provenance | | | captured_variables.rb:13:20:13:29 | call to taint | captured_variables.rb:9:24:9:24 | x | provenance | | -| captured_variables.rb:15:28:15:28 | x | captured_variables.rb:16:5:18:5 | -> { ... } [captured x] | provenance | | -| captured_variables.rb:20:1:20:35 | ( ... ) [captured x] | captured_variables.rb:17:14:17:14 | x | provenance | | -| captured_variables.rb:20:2:20:34 | call to capture_escape_return1 [captured x] | captured_variables.rb:20:1:20:35 | ( ... ) [captured x] | provenance | | +| captured_variables.rb:15:28:15:28 | x | captured_variables.rb:16:5:18:5 | -> { ... } : [lambda] [captured x] | provenance | | +| captured_variables.rb:20:1:20:35 | ( ... ) : [lambda] [captured x] | captured_variables.rb:17:14:17:14 | x | provenance | | +| captured_variables.rb:20:2:20:34 | call to capture_escape_return1 : [lambda] [captured x] | captured_variables.rb:20:1:20:35 | ( ... ) : [lambda] [captured x] | provenance | | | captured_variables.rb:20:25:20:34 | call to taint | captured_variables.rb:15:28:15:28 | x | provenance | | -| captured_variables.rb:20:25:20:34 | call to taint | captured_variables.rb:20:2:20:34 | call to capture_escape_return1 [captured x] | provenance | | -| captured_variables.rb:22:28:22:28 | x | captured_variables.rb:23:5:25:5 | -> { ... } [captured x] | provenance | | -| captured_variables.rb:27:25:27:57 | call to capture_escape_return2 [captured x] | captured_variables.rb:24:14:24:14 | x | provenance | heuristic-callback | +| captured_variables.rb:20:25:20:34 | call to taint | captured_variables.rb:20:2:20:34 | call to capture_escape_return1 : [lambda] [captured x] | provenance | | +| captured_variables.rb:22:28:22:28 | x | captured_variables.rb:23:5:25:5 | -> { ... } : [lambda] [captured x] | provenance | | +| captured_variables.rb:27:25:27:57 | call to capture_escape_return2 : [lambda] [captured x] | captured_variables.rb:24:14:24:14 | x | provenance | heuristic-callback | | captured_variables.rb:27:48:27:57 | call to taint | captured_variables.rb:22:28:22:28 | x | provenance | | -| captured_variables.rb:27:48:27:57 | call to taint | captured_variables.rb:27:25:27:57 | call to capture_escape_return2 [captured x] | provenance | | -| captured_variables.rb:29:33:29:33 | x | captured_variables.rb:33:29:33:30 | fn [captured x] | provenance | | -| captured_variables.rb:33:29:33:30 | fn [captured x] | captured_variables.rb:31:14:31:14 | x | provenance | heuristic-callback | +| captured_variables.rb:27:48:27:57 | call to taint | captured_variables.rb:27:25:27:57 | call to capture_escape_return2 : [lambda] [captured x] | provenance | | +| captured_variables.rb:29:33:29:33 | x | captured_variables.rb:33:29:33:30 | fn : [lambda] [captured x] | provenance | | +| captured_variables.rb:33:29:33:30 | fn : [lambda] [captured x] | captured_variables.rb:31:14:31:14 | x | provenance | heuristic-callback | | captured_variables.rb:35:29:35:38 | call to taint | captured_variables.rb:29:33:29:33 | x | provenance | | -| captured_variables.rb:37:13:37:14 | fn [captured x] | captured_variables.rb:38:5:38:6 | fn [captured x] | provenance | | -| captured_variables.rb:38:5:38:6 | fn [captured x] | captured_variables.rb:42:14:42:14 | x | provenance | | -| captured_variables.rb:40:31:40:31 | x | captured_variables.rb:44:13:44:14 | fn [captured x] | provenance | | -| captured_variables.rb:44:13:44:14 | fn [captured x] | captured_variables.rb:37:13:37:14 | fn [captured x] | provenance | | +| captured_variables.rb:37:13:37:14 | fn : [lambda] [captured x] | captured_variables.rb:38:5:38:6 | fn : [lambda] [captured x] | provenance | | +| captured_variables.rb:38:5:38:6 | fn : [lambda] [captured x] | captured_variables.rb:42:14:42:14 | x | provenance | | +| captured_variables.rb:40:31:40:31 | x | captured_variables.rb:44:13:44:14 | fn : [lambda] [captured x] | provenance | | +| captured_variables.rb:44:13:44:14 | fn : [lambda] [captured x] | captured_variables.rb:37:13:37:14 | fn : [lambda] [captured x] | provenance | | | captured_variables.rb:46:27:46:36 | call to taint | captured_variables.rb:40:31:40:31 | x | provenance | | -| captured_variables.rb:48:5:48:12 | call to taint | captured_variables.rb:49:16:52:3 | do ... end [captured x] | provenance | | +| captured_variables.rb:48:5:48:12 | call to taint | captured_variables.rb:49:16:52:3 | do ... end : [lambda] [captured x] | provenance | | | captured_variables.rb:48:5:48:12 | call to taint | captured_variables.rb:54:6:54:6 | x | provenance | | -| captured_variables.rb:49:16:52:3 | [post] do ... end [captured x] | captured_variables.rb:54:6:54:6 | x | provenance | | -| captured_variables.rb:49:16:52:3 | do ... end [captured x] | captured_variables.rb:50:10:50:10 | x | provenance | | -| captured_variables.rb:49:16:52:3 | do ... end [captured x] | captured_variables.rb:50:10:50:10 | x | provenance | heuristic-callback | -| captured_variables.rb:51:9:51:16 | call to taint | captured_variables.rb:49:16:52:3 | [post] do ... end [captured x] | provenance | | -| captured_variables.rb:51:9:51:16 | call to taint | captured_variables.rb:49:16:52:3 | [post] do ... end [captured x] | provenance | heuristic-callback | +| captured_variables.rb:49:16:52:3 | [post] do ... end : [lambda] [captured x] | captured_variables.rb:54:6:54:6 | x | provenance | | +| captured_variables.rb:49:16:52:3 | do ... end : [lambda] [captured x] | captured_variables.rb:50:10:50:10 | x | provenance | | +| captured_variables.rb:49:16:52:3 | do ... end : [lambda] [captured x] | captured_variables.rb:50:10:50:10 | x | provenance | heuristic-callback | +| captured_variables.rb:51:9:51:16 | call to taint | captured_variables.rb:49:16:52:3 | [post] do ... end : [lambda] [captured x] | provenance | | +| captured_variables.rb:51:9:51:16 | call to taint | captured_variables.rb:49:16:52:3 | [post] do ... end : [lambda] [captured x] | provenance | heuristic-callback | | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:58:18:58:18 | x | provenance | | -| captured_variables.rb:58:9:58:14 | [post] self [@field] | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | provenance | | +| captured_variables.rb:58:9:58:14 | [post] self [@field] | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | provenance | | | captured_variables.rb:58:18:58:18 | x | captured_variables.rb:58:9:58:14 | [post] self [@field] | provenance | | -| captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:16:61:21 | self [@field] | provenance | | +| captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:16:61:21 | self : Foo [@field] | provenance | | +| captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:16:61:21 | self : Foo [@field] | provenance | | | captured_variables.rb:61:16:61:21 | @field | captured_variables.rb:61:9:61:21 | return | provenance | | -| captured_variables.rb:61:16:61:21 | self [@field] | captured_variables.rb:61:16:61:21 | @field | provenance | | -| captured_variables.rb:66:1:66:3 | [post] foo [@field] | captured_variables.rb:67:16:70:3 | do ... end [captured foo, @field] | provenance | | -| captured_variables.rb:66:1:66:3 | [post] foo [@field] | captured_variables.rb:72:6:72:8 | foo [@field] | provenance | | +| captured_variables.rb:61:16:61:21 | @field | captured_variables.rb:61:9:61:21 | return | provenance | | +| captured_variables.rb:61:16:61:21 | self : Foo [@field] | captured_variables.rb:61:16:61:21 | @field | provenance | | +| captured_variables.rb:61:16:61:21 | self : Foo [@field] | captured_variables.rb:61:16:61:21 | @field | provenance | | +| captured_variables.rb:66:1:66:3 | [post] foo : Foo [@field] | captured_variables.rb:67:16:70:3 | do ... end : [lambda] [captured foo, @field] | provenance | | +| captured_variables.rb:66:1:66:3 | [post] foo : Foo [@field] | captured_variables.rb:72:6:72:8 | foo : Foo [@field] | provenance | | | captured_variables.rb:66:15:66:22 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | -| captured_variables.rb:66:15:66:22 | call to taint | captured_variables.rb:66:1:66:3 | [post] foo [@field] | provenance | | +| captured_variables.rb:66:15:66:22 | call to taint | captured_variables.rb:66:1:66:3 | [post] foo : Foo [@field] | provenance | | | captured_variables.rb:66:15:66:22 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| captured_variables.rb:67:16:70:3 | [post] do ... end [captured foo, @field] | captured_variables.rb:72:6:72:8 | foo [@field] | provenance | | -| captured_variables.rb:67:16:70:3 | do ... end [captured foo, @field] | captured_variables.rb:68:10:68:12 | foo [@field] | provenance | | -| captured_variables.rb:67:16:70:3 | do ... end [captured foo, @field] | captured_variables.rb:68:10:68:12 | foo [@field] | provenance | heuristic-callback | -| captured_variables.rb:68:10:68:12 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | +| captured_variables.rb:67:16:70:3 | [post] do ... end : [lambda] [captured foo, @field] | captured_variables.rb:72:6:72:8 | foo [@field] | provenance | | +| captured_variables.rb:67:16:70:3 | do ... end : [lambda] [captured foo, @field] | captured_variables.rb:68:10:68:12 | foo [@field] | provenance | | +| captured_variables.rb:67:16:70:3 | do ... end : [lambda] [captured foo, @field] | captured_variables.rb:68:10:68:12 | foo [@field] | provenance | heuristic-callback | +| captured_variables.rb:68:10:68:12 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | | captured_variables.rb:68:10:68:12 | foo [@field] | captured_variables.rb:68:10:68:22 | call to get_field | provenance | | -| captured_variables.rb:68:10:68:12 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| captured_variables.rb:69:5:69:7 | [post] foo [@field] | captured_variables.rb:67:16:70:3 | [post] do ... end [captured foo, @field] | provenance | | -| captured_variables.rb:69:5:69:7 | [post] foo [@field] | captured_variables.rb:67:16:70:3 | [post] do ... end [captured foo, @field] | provenance | heuristic-callback | +| captured_variables.rb:68:10:68:12 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| captured_variables.rb:69:5:69:7 | [post] foo : Foo [@field] | captured_variables.rb:67:16:70:3 | [post] do ... end : [lambda] [captured foo, @field] | provenance | | +| captured_variables.rb:69:5:69:7 | [post] foo : Foo [@field] | captured_variables.rb:67:16:70:3 | [post] do ... end : [lambda] [captured foo, @field] | provenance | heuristic-callback | | captured_variables.rb:69:19:69:26 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | -| captured_variables.rb:69:19:69:26 | call to taint | captured_variables.rb:69:5:69:7 | [post] foo [@field] | provenance | | +| captured_variables.rb:69:19:69:26 | call to taint | captured_variables.rb:69:5:69:7 | [post] foo : Foo [@field] | provenance | | | captured_variables.rb:69:19:69:26 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| captured_variables.rb:72:6:72:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | +| captured_variables.rb:72:6:72:8 | foo : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| captured_variables.rb:72:6:72:8 | foo : Foo [@field] | captured_variables.rb:72:6:72:18 | call to get_field | provenance | | +| captured_variables.rb:72:6:72:8 | foo : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| captured_variables.rb:72:6:72:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | | captured_variables.rb:72:6:72:8 | foo [@field] | captured_variables.rb:72:6:72:18 | call to get_field | provenance | | -| captured_variables.rb:72:6:72:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| captured_variables.rb:78:20:80:7 | [post] do ... end [captured foo, @field] | captured_variables.rb:83:6:83:8 | foo [@field] | provenance | | -| captured_variables.rb:79:9:79:11 | [post] foo [@field] | captured_variables.rb:78:20:80:7 | [post] do ... end [captured foo, @field] | provenance | | -| captured_variables.rb:79:9:79:11 | [post] foo [@field] | captured_variables.rb:78:20:80:7 | [post] do ... end [captured foo, @field] | provenance | heuristic-callback | +| captured_variables.rb:72:6:72:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| captured_variables.rb:78:20:80:7 | [post] do ... end : [lambda] [captured foo, @field] | captured_variables.rb:83:6:83:8 | foo [@field] | provenance | | +| captured_variables.rb:79:9:79:11 | [post] foo : Foo [@field] | captured_variables.rb:78:20:80:7 | [post] do ... end : [lambda] [captured foo, @field] | provenance | | +| captured_variables.rb:79:9:79:11 | [post] foo : Foo [@field] | captured_variables.rb:78:20:80:7 | [post] do ... end : [lambda] [captured foo, @field] | provenance | heuristic-callback | | captured_variables.rb:79:23:79:30 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | -| captured_variables.rb:79:23:79:30 | call to taint | captured_variables.rb:79:9:79:11 | [post] foo [@field] | provenance | | +| captured_variables.rb:79:23:79:30 | call to taint | captured_variables.rb:79:9:79:11 | [post] foo : Foo [@field] | provenance | | | captured_variables.rb:79:23:79:30 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| captured_variables.rb:83:6:83:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | +| captured_variables.rb:83:6:83:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | | captured_variables.rb:83:6:83:8 | foo [@field] | captured_variables.rb:83:6:83:18 | call to get_field | provenance | | -| captured_variables.rb:83:6:83:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| captured_variables.rb:85:5:85:12 | call to taint | captured_variables.rb:90:1:90:2 | fn [captured y] | provenance | | +| captured_variables.rb:83:6:83:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| captured_variables.rb:85:5:85:12 | call to taint | captured_variables.rb:90:1:90:2 | fn : [lambda] [captured y] | provenance | | | captured_variables.rb:85:5:85:12 | call to taint | captured_variables.rb:91:6:91:6 | y | provenance | | -| captured_variables.rb:88:9:88:16 | call to taint | captured_variables.rb:90:1:90:2 | [post] fn [captured y] | provenance | | -| captured_variables.rb:90:1:90:2 | [post] fn [captured y] | captured_variables.rb:91:6:91:6 | y | provenance | | -| captured_variables.rb:90:1:90:2 | fn [captured y] | captured_variables.rb:87:10:87:10 | y | provenance | | -| captured_variables.rb:93:17:93:17 | x | captured_variables.rb:94:5:96:5 | -> { ... } [captured x] | provenance | | -| captured_variables.rb:98:1:98:21 | call to capture_arg [captured x] | captured_variables.rb:95:14:95:14 | x | provenance | | +| captured_variables.rb:88:9:88:16 | call to taint | captured_variables.rb:90:1:90:2 | [post] fn : [lambda] [captured y] | provenance | | +| captured_variables.rb:90:1:90:2 | [post] fn : [lambda] [captured y] | captured_variables.rb:91:6:91:6 | y | provenance | | +| captured_variables.rb:90:1:90:2 | fn : [lambda] [captured y] | captured_variables.rb:87:10:87:10 | y | provenance | | +| captured_variables.rb:93:17:93:17 | x | captured_variables.rb:94:5:96:5 | -> { ... } : [lambda] [captured x] | provenance | | +| captured_variables.rb:98:1:98:21 | call to capture_arg : [lambda] [captured x] | captured_variables.rb:95:14:95:14 | x | provenance | | | captured_variables.rb:98:13:98:20 | call to taint | captured_variables.rb:93:17:93:17 | x | provenance | | -| captured_variables.rb:98:13:98:20 | call to taint | captured_variables.rb:98:1:98:21 | call to capture_arg [captured x] | provenance | | +| captured_variables.rb:98:13:98:20 | call to taint | captured_variables.rb:98:1:98:21 | call to capture_arg : [lambda] [captured x] | provenance | | | captured_variables.rb:100:21:100:21 | x | captured_variables.rb:101:11:101:11 | x | provenance | | | captured_variables.rb:101:11:101:11 | x | captured_variables.rb:104:31:104:31 | x | provenance | | | captured_variables.rb:104:17:104:24 | call to taint | captured_variables.rb:100:21:100:21 | x | provenance | | | captured_variables.rb:104:31:104:31 | x | captured_variables.rb:105:10:105:10 | x | provenance | | -| captured_variables.rb:109:9:109:17 | call to taint | captured_variables.rb:117:5:117:10 | middle [captured x] | provenance | | +| captured_variables.rb:109:9:109:17 | call to taint | captured_variables.rb:117:5:117:10 | middle : [lambda] [captured x] | provenance | | | captured_variables.rb:109:9:109:17 | call to taint | captured_variables.rb:118:10:118:10 | x | provenance | | -| captured_variables.rb:113:17:113:25 | call to taint | captured_variables.rb:115:9:115:13 | [post] inner [captured x] | provenance | | -| captured_variables.rb:115:9:115:13 | [post] inner [captured x] | captured_variables.rb:117:5:117:10 | [post] middle [captured x] | provenance | | -| captured_variables.rb:115:9:115:13 | inner [captured x] | captured_variables.rb:112:18:112:18 | x | provenance | | -| captured_variables.rb:117:5:117:10 | [post] middle [captured x] | captured_variables.rb:118:10:118:10 | x | provenance | | -| captured_variables.rb:117:5:117:10 | middle [captured x] | captured_variables.rb:115:9:115:13 | inner [captured x] | provenance | | -| captured_variables.rb:147:5:147:6 | [post] self [@x] | captured_variables.rb:153:14:155:7 | do ... end [captured self, @x] | provenance | | +| captured_variables.rb:113:17:113:25 | call to taint | captured_variables.rb:115:9:115:13 | [post] inner : [lambda] [captured x] | provenance | | +| captured_variables.rb:115:9:115:13 | [post] inner : [lambda] [captured x] | captured_variables.rb:117:5:117:10 | [post] middle : [lambda] [captured x] | provenance | | +| captured_variables.rb:115:9:115:13 | inner : [lambda] [captured x] | captured_variables.rb:112:18:112:18 | x | provenance | | +| captured_variables.rb:117:5:117:10 | [post] middle : [lambda] [captured x] | captured_variables.rb:118:10:118:10 | x | provenance | | +| captured_variables.rb:117:5:117:10 | middle : [lambda] [captured x] | captured_variables.rb:115:9:115:13 | inner : [lambda] [captured x] | provenance | | +| captured_variables.rb:147:5:147:6 | [post] self [@x] | captured_variables.rb:153:14:155:7 | do ... end : [lambda] [captured self, @x] | provenance | | | captured_variables.rb:147:10:147:18 | call to taint | captured_variables.rb:147:5:147:6 | [post] self [@x] | provenance | | -| captured_variables.rb:149:5:151:7 | &block [captured self, @x] | captured_variables.rb:154:14:154:15 | self [@x] | provenance | | -| captured_variables.rb:153:14:155:7 | do ... end [captured self, @x] | captured_variables.rb:149:5:151:7 | &block [captured self, @x] | provenance | | +| captured_variables.rb:149:5:151:7 | &block : [lambda] [captured self, @x] | captured_variables.rb:154:14:154:15 | self [@x] | provenance | | +| captured_variables.rb:153:14:155:7 | do ... end : [lambda] [captured self, @x] | captured_variables.rb:149:5:151:7 | &block : [lambda] [captured self, @x] | provenance | | | captured_variables.rb:154:14:154:15 | self [@x] | captured_variables.rb:154:14:154:15 | @x | provenance | | -| captured_variables.rb:160:9:160:10 | [post] self [@x] | captured_variables.rb:174:1:174:24 | call to new [@x] | provenance | | +| captured_variables.rb:160:9:160:10 | [post] self [@x] | captured_variables.rb:174:1:174:24 | call to new : CaptureInstanceSelf1 [@x] | provenance | | | captured_variables.rb:160:14:160:22 | call to taint | captured_variables.rb:160:9:160:10 | [post] self [@x] | provenance | | -| captured_variables.rb:163:5:165:7 | &block [captured self, @x] | captured_variables.rb:169:18:169:19 | self [@x] | provenance | | -| captured_variables.rb:167:5:171:7 | self in baz [@x] | captured_variables.rb:168:18:170:11 | do ... end [captured self, @x] | provenance | | -| captured_variables.rb:168:18:170:11 | do ... end [captured self, @x] | captured_variables.rb:163:5:165:7 | &block [captured self, @x] | provenance | | -| captured_variables.rb:169:18:169:19 | self [@x] | captured_variables.rb:169:18:169:19 | @x | provenance | | -| captured_variables.rb:174:1:174:24 | call to new [@x] | captured_variables.rb:167:5:171:7 | self in baz [@x] | provenance | | -| captured_variables.rb:177:5:179:7 | self in foo [Return] [@x] | captured_variables.rb:193:1:193:1 | [post] c [@x] | provenance | | -| captured_variables.rb:178:9:178:10 | [post] self [@x] | captured_variables.rb:177:5:179:7 | self in foo [Return] [@x] | provenance | | +| captured_variables.rb:163:5:165:7 | &block : [lambda] [captured self, @x] | captured_variables.rb:169:18:169:19 | self : CaptureInstanceSelf1 [@x] | provenance | | +| captured_variables.rb:167:5:171:7 | self in baz : CaptureInstanceSelf1 [@x] | captured_variables.rb:168:18:170:11 | do ... end : [lambda] [captured self, @x] | provenance | | +| captured_variables.rb:168:18:170:11 | do ... end : [lambda] [captured self, @x] | captured_variables.rb:163:5:165:7 | &block : [lambda] [captured self, @x] | provenance | | +| captured_variables.rb:169:18:169:19 | self : CaptureInstanceSelf1 [@x] | captured_variables.rb:169:18:169:19 | @x | provenance | | +| captured_variables.rb:174:1:174:24 | call to new : CaptureInstanceSelf1 [@x] | captured_variables.rb:167:5:171:7 | self in baz : CaptureInstanceSelf1 [@x] | provenance | | +| captured_variables.rb:177:5:179:7 | self in foo [Return] : CaptureInstanceSelf2 [@x] | captured_variables.rb:193:1:193:1 | [post] c : CaptureInstanceSelf2 [@x] | provenance | | +| captured_variables.rb:178:9:178:10 | [post] self [@x] | captured_variables.rb:177:5:179:7 | self in foo [Return] : CaptureInstanceSelf2 [@x] | provenance | | | captured_variables.rb:178:14:178:22 | call to taint | captured_variables.rb:178:9:178:10 | [post] self [@x] | provenance | | -| captured_variables.rb:181:5:183:7 | &block [captured self, @x] | captured_variables.rb:187:18:187:19 | self [@x] | provenance | | -| captured_variables.rb:185:5:189:7 | self in baz [@x] | captured_variables.rb:186:18:188:11 | do ... end [captured self, @x] | provenance | | -| captured_variables.rb:186:18:188:11 | do ... end [captured self, @x] | captured_variables.rb:181:5:183:7 | &block [captured self, @x] | provenance | | -| captured_variables.rb:187:18:187:19 | self [@x] | captured_variables.rb:187:18:187:19 | @x | provenance | | -| captured_variables.rb:193:1:193:1 | [post] c [@x] | captured_variables.rb:194:1:194:1 | c [@x] | provenance | | -| captured_variables.rb:194:1:194:1 | c [@x] | captured_variables.rb:185:5:189:7 | self in baz [@x] | provenance | | +| captured_variables.rb:181:5:183:7 | &block : [lambda] [captured self, @x] | captured_variables.rb:187:18:187:19 | self : CaptureInstanceSelf2 [@x] | provenance | | +| captured_variables.rb:185:5:189:7 | self in baz : CaptureInstanceSelf2 [@x] | captured_variables.rb:186:18:188:11 | do ... end : [lambda] [captured self, @x] | provenance | | +| captured_variables.rb:186:18:188:11 | do ... end : [lambda] [captured self, @x] | captured_variables.rb:181:5:183:7 | &block : [lambda] [captured self, @x] | provenance | | +| captured_variables.rb:187:18:187:19 | self : CaptureInstanceSelf2 [@x] | captured_variables.rb:187:18:187:19 | @x | provenance | | +| captured_variables.rb:193:1:193:1 | [post] c : CaptureInstanceSelf2 [@x] | captured_variables.rb:194:1:194:1 | c : CaptureInstanceSelf2 [@x] | provenance | | +| captured_variables.rb:194:1:194:1 | c : CaptureInstanceSelf2 [@x] | captured_variables.rb:185:5:189:7 | self in baz : CaptureInstanceSelf2 [@x] | provenance | | | captured_variables.rb:197:9:197:17 | call to taint | captured_variables.rb:199:10:199:10 | x | provenance | | | captured_variables.rb:206:13:206:21 | call to taint | captured_variables.rb:208:14:208:14 | x | provenance | | -| captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:226:5:226:7 | fn1 [captured x] | provenance | | -| captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | captured_variables.rb:227:10:227:10 | y | provenance | | -| captured_variables.rb:226:5:226:7 | fn1 [captured x] | captured_variables.rb:223:13:223:13 | x | provenance | | -| captured_variables.rb:226:5:226:7 | fn1 [captured x] | captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | provenance | | +| captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:226:5:226:7 | fn1 : [lambda] [captured x] | provenance | | +| captured_variables.rb:226:5:226:7 | [post] fn1 : [lambda] [captured y] | captured_variables.rb:227:10:227:10 | y | provenance | | +| captured_variables.rb:226:5:226:7 | fn1 : [lambda] [captured x] | captured_variables.rb:223:13:223:13 | x | provenance | | +| captured_variables.rb:226:5:226:7 | fn1 : [lambda] [captured x] | captured_variables.rb:226:5:226:7 | [post] fn1 : [lambda] [captured y] | provenance | | | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:18:11:18 | x | provenance | | -| instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | provenance | | +| instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | provenance | | | instance_variables.rb:11:18:11:18 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | provenance | | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:16:14:21 | self [@field] | provenance | | +| instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:16:14:21 | self : Foo [@field] | provenance | | +| instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:16:14:21 | self : Foo [@field] | provenance | | | instance_variables.rb:14:16:14:21 | @field | instance_variables.rb:14:9:14:21 | return | provenance | | -| instance_variables.rb:14:16:14:21 | self [@field] | instance_variables.rb:14:16:14:21 | @field | provenance | | -| instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | provenance | | +| instance_variables.rb:14:16:14:21 | @field | instance_variables.rb:14:9:14:21 | return | provenance | | +| instance_variables.rb:14:16:14:21 | self : Foo [@field] | instance_variables.rb:14:16:14:21 | @field | provenance | | +| instance_variables.rb:14:16:14:21 | self : Foo [@field] | instance_variables.rb:14:16:14:21 | @field | provenance | | +| instance_variables.rb:16:5:18:7 | self in inc_field : Foo [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | provenance | | | instance_variables.rb:17:9:17:14 | [post] self [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | provenance | | | instance_variables.rb:19:5:19:8 | [post] self [@foo] | instance_variables.rb:20:10:20:13 | self [@foo] | provenance | | | instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:19:5:19:8 | [post] self [@foo] | provenance | | | instance_variables.rb:20:10:20:13 | self [@foo] | instance_variables.rb:20:10:20:13 | @foo | provenance | | | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:18:23:22 | field | provenance | | -| instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:22:5:25:7 | self in initialize [Return] [@field] | provenance | | +| instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:22:5:25:7 | self in initialize [Return] : Foo [@field] | provenance | | | instance_variables.rb:23:18:23:22 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | provenance | | | instance_variables.rb:24:9:24:17 | call to taint | instance_variables.rb:28:9:28:25 | call to initialize | provenance | | | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:20:28:24 | field | provenance | | -| instance_variables.rb:28:9:28:25 | [post] self [@field] | instance_variables.rb:27:5:29:7 | self in call_initialize [Return] [@field] | provenance | | +| instance_variables.rb:28:9:28:25 | [post] self : Foo [@field] | instance_variables.rb:27:5:29:7 | self in call_initialize [Return] : Foo [@field] | provenance | | | instance_variables.rb:28:9:28:25 | call to initialize | instance_variables.rb:119:6:119:37 | call to call_initialize | provenance | | | instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | provenance | | -| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | provenance | | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:28:9:28:25 | [post] self : Foo [@field] | provenance | | | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:13:33:13 | x | provenance | | | instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:48:20:48:20 | x | provenance | | | instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | provenance | | -| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | provenance | | -| instance_variables.rb:36:10:36:23 | call to new [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:36:10:36:33 | call to get_field | provenance | | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:33:9:33:14 | call to new : Foo [@field] | provenance | | +| instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | instance_variables.rb:36:10:36:33 | call to get_field | provenance | | | instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | provenance | | -| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:23 | call to new [@field] | provenance | | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:39:6:39:33 | call to get_field | provenance | | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | provenance | | +| instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | instance_variables.rb:39:6:39:33 | call to get_field | provenance | | | instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | provenance | | -| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:23 | call to bar [@field] | provenance | | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | provenance | | | instance_variables.rb:43:9:43:17 | call to taint | instance_variables.rb:121:7:121:24 | call to new | provenance | | | instance_variables.rb:48:20:48:20 | x | instance_variables.rb:49:14:49:14 | x | provenance | | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] | instance_variables.rb:55:6:55:8 | foo [@field] | provenance | | +| instance_variables.rb:54:1:54:3 | [post] foo : Foo [@field] | instance_variables.rb:55:6:55:8 | foo : Foo [@field] | provenance | | | instance_variables.rb:54:15:54:23 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:54:1:54:3 | [post] foo [@field] | provenance | | -| instance_variables.rb:55:6:55:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:55:6:55:18 | call to get_field | provenance | | -| instance_variables.rb:58:1:58:3 | [post] bar [@field] | instance_variables.rb:59:6:59:8 | bar [@field] | provenance | | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:54:1:54:3 | [post] foo : Foo [@field] | provenance | | +| instance_variables.rb:55:6:55:8 | foo : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:55:6:55:8 | foo : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:55:6:55:8 | foo : Foo [@field] | instance_variables.rb:55:6:55:18 | call to get_field | provenance | | +| instance_variables.rb:58:1:58:3 | [post] bar : Foo [@field] | instance_variables.rb:59:6:59:8 | bar : Foo [@field] | provenance | | | instance_variables.rb:58:15:58:22 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:58:1:58:3 | [post] bar [@field] | provenance | | -| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | provenance | | -| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | provenance | | +| instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:58:1:58:3 | [post] bar : Foo [@field] | provenance | | +| instance_variables.rb:59:6:59:8 | bar : Foo [@field] | instance_variables.rb:16:5:18:7 | self in inc_field : Foo [@field] | provenance | | +| instance_variables.rb:59:6:59:8 | bar : Foo [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | provenance | | | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | instance_variables.rb:63:6:63:9 | foo1 [@field] | provenance | | | instance_variables.rb:62:14:62:22 | call to taint | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | provenance | | | instance_variables.rb:63:6:63:9 | foo1 [@field] | instance_variables.rb:63:6:63:15 | call to field | provenance | | | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | instance_variables.rb:67:6:67:9 | foo2 [@field] | provenance | | | instance_variables.rb:66:14:66:22 | call to taint | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | provenance | | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | | instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:67:6:67:19 | call to get_field | provenance | | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:71:6:71:9 | foo3 [@field] | provenance | | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:83:6:83:9 | foo3 [@field] | provenance | | +| instance_variables.rb:70:1:70:4 | [post] foo3 : Foo [@field] | instance_variables.rb:71:6:71:9 | foo3 : Foo [@field] | provenance | | +| instance_variables.rb:70:1:70:4 | [post] foo3 : Foo [@field] | instance_variables.rb:83:6:83:9 | foo3 : Foo [@field] | provenance | | | instance_variables.rb:70:16:70:24 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | provenance | | -| instance_variables.rb:71:6:71:9 | foo3 [@field] | instance_variables.rb:71:6:71:15 | call to field | provenance | | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:79:6:79:9 | foo5 [@field] | provenance | | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:84:6:84:9 | foo5 [@field] | provenance | | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:70:1:70:4 | [post] foo3 : Foo [@field] | provenance | | +| instance_variables.rb:71:6:71:9 | foo3 : Foo [@field] | instance_variables.rb:71:6:71:15 | call to field | provenance | | +| instance_variables.rb:78:2:78:5 | [post] foo5 : Foo [@field] | instance_variables.rb:79:6:79:9 | foo5 : Foo [@field] | provenance | | +| instance_variables.rb:78:2:78:5 | [post] foo5 : Foo [@field] | instance_variables.rb:84:6:84:9 | foo5 : Foo [@field] | provenance | | | instance_variables.rb:78:18:78:26 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | provenance | | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:79:6:79:19 | call to get_field | provenance | | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | instance_variables.rb:85:6:85:9 | foo6 [@field] | provenance | | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:78:2:78:5 | [post] foo5 : Foo [@field] | provenance | | +| instance_variables.rb:79:6:79:9 | foo5 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:79:6:79:9 | foo5 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:79:6:79:9 | foo5 : Foo [@field] | instance_variables.rb:79:6:79:19 | call to get_field | provenance | | +| instance_variables.rb:82:15:82:18 | [post] foo6 : Foo [@field] | instance_variables.rb:85:6:85:9 | foo6 : Foo [@field] | provenance | | | instance_variables.rb:82:32:82:40 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | provenance | | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:83:6:83:19 | call to get_field | provenance | | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:84:6:84:19 | call to get_field | provenance | | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:85:6:85:19 | call to get_field | provenance | | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | instance_variables.rb:90:6:90:9 | foo7 [@field] | provenance | | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | instance_variables.rb:91:6:91:9 | foo8 [@field] | provenance | | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:82:15:82:18 | [post] foo6 : Foo [@field] | provenance | | +| instance_variables.rb:83:6:83:9 | foo3 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:83:6:83:9 | foo3 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:83:6:83:9 | foo3 : Foo [@field] | instance_variables.rb:83:6:83:19 | call to get_field | provenance | | +| instance_variables.rb:84:6:84:9 | foo5 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:84:6:84:9 | foo5 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:84:6:84:9 | foo5 : Foo [@field] | instance_variables.rb:84:6:84:19 | call to get_field | provenance | | +| instance_variables.rb:85:6:85:9 | foo6 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:85:6:85:9 | foo6 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:85:6:85:9 | foo6 : Foo [@field] | instance_variables.rb:85:6:85:19 | call to get_field | provenance | | +| instance_variables.rb:89:15:89:18 | [post] foo7 : Foo [@field] | instance_variables.rb:90:6:90:9 | foo7 : Foo [@field] | provenance | | +| instance_variables.rb:89:25:89:28 | [post] foo8 : Foo [@field] | instance_variables.rb:91:6:91:9 | foo8 : Foo [@field] | provenance | | | instance_variables.rb:89:45:89:53 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | provenance | | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | provenance | | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:90:6:90:19 | call to get_field | provenance | | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:91:6:91:19 | call to get_field | provenance | | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | instance_variables.rb:96:6:96:9 | foo9 [@field] | provenance | | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | instance_variables.rb:97:6:97:10 | foo10 [@field] | provenance | | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:15:89:18 | [post] foo7 : Foo [@field] | provenance | | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:25:89:28 | [post] foo8 : Foo [@field] | provenance | | +| instance_variables.rb:90:6:90:9 | foo7 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:90:6:90:9 | foo7 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:90:6:90:9 | foo7 : Foo [@field] | instance_variables.rb:90:6:90:19 | call to get_field | provenance | | +| instance_variables.rb:91:6:91:9 | foo8 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:91:6:91:9 | foo8 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:91:6:91:9 | foo8 : Foo [@field] | instance_variables.rb:91:6:91:19 | call to get_field | provenance | | +| instance_variables.rb:95:22:95:25 | [post] foo9 : Foo [@field] | instance_variables.rb:96:6:96:9 | foo9 : Foo [@field] | provenance | | +| instance_variables.rb:95:32:95:36 | [post] foo10 : Foo [@field] | instance_variables.rb:97:6:97:10 | foo10 : Foo [@field] | provenance | | | instance_variables.rb:95:53:95:61 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | provenance | | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | provenance | | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:96:6:96:19 | call to get_field | provenance | | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:97:6:97:20 | call to get_field | provenance | | -| instance_variables.rb:99:18:99:18 | x [Return] [@field] | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | provenance | | -| instance_variables.rb:99:18:99:18 | x [Return] [@field] | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | provenance | | -| instance_variables.rb:99:18:99:18 | x [Return] [@field] | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | provenance | | -| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:99:18:99:18 | x [Return] [@field] | provenance | | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:22:95:25 | [post] foo9 : Foo [@field] | provenance | | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:32:95:36 | [post] foo10 : Foo [@field] | provenance | | +| instance_variables.rb:96:6:96:9 | foo9 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:96:6:96:9 | foo9 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:96:6:96:9 | foo9 : Foo [@field] | instance_variables.rb:96:6:96:19 | call to get_field | provenance | | +| instance_variables.rb:97:6:97:10 | foo10 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:97:6:97:10 | foo10 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:97:6:97:10 | foo10 : Foo [@field] | instance_variables.rb:97:6:97:20 | call to get_field | provenance | | +| instance_variables.rb:99:18:99:18 | x [Return] : Foo [@field] | instance_variables.rb:104:14:104:18 | [post] foo11 : Foo [@field] | provenance | | +| instance_variables.rb:99:18:99:18 | x [Return] : Foo [@field] | instance_variables.rb:108:15:108:19 | [post] foo12 : Foo [@field] | provenance | | +| instance_variables.rb:99:18:99:18 | x [Return] : Foo [@field] | instance_variables.rb:113:22:113:26 | [post] foo13 : Foo [@field] | provenance | | +| instance_variables.rb:100:5:100:5 | [post] x : Foo [@field] | instance_variables.rb:99:18:99:18 | x [Return] : Foo [@field] | provenance | | | instance_variables.rb:100:17:100:25 | call to taint | captured_variables.rb:57:19:57:19 | x | provenance | | | instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | provenance | | -| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:100:5:100:5 | [post] x [@field] | provenance | | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | instance_variables.rb:105:6:105:10 | foo11 [@field] | provenance | | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:105:6:105:20 | call to get_field | provenance | | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | instance_variables.rb:109:6:109:10 | foo12 [@field] | provenance | | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:109:6:109:20 | call to get_field | provenance | | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | instance_variables.rb:114:6:114:10 | foo13 [@field] | provenance | | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:114:6:114:20 | call to get_field | provenance | | -| instance_variables.rb:116:1:116:5 | foo15 [@field] | instance_variables.rb:117:6:117:10 | foo15 [@field] | provenance | | -| instance_variables.rb:116:9:116:26 | call to new [@field] | instance_variables.rb:116:1:116:5 | foo15 [@field] | provenance | | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:100:5:100:5 | [post] x : Foo [@field] | provenance | | +| instance_variables.rb:104:14:104:18 | [post] foo11 : Foo [@field] | instance_variables.rb:105:6:105:10 | foo11 : Foo [@field] | provenance | | +| instance_variables.rb:105:6:105:10 | foo11 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:105:6:105:10 | foo11 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:105:6:105:10 | foo11 : Foo [@field] | instance_variables.rb:105:6:105:20 | call to get_field | provenance | | +| instance_variables.rb:108:15:108:19 | [post] foo12 : Foo [@field] | instance_variables.rb:109:6:109:10 | foo12 : Foo [@field] | provenance | | +| instance_variables.rb:109:6:109:10 | foo12 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:109:6:109:10 | foo12 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:109:6:109:10 | foo12 : Foo [@field] | instance_variables.rb:109:6:109:20 | call to get_field | provenance | | +| instance_variables.rb:113:22:113:26 | [post] foo13 : Foo [@field] | instance_variables.rb:114:6:114:10 | foo13 : Foo [@field] | provenance | | +| instance_variables.rb:114:6:114:10 | foo13 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:114:6:114:10 | foo13 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:114:6:114:10 | foo13 : Foo [@field] | instance_variables.rb:114:6:114:20 | call to get_field | provenance | | +| instance_variables.rb:116:1:116:5 | foo15 : Foo [@field] | instance_variables.rb:117:6:117:10 | foo15 : Foo [@field] | provenance | | +| instance_variables.rb:116:9:116:26 | call to new : Foo [@field] | instance_variables.rb:116:1:116:5 | foo15 : Foo [@field] | provenance | | | instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | provenance | | -| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:116:9:116:26 | call to new [@field] | provenance | | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:117:6:117:20 | call to get_field | provenance | | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | instance_variables.rb:120:6:120:10 | foo16 [@field] | provenance | | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:116:9:116:26 | call to new : Foo [@field] | provenance | | +| instance_variables.rb:117:6:117:10 | foo15 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:117:6:117:10 | foo15 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:117:6:117:10 | foo15 : Foo [@field] | instance_variables.rb:117:6:117:20 | call to get_field | provenance | | +| instance_variables.rb:119:6:119:10 | [post] foo16 : Foo [@field] | instance_variables.rb:120:6:120:10 | foo16 : Foo [@field] | provenance | | | instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | provenance | | -| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | provenance | | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | provenance | | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:120:6:120:20 | call to get_field | provenance | | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:119:6:119:10 | [post] foo16 : Foo [@field] | provenance | | +| instance_variables.rb:120:6:120:10 | foo16 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:120:6:120:10 | foo16 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | provenance | | +| instance_variables.rb:120:6:120:10 | foo16 : Foo [@field] | instance_variables.rb:120:6:120:20 | call to get_field | provenance | | | instance_variables.rb:121:1:121:3 | bar | instance_variables.rb:122:6:122:8 | bar | provenance | | | instance_variables.rb:121:7:121:24 | call to new | instance_variables.rb:121:1:121:3 | bar | provenance | | nodes @@ -265,68 +274,73 @@ nodes | blocks.rb:25:8:25:8 | x | semmle.label | x | | captured_variables.rb:9:24:9:24 | x | semmle.label | x | | captured_variables.rb:10:20:10:20 | x | semmle.label | x | -| captured_variables.rb:11:5:11:6 | fn [captured x] | semmle.label | fn [captured x] | +| captured_variables.rb:11:5:11:6 | fn : [lambda] [captured x] | semmle.label | fn : [lambda] [captured x] | | captured_variables.rb:13:20:13:29 | call to taint | semmle.label | call to taint | | captured_variables.rb:15:28:15:28 | x | semmle.label | x | -| captured_variables.rb:16:5:18:5 | -> { ... } [captured x] | semmle.label | -> { ... } [captured x] | +| captured_variables.rb:16:5:18:5 | -> { ... } : [lambda] [captured x] | semmle.label | -> { ... } : [lambda] [captured x] | | captured_variables.rb:17:14:17:14 | x | semmle.label | x | -| captured_variables.rb:20:1:20:35 | ( ... ) [captured x] | semmle.label | ( ... ) [captured x] | -| captured_variables.rb:20:2:20:34 | call to capture_escape_return1 [captured x] | semmle.label | call to capture_escape_return1 [captured x] | +| captured_variables.rb:20:1:20:35 | ( ... ) : [lambda] [captured x] | semmle.label | ( ... ) : [lambda] [captured x] | +| captured_variables.rb:20:2:20:34 | call to capture_escape_return1 : [lambda] [captured x] | semmle.label | call to capture_escape_return1 : [lambda] [captured x] | | captured_variables.rb:20:25:20:34 | call to taint | semmle.label | call to taint | | captured_variables.rb:22:28:22:28 | x | semmle.label | x | -| captured_variables.rb:23:5:25:5 | -> { ... } [captured x] | semmle.label | -> { ... } [captured x] | +| captured_variables.rb:23:5:25:5 | -> { ... } : [lambda] [captured x] | semmle.label | -> { ... } : [lambda] [captured x] | | captured_variables.rb:24:14:24:14 | x | semmle.label | x | -| captured_variables.rb:27:25:27:57 | call to capture_escape_return2 [captured x] | semmle.label | call to capture_escape_return2 [captured x] | +| captured_variables.rb:27:25:27:57 | call to capture_escape_return2 : [lambda] [captured x] | semmle.label | call to capture_escape_return2 : [lambda] [captured x] | | captured_variables.rb:27:48:27:57 | call to taint | semmle.label | call to taint | | captured_variables.rb:29:33:29:33 | x | semmle.label | x | | captured_variables.rb:31:14:31:14 | x | semmle.label | x | -| captured_variables.rb:33:29:33:30 | fn [captured x] | semmle.label | fn [captured x] | +| captured_variables.rb:33:29:33:30 | fn : [lambda] [captured x] | semmle.label | fn : [lambda] [captured x] | | captured_variables.rb:35:29:35:38 | call to taint | semmle.label | call to taint | -| captured_variables.rb:37:13:37:14 | fn [captured x] | semmle.label | fn [captured x] | -| captured_variables.rb:38:5:38:6 | fn [captured x] | semmle.label | fn [captured x] | +| captured_variables.rb:37:13:37:14 | fn : [lambda] [captured x] | semmle.label | fn : [lambda] [captured x] | +| captured_variables.rb:38:5:38:6 | fn : [lambda] [captured x] | semmle.label | fn : [lambda] [captured x] | | captured_variables.rb:40:31:40:31 | x | semmle.label | x | | captured_variables.rb:42:14:42:14 | x | semmle.label | x | -| captured_variables.rb:44:13:44:14 | fn [captured x] | semmle.label | fn [captured x] | +| captured_variables.rb:44:13:44:14 | fn : [lambda] [captured x] | semmle.label | fn : [lambda] [captured x] | | captured_variables.rb:46:27:46:36 | call to taint | semmle.label | call to taint | | captured_variables.rb:48:5:48:12 | call to taint | semmle.label | call to taint | -| captured_variables.rb:49:16:52:3 | [post] do ... end [captured x] | semmle.label | [post] do ... end [captured x] | -| captured_variables.rb:49:16:52:3 | do ... end [captured x] | semmle.label | do ... end [captured x] | +| captured_variables.rb:49:16:52:3 | [post] do ... end : [lambda] [captured x] | semmle.label | [post] do ... end : [lambda] [captured x] | +| captured_variables.rb:49:16:52:3 | do ... end : [lambda] [captured x] | semmle.label | do ... end : [lambda] [captured x] | | captured_variables.rb:50:10:50:10 | x | semmle.label | x | | captured_variables.rb:51:9:51:16 | call to taint | semmle.label | call to taint | | captured_variables.rb:54:6:54:6 | x | semmle.label | x | -| captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | semmle.label | self in set_field [Return] [@field] | +| captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | semmle.label | self in set_field [Return] : Foo [@field] | | captured_variables.rb:57:19:57:19 | x | semmle.label | x | | captured_variables.rb:58:9:58:14 | [post] self [@field] | semmle.label | [post] self [@field] | | captured_variables.rb:58:18:58:18 | x | semmle.label | x | -| captured_variables.rb:60:5:62:7 | self in get_field [@field] | semmle.label | self in get_field [@field] | +| captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | semmle.label | self in get_field : Foo [@field] | +| captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | semmle.label | self in get_field : Foo [@field] | +| captured_variables.rb:61:9:61:21 | return | semmle.label | return | | captured_variables.rb:61:9:61:21 | return | semmle.label | return | | captured_variables.rb:61:16:61:21 | @field | semmle.label | @field | -| captured_variables.rb:61:16:61:21 | self [@field] | semmle.label | self [@field] | -| captured_variables.rb:66:1:66:3 | [post] foo [@field] | semmle.label | [post] foo [@field] | +| captured_variables.rb:61:16:61:21 | @field | semmle.label | @field | +| captured_variables.rb:61:16:61:21 | self : Foo [@field] | semmle.label | self : Foo [@field] | +| captured_variables.rb:61:16:61:21 | self : Foo [@field] | semmle.label | self : Foo [@field] | +| captured_variables.rb:66:1:66:3 | [post] foo : Foo [@field] | semmle.label | [post] foo : Foo [@field] | | captured_variables.rb:66:15:66:22 | call to taint | semmle.label | call to taint | -| captured_variables.rb:67:16:70:3 | [post] do ... end [captured foo, @field] | semmle.label | [post] do ... end [captured foo, @field] | -| captured_variables.rb:67:16:70:3 | do ... end [captured foo, @field] | semmle.label | do ... end [captured foo, @field] | +| captured_variables.rb:67:16:70:3 | [post] do ... end : [lambda] [captured foo, @field] | semmle.label | [post] do ... end : [lambda] [captured foo, @field] | +| captured_variables.rb:67:16:70:3 | do ... end : [lambda] [captured foo, @field] | semmle.label | do ... end : [lambda] [captured foo, @field] | | captured_variables.rb:68:10:68:12 | foo [@field] | semmle.label | foo [@field] | | captured_variables.rb:68:10:68:22 | call to get_field | semmle.label | call to get_field | -| captured_variables.rb:69:5:69:7 | [post] foo [@field] | semmle.label | [post] foo [@field] | +| captured_variables.rb:69:5:69:7 | [post] foo : Foo [@field] | semmle.label | [post] foo : Foo [@field] | | captured_variables.rb:69:19:69:26 | call to taint | semmle.label | call to taint | +| captured_variables.rb:72:6:72:8 | foo : Foo [@field] | semmle.label | foo : Foo [@field] | | captured_variables.rb:72:6:72:8 | foo [@field] | semmle.label | foo [@field] | | captured_variables.rb:72:6:72:18 | call to get_field | semmle.label | call to get_field | -| captured_variables.rb:78:20:80:7 | [post] do ... end [captured foo, @field] | semmle.label | [post] do ... end [captured foo, @field] | -| captured_variables.rb:79:9:79:11 | [post] foo [@field] | semmle.label | [post] foo [@field] | +| captured_variables.rb:78:20:80:7 | [post] do ... end : [lambda] [captured foo, @field] | semmle.label | [post] do ... end : [lambda] [captured foo, @field] | +| captured_variables.rb:79:9:79:11 | [post] foo : Foo [@field] | semmle.label | [post] foo : Foo [@field] | | captured_variables.rb:79:23:79:30 | call to taint | semmle.label | call to taint | | captured_variables.rb:83:6:83:8 | foo [@field] | semmle.label | foo [@field] | | captured_variables.rb:83:6:83:18 | call to get_field | semmle.label | call to get_field | | captured_variables.rb:85:5:85:12 | call to taint | semmle.label | call to taint | | captured_variables.rb:87:10:87:10 | y | semmle.label | y | | captured_variables.rb:88:9:88:16 | call to taint | semmle.label | call to taint | -| captured_variables.rb:90:1:90:2 | [post] fn [captured y] | semmle.label | [post] fn [captured y] | -| captured_variables.rb:90:1:90:2 | fn [captured y] | semmle.label | fn [captured y] | +| captured_variables.rb:90:1:90:2 | [post] fn : [lambda] [captured y] | semmle.label | [post] fn : [lambda] [captured y] | +| captured_variables.rb:90:1:90:2 | fn : [lambda] [captured y] | semmle.label | fn : [lambda] [captured y] | | captured_variables.rb:91:6:91:6 | y | semmle.label | y | | captured_variables.rb:93:17:93:17 | x | semmle.label | x | -| captured_variables.rb:94:5:96:5 | -> { ... } [captured x] | semmle.label | -> { ... } [captured x] | +| captured_variables.rb:94:5:96:5 | -> { ... } : [lambda] [captured x] | semmle.label | -> { ... } : [lambda] [captured x] | | captured_variables.rb:95:14:95:14 | x | semmle.label | x | -| captured_variables.rb:98:1:98:21 | call to capture_arg [captured x] | semmle.label | call to capture_arg [captured x] | +| captured_variables.rb:98:1:98:21 | call to capture_arg : [lambda] [captured x] | semmle.label | call to capture_arg : [lambda] [captured x] | | captured_variables.rb:98:13:98:20 | call to taint | semmle.label | call to taint | | captured_variables.rb:100:21:100:21 | x | semmle.label | x | | captured_variables.rb:101:11:101:11 | x | semmle.label | x | @@ -336,88 +350,92 @@ nodes | captured_variables.rb:109:9:109:17 | call to taint | semmle.label | call to taint | | captured_variables.rb:112:18:112:18 | x | semmle.label | x | | captured_variables.rb:113:17:113:25 | call to taint | semmle.label | call to taint | -| captured_variables.rb:115:9:115:13 | [post] inner [captured x] | semmle.label | [post] inner [captured x] | -| captured_variables.rb:115:9:115:13 | inner [captured x] | semmle.label | inner [captured x] | -| captured_variables.rb:117:5:117:10 | [post] middle [captured x] | semmle.label | [post] middle [captured x] | -| captured_variables.rb:117:5:117:10 | middle [captured x] | semmle.label | middle [captured x] | +| captured_variables.rb:115:9:115:13 | [post] inner : [lambda] [captured x] | semmle.label | [post] inner : [lambda] [captured x] | +| captured_variables.rb:115:9:115:13 | inner : [lambda] [captured x] | semmle.label | inner : [lambda] [captured x] | +| captured_variables.rb:117:5:117:10 | [post] middle : [lambda] [captured x] | semmle.label | [post] middle : [lambda] [captured x] | +| captured_variables.rb:117:5:117:10 | middle : [lambda] [captured x] | semmle.label | middle : [lambda] [captured x] | | captured_variables.rb:118:10:118:10 | x | semmle.label | x | | captured_variables.rb:147:5:147:6 | [post] self [@x] | semmle.label | [post] self [@x] | | captured_variables.rb:147:10:147:18 | call to taint | semmle.label | call to taint | -| captured_variables.rb:149:5:151:7 | &block [captured self, @x] | semmle.label | &block [captured self, @x] | -| captured_variables.rb:153:14:155:7 | do ... end [captured self, @x] | semmle.label | do ... end [captured self, @x] | +| captured_variables.rb:149:5:151:7 | &block : [lambda] [captured self, @x] | semmle.label | &block : [lambda] [captured self, @x] | +| captured_variables.rb:153:14:155:7 | do ... end : [lambda] [captured self, @x] | semmle.label | do ... end : [lambda] [captured self, @x] | | captured_variables.rb:154:14:154:15 | @x | semmle.label | @x | | captured_variables.rb:154:14:154:15 | self [@x] | semmle.label | self [@x] | | captured_variables.rb:160:9:160:10 | [post] self [@x] | semmle.label | [post] self [@x] | | captured_variables.rb:160:14:160:22 | call to taint | semmle.label | call to taint | -| captured_variables.rb:163:5:165:7 | &block [captured self, @x] | semmle.label | &block [captured self, @x] | -| captured_variables.rb:167:5:171:7 | self in baz [@x] | semmle.label | self in baz [@x] | -| captured_variables.rb:168:18:170:11 | do ... end [captured self, @x] | semmle.label | do ... end [captured self, @x] | +| captured_variables.rb:163:5:165:7 | &block : [lambda] [captured self, @x] | semmle.label | &block : [lambda] [captured self, @x] | +| captured_variables.rb:167:5:171:7 | self in baz : CaptureInstanceSelf1 [@x] | semmle.label | self in baz : CaptureInstanceSelf1 [@x] | +| captured_variables.rb:168:18:170:11 | do ... end : [lambda] [captured self, @x] | semmle.label | do ... end : [lambda] [captured self, @x] | | captured_variables.rb:169:18:169:19 | @x | semmle.label | @x | -| captured_variables.rb:169:18:169:19 | self [@x] | semmle.label | self [@x] | -| captured_variables.rb:174:1:174:24 | call to new [@x] | semmle.label | call to new [@x] | -| captured_variables.rb:177:5:179:7 | self in foo [Return] [@x] | semmle.label | self in foo [Return] [@x] | +| captured_variables.rb:169:18:169:19 | self : CaptureInstanceSelf1 [@x] | semmle.label | self : CaptureInstanceSelf1 [@x] | +| captured_variables.rb:174:1:174:24 | call to new : CaptureInstanceSelf1 [@x] | semmle.label | call to new : CaptureInstanceSelf1 [@x] | +| captured_variables.rb:177:5:179:7 | self in foo [Return] : CaptureInstanceSelf2 [@x] | semmle.label | self in foo [Return] : CaptureInstanceSelf2 [@x] | | captured_variables.rb:178:9:178:10 | [post] self [@x] | semmle.label | [post] self [@x] | | captured_variables.rb:178:14:178:22 | call to taint | semmle.label | call to taint | -| captured_variables.rb:181:5:183:7 | &block [captured self, @x] | semmle.label | &block [captured self, @x] | -| captured_variables.rb:185:5:189:7 | self in baz [@x] | semmle.label | self in baz [@x] | -| captured_variables.rb:186:18:188:11 | do ... end [captured self, @x] | semmle.label | do ... end [captured self, @x] | +| captured_variables.rb:181:5:183:7 | &block : [lambda] [captured self, @x] | semmle.label | &block : [lambda] [captured self, @x] | +| captured_variables.rb:185:5:189:7 | self in baz : CaptureInstanceSelf2 [@x] | semmle.label | self in baz : CaptureInstanceSelf2 [@x] | +| captured_variables.rb:186:18:188:11 | do ... end : [lambda] [captured self, @x] | semmle.label | do ... end : [lambda] [captured self, @x] | | captured_variables.rb:187:18:187:19 | @x | semmle.label | @x | -| captured_variables.rb:187:18:187:19 | self [@x] | semmle.label | self [@x] | -| captured_variables.rb:193:1:193:1 | [post] c [@x] | semmle.label | [post] c [@x] | -| captured_variables.rb:194:1:194:1 | c [@x] | semmle.label | c [@x] | +| captured_variables.rb:187:18:187:19 | self : CaptureInstanceSelf2 [@x] | semmle.label | self : CaptureInstanceSelf2 [@x] | +| captured_variables.rb:193:1:193:1 | [post] c : CaptureInstanceSelf2 [@x] | semmle.label | [post] c : CaptureInstanceSelf2 [@x] | +| captured_variables.rb:194:1:194:1 | c : CaptureInstanceSelf2 [@x] | semmle.label | c : CaptureInstanceSelf2 [@x] | | captured_variables.rb:197:9:197:17 | call to taint | semmle.label | call to taint | | captured_variables.rb:199:10:199:10 | x | semmle.label | x | | captured_variables.rb:206:13:206:21 | call to taint | semmle.label | call to taint | | captured_variables.rb:208:14:208:14 | x | semmle.label | x | | captured_variables.rb:219:9:219:17 | call to taint | semmle.label | call to taint | | captured_variables.rb:223:13:223:13 | x | semmle.label | x | -| captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | semmle.label | [post] fn1 [captured y] | -| captured_variables.rb:226:5:226:7 | fn1 [captured x] | semmle.label | fn1 [captured x] | +| captured_variables.rb:226:5:226:7 | [post] fn1 : [lambda] [captured y] | semmle.label | [post] fn1 : [lambda] [captured y] | +| captured_variables.rb:226:5:226:7 | fn1 : [lambda] [captured x] | semmle.label | fn1 : [lambda] [captured x] | | captured_variables.rb:227:10:227:10 | y | semmle.label | y | -| instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | semmle.label | self in set_field [Return] [@field] | +| instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | semmle.label | self in set_field [Return] : Foo [@field] | | instance_variables.rb:10:19:10:19 | x | semmle.label | x | | instance_variables.rb:11:9:11:14 | [post] self [@field] | semmle.label | [post] self [@field] | | instance_variables.rb:11:18:11:18 | x | semmle.label | x | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] | semmle.label | self in get_field [@field] | +| instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | semmle.label | self in get_field : Foo [@field] | +| instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | semmle.label | self in get_field : Foo [@field] | +| instance_variables.rb:14:9:14:21 | return | semmle.label | return | | instance_variables.rb:14:9:14:21 | return | semmle.label | return | | instance_variables.rb:14:16:14:21 | @field | semmle.label | @field | -| instance_variables.rb:14:16:14:21 | self [@field] | semmle.label | self [@field] | -| instance_variables.rb:16:5:18:7 | self in inc_field [@field] | semmle.label | self in inc_field [@field] | +| instance_variables.rb:14:16:14:21 | @field | semmle.label | @field | +| instance_variables.rb:14:16:14:21 | self : Foo [@field] | semmle.label | self : Foo [@field] | +| instance_variables.rb:14:16:14:21 | self : Foo [@field] | semmle.label | self : Foo [@field] | +| instance_variables.rb:16:5:18:7 | self in inc_field : Foo [@field] | semmle.label | self in inc_field : Foo [@field] | | instance_variables.rb:17:9:17:14 | [post] self [@field] | semmle.label | [post] self [@field] | | instance_variables.rb:19:5:19:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | instance_variables.rb:19:12:19:21 | call to taint | semmle.label | call to taint | | instance_variables.rb:20:10:20:13 | @foo | semmle.label | @foo | | instance_variables.rb:20:10:20:13 | self [@foo] | semmle.label | self [@foo] | -| instance_variables.rb:22:5:25:7 | self in initialize [Return] [@field] | semmle.label | self in initialize [Return] [@field] | +| instance_variables.rb:22:5:25:7 | self in initialize [Return] : Foo [@field] | semmle.label | self in initialize [Return] : Foo [@field] | | instance_variables.rb:22:20:22:24 | field | semmle.label | field | | instance_variables.rb:23:9:23:14 | [post] self [@field] | semmle.label | [post] self [@field] | | instance_variables.rb:23:18:23:22 | field | semmle.label | field | | instance_variables.rb:24:9:24:17 | call to taint | semmle.label | call to taint | -| instance_variables.rb:27:5:29:7 | self in call_initialize [Return] [@field] | semmle.label | self in call_initialize [Return] [@field] | +| instance_variables.rb:27:5:29:7 | self in call_initialize [Return] : Foo [@field] | semmle.label | self in call_initialize [Return] : Foo [@field] | | instance_variables.rb:27:25:27:29 | field | semmle.label | field | -| instance_variables.rb:28:9:28:25 | [post] self [@field] | semmle.label | [post] self [@field] | +| instance_variables.rb:28:9:28:25 | [post] self : Foo [@field] | semmle.label | [post] self : Foo [@field] | | instance_variables.rb:28:9:28:25 | call to initialize | semmle.label | call to initialize | | instance_variables.rb:28:20:28:24 | field | semmle.label | field | | instance_variables.rb:31:18:31:18 | x | semmle.label | x | | instance_variables.rb:32:13:32:21 | call to taint | semmle.label | call to taint | -| instance_variables.rb:33:9:33:14 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:33:9:33:14 | call to new : Foo [@field] | semmle.label | call to new : Foo [@field] | | instance_variables.rb:33:13:33:13 | x | semmle.label | x | -| instance_variables.rb:36:10:36:23 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | semmle.label | call to new : Foo [@field] | | instance_variables.rb:36:10:36:33 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:36:14:36:22 | call to taint | semmle.label | call to taint | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | semmle.label | call to bar [@field] | +| instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | semmle.label | call to bar : Foo [@field] | | instance_variables.rb:39:6:39:33 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:39:14:39:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:43:9:43:17 | call to taint | semmle.label | call to taint | | instance_variables.rb:48:20:48:20 | x | semmle.label | x | | instance_variables.rb:49:14:49:14 | x | semmle.label | x | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] | semmle.label | [post] foo [@field] | +| instance_variables.rb:54:1:54:3 | [post] foo : Foo [@field] | semmle.label | [post] foo : Foo [@field] | | instance_variables.rb:54:15:54:23 | call to taint | semmle.label | call to taint | -| instance_variables.rb:55:6:55:8 | foo [@field] | semmle.label | foo [@field] | +| instance_variables.rb:55:6:55:8 | foo : Foo [@field] | semmle.label | foo : Foo [@field] | | instance_variables.rb:55:6:55:18 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:58:1:58:3 | [post] bar [@field] | semmle.label | [post] bar [@field] | +| instance_variables.rb:58:1:58:3 | [post] bar : Foo [@field] | semmle.label | [post] bar : Foo [@field] | | instance_variables.rb:58:15:58:22 | call to taint | semmle.label | call to taint | -| instance_variables.rb:59:6:59:8 | bar [@field] | semmle.label | bar [@field] | +| instance_variables.rb:59:6:59:8 | bar : Foo [@field] | semmle.label | bar : Foo [@field] | | instance_variables.rb:59:6:59:18 | call to inc_field | semmle.label | call to inc_field | | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | semmle.label | [post] foo1 [@field] | | instance_variables.rb:62:14:62:22 | call to taint | semmle.label | call to taint | @@ -427,140 +445,142 @@ nodes | instance_variables.rb:66:14:66:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:67:6:67:9 | foo2 [@field] | semmle.label | foo2 [@field] | | instance_variables.rb:67:6:67:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | semmle.label | [post] foo3 [@field] | +| instance_variables.rb:70:1:70:4 | [post] foo3 : Foo [@field] | semmle.label | [post] foo3 : Foo [@field] | | instance_variables.rb:70:16:70:24 | call to taint | semmle.label | call to taint | -| instance_variables.rb:71:6:71:9 | foo3 [@field] | semmle.label | foo3 [@field] | +| instance_variables.rb:71:6:71:9 | foo3 : Foo [@field] | semmle.label | foo3 : Foo [@field] | | instance_variables.rb:71:6:71:15 | call to field | semmle.label | call to field | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | semmle.label | [post] foo5 [@field] | +| instance_variables.rb:78:2:78:5 | [post] foo5 : Foo [@field] | semmle.label | [post] foo5 : Foo [@field] | | instance_variables.rb:78:18:78:26 | call to taint | semmle.label | call to taint | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | semmle.label | foo5 [@field] | +| instance_variables.rb:79:6:79:9 | foo5 : Foo [@field] | semmle.label | foo5 : Foo [@field] | | instance_variables.rb:79:6:79:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | semmle.label | [post] foo6 [@field] | +| instance_variables.rb:82:15:82:18 | [post] foo6 : Foo [@field] | semmle.label | [post] foo6 : Foo [@field] | | instance_variables.rb:82:32:82:40 | call to taint | semmle.label | call to taint | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | semmle.label | foo3 [@field] | +| instance_variables.rb:83:6:83:9 | foo3 : Foo [@field] | semmle.label | foo3 : Foo [@field] | | instance_variables.rb:83:6:83:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | semmle.label | foo5 [@field] | +| instance_variables.rb:84:6:84:9 | foo5 : Foo [@field] | semmle.label | foo5 : Foo [@field] | | instance_variables.rb:84:6:84:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | semmle.label | foo6 [@field] | +| instance_variables.rb:85:6:85:9 | foo6 : Foo [@field] | semmle.label | foo6 : Foo [@field] | | instance_variables.rb:85:6:85:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | semmle.label | [post] foo7 [@field] | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | semmle.label | [post] foo8 [@field] | +| instance_variables.rb:89:15:89:18 | [post] foo7 : Foo [@field] | semmle.label | [post] foo7 : Foo [@field] | +| instance_variables.rb:89:25:89:28 | [post] foo8 : Foo [@field] | semmle.label | [post] foo8 : Foo [@field] | | instance_variables.rb:89:45:89:53 | call to taint | semmle.label | call to taint | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | semmle.label | foo7 [@field] | +| instance_variables.rb:90:6:90:9 | foo7 : Foo [@field] | semmle.label | foo7 : Foo [@field] | | instance_variables.rb:90:6:90:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | semmle.label | foo8 [@field] | +| instance_variables.rb:91:6:91:9 | foo8 : Foo [@field] | semmle.label | foo8 : Foo [@field] | | instance_variables.rb:91:6:91:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | semmle.label | [post] foo9 [@field] | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | semmle.label | [post] foo10 [@field] | +| instance_variables.rb:95:22:95:25 | [post] foo9 : Foo [@field] | semmle.label | [post] foo9 : Foo [@field] | +| instance_variables.rb:95:32:95:36 | [post] foo10 : Foo [@field] | semmle.label | [post] foo10 : Foo [@field] | | instance_variables.rb:95:53:95:61 | call to taint | semmle.label | call to taint | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | semmle.label | foo9 [@field] | +| instance_variables.rb:96:6:96:9 | foo9 : Foo [@field] | semmle.label | foo9 : Foo [@field] | | instance_variables.rb:96:6:96:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | semmle.label | foo10 [@field] | +| instance_variables.rb:97:6:97:10 | foo10 : Foo [@field] | semmle.label | foo10 : Foo [@field] | | instance_variables.rb:97:6:97:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:99:18:99:18 | x [Return] [@field] | semmle.label | x [Return] [@field] | -| instance_variables.rb:100:5:100:5 | [post] x [@field] | semmle.label | [post] x [@field] | +| instance_variables.rb:99:18:99:18 | x [Return] : Foo [@field] | semmle.label | x [Return] : Foo [@field] | +| instance_variables.rb:100:5:100:5 | [post] x : Foo [@field] | semmle.label | [post] x : Foo [@field] | | instance_variables.rb:100:17:100:25 | call to taint | semmle.label | call to taint | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | semmle.label | [post] foo11 [@field] | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | semmle.label | foo11 [@field] | +| instance_variables.rb:104:14:104:18 | [post] foo11 : Foo [@field] | semmle.label | [post] foo11 : Foo [@field] | +| instance_variables.rb:105:6:105:10 | foo11 : Foo [@field] | semmle.label | foo11 : Foo [@field] | | instance_variables.rb:105:6:105:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | semmle.label | [post] foo12 [@field] | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | semmle.label | foo12 [@field] | +| instance_variables.rb:108:15:108:19 | [post] foo12 : Foo [@field] | semmle.label | [post] foo12 : Foo [@field] | +| instance_variables.rb:109:6:109:10 | foo12 : Foo [@field] | semmle.label | foo12 : Foo [@field] | | instance_variables.rb:109:6:109:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | semmle.label | [post] foo13 [@field] | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | semmle.label | foo13 [@field] | +| instance_variables.rb:113:22:113:26 | [post] foo13 : Foo [@field] | semmle.label | [post] foo13 : Foo [@field] | +| instance_variables.rb:114:6:114:10 | foo13 : Foo [@field] | semmle.label | foo13 : Foo [@field] | | instance_variables.rb:114:6:114:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:116:1:116:5 | foo15 [@field] | semmle.label | foo15 [@field] | -| instance_variables.rb:116:9:116:26 | call to new [@field] | semmle.label | call to new [@field] | +| instance_variables.rb:116:1:116:5 | foo15 : Foo [@field] | semmle.label | foo15 : Foo [@field] | +| instance_variables.rb:116:9:116:26 | call to new : Foo [@field] | semmle.label | call to new : Foo [@field] | | instance_variables.rb:116:17:116:25 | call to taint | semmle.label | call to taint | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | semmle.label | foo15 [@field] | +| instance_variables.rb:117:6:117:10 | foo15 : Foo [@field] | semmle.label | foo15 : Foo [@field] | | instance_variables.rb:117:6:117:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | semmle.label | [post] foo16 [@field] | +| instance_variables.rb:119:6:119:10 | [post] foo16 : Foo [@field] | semmle.label | [post] foo16 : Foo [@field] | | instance_variables.rb:119:6:119:37 | call to call_initialize | semmle.label | call to call_initialize | | instance_variables.rb:119:28:119:36 | call to taint | semmle.label | call to taint | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | semmle.label | foo16 [@field] | +| instance_variables.rb:120:6:120:10 | foo16 : Foo [@field] | semmle.label | foo16 : Foo [@field] | | instance_variables.rb:120:6:120:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:121:1:121:3 | bar | semmle.label | bar | | instance_variables.rb:121:7:121:24 | call to new | semmle.label | call to new | | instance_variables.rb:122:6:122:8 | bar | semmle.label | bar | subpaths -| captured_variables.rb:20:25:20:34 | call to taint | captured_variables.rb:15:28:15:28 | x | captured_variables.rb:16:5:18:5 | -> { ... } [captured x] | captured_variables.rb:20:2:20:34 | call to capture_escape_return1 [captured x] | -| captured_variables.rb:27:48:27:57 | call to taint | captured_variables.rb:22:28:22:28 | x | captured_variables.rb:23:5:25:5 | -> { ... } [captured x] | captured_variables.rb:27:25:27:57 | call to capture_escape_return2 [captured x] | -| captured_variables.rb:66:15:66:22 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | captured_variables.rb:66:1:66:3 | [post] foo [@field] | -| captured_variables.rb:66:15:66:22 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | captured_variables.rb:66:1:66:3 | [post] foo [@field] | -| captured_variables.rb:68:10:68:12 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | captured_variables.rb:68:10:68:22 | call to get_field | -| captured_variables.rb:68:10:68:12 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | captured_variables.rb:68:10:68:22 | call to get_field | -| captured_variables.rb:69:19:69:26 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | captured_variables.rb:69:5:69:7 | [post] foo [@field] | -| captured_variables.rb:69:19:69:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | captured_variables.rb:69:5:69:7 | [post] foo [@field] | -| captured_variables.rb:72:6:72:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | captured_variables.rb:72:6:72:18 | call to get_field | -| captured_variables.rb:72:6:72:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | captured_variables.rb:72:6:72:18 | call to get_field | -| captured_variables.rb:79:23:79:30 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | captured_variables.rb:79:9:79:11 | [post] foo [@field] | -| captured_variables.rb:79:23:79:30 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | captured_variables.rb:79:9:79:11 | [post] foo [@field] | -| captured_variables.rb:83:6:83:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | captured_variables.rb:83:6:83:18 | call to get_field | -| captured_variables.rb:83:6:83:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | captured_variables.rb:83:6:83:18 | call to get_field | -| captured_variables.rb:98:13:98:20 | call to taint | captured_variables.rb:93:17:93:17 | x | captured_variables.rb:94:5:96:5 | -> { ... } [captured x] | captured_variables.rb:98:1:98:21 | call to capture_arg [captured x] | -| captured_variables.rb:226:5:226:7 | fn1 [captured x] | captured_variables.rb:223:13:223:13 | x | captured_variables.rb:223:13:223:13 | x | captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | -| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:22:5:25:7 | self in initialize [Return] [@field] | instance_variables.rb:28:9:28:25 | [post] self [@field] | -| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:33:9:33:14 | call to new [@field] | -| instance_variables.rb:36:10:36:23 | call to new [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | -| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | -| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:36:10:36:23 | call to new [@field] | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | -| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | instance_variables.rb:39:6:39:23 | call to bar [@field] | -| instance_variables.rb:54:15:54:23 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:54:1:54:3 | [post] foo [@field] | -| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:54:1:54:3 | [post] foo [@field] | -| instance_variables.rb:55:6:55:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:58:15:58:22 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:58:1:58:3 | [post] bar [@field] | -| instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:58:1:58:3 | [post] bar [@field] | -| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | -| instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | -| instance_variables.rb:70:16:70:24 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | -| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | -| instance_variables.rb:78:18:78:26 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | -| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:82:32:82:40 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | -| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:89:45:89:53 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | -| instance_variables.rb:89:45:89:53 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:95:53:95:61 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | -| instance_variables.rb:95:53:95:61 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:100:17:100:25 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] [@field] | instance_variables.rb:100:5:100:5 | [post] x [@field] | -| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] [@field] | instance_variables.rb:100:5:100:5 | [post] x [@field] | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:116:9:116:26 | call to new [@field] | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:27:5:29:7 | self in call_initialize [Return] [@field] | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | captured_variables.rb:60:5:62:7 | self in get_field [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | +| captured_variables.rb:20:25:20:34 | call to taint | captured_variables.rb:15:28:15:28 | x | captured_variables.rb:16:5:18:5 | -> { ... } : [lambda] [captured x] | captured_variables.rb:20:2:20:34 | call to capture_escape_return1 : [lambda] [captured x] | +| captured_variables.rb:27:48:27:57 | call to taint | captured_variables.rb:22:28:22:28 | x | captured_variables.rb:23:5:25:5 | -> { ... } : [lambda] [captured x] | captured_variables.rb:27:25:27:57 | call to capture_escape_return2 : [lambda] [captured x] | +| captured_variables.rb:66:15:66:22 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | captured_variables.rb:66:1:66:3 | [post] foo : Foo [@field] | +| captured_variables.rb:66:15:66:22 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | captured_variables.rb:66:1:66:3 | [post] foo : Foo [@field] | +| captured_variables.rb:68:10:68:12 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | captured_variables.rb:68:10:68:22 | call to get_field | +| captured_variables.rb:68:10:68:12 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | captured_variables.rb:68:10:68:22 | call to get_field | +| captured_variables.rb:69:19:69:26 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | captured_variables.rb:69:5:69:7 | [post] foo : Foo [@field] | +| captured_variables.rb:69:19:69:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | captured_variables.rb:69:5:69:7 | [post] foo : Foo [@field] | +| captured_variables.rb:72:6:72:8 | foo : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | captured_variables.rb:72:6:72:18 | call to get_field | +| captured_variables.rb:72:6:72:8 | foo : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | captured_variables.rb:72:6:72:18 | call to get_field | +| captured_variables.rb:72:6:72:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | captured_variables.rb:72:6:72:18 | call to get_field | +| captured_variables.rb:72:6:72:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | captured_variables.rb:72:6:72:18 | call to get_field | +| captured_variables.rb:79:23:79:30 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | captured_variables.rb:79:9:79:11 | [post] foo : Foo [@field] | +| captured_variables.rb:79:23:79:30 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | captured_variables.rb:79:9:79:11 | [post] foo : Foo [@field] | +| captured_variables.rb:83:6:83:8 | foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | captured_variables.rb:83:6:83:18 | call to get_field | +| captured_variables.rb:83:6:83:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | captured_variables.rb:83:6:83:18 | call to get_field | +| captured_variables.rb:98:13:98:20 | call to taint | captured_variables.rb:93:17:93:17 | x | captured_variables.rb:94:5:96:5 | -> { ... } : [lambda] [captured x] | captured_variables.rb:98:1:98:21 | call to capture_arg : [lambda] [captured x] | +| captured_variables.rb:226:5:226:7 | fn1 : [lambda] [captured x] | captured_variables.rb:223:13:223:13 | x | captured_variables.rb:223:13:223:13 | x | captured_variables.rb:226:5:226:7 | [post] fn1 : [lambda] [captured y] | +| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:22:5:25:7 | self in initialize [Return] : Foo [@field] | instance_variables.rb:28:9:28:25 | [post] self : Foo [@field] | +| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:33:9:33:14 | call to new : Foo [@field] | +| instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | +| instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | +| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:36:10:36:23 | call to new : Foo [@field] | +| instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | +| instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | +| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:9:33:14 | call to new : Foo [@field] | instance_variables.rb:39:6:39:23 | call to bar : Foo [@field] | +| instance_variables.rb:54:15:54:23 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:54:1:54:3 | [post] foo : Foo [@field] | +| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:54:1:54:3 | [post] foo : Foo [@field] | +| instance_variables.rb:55:6:55:8 | foo : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | +| instance_variables.rb:55:6:55:8 | foo : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | +| instance_variables.rb:58:15:58:22 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:58:1:58:3 | [post] bar : Foo [@field] | +| instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:58:1:58:3 | [post] bar : Foo [@field] | +| instance_variables.rb:59:6:59:8 | bar : Foo [@field] | instance_variables.rb:16:5:18:7 | self in inc_field : Foo [@field] | instance_variables.rb:16:5:18:7 | self in inc_field : Foo [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | +| instance_variables.rb:59:6:59:8 | bar : Foo [@field] | instance_variables.rb:16:5:18:7 | self in inc_field : Foo [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | +| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | +| instance_variables.rb:70:16:70:24 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 : Foo [@field] | +| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 : Foo [@field] | +| instance_variables.rb:78:18:78:26 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 : Foo [@field] | +| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 : Foo [@field] | +| instance_variables.rb:79:6:79:9 | foo5 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | +| instance_variables.rb:79:6:79:9 | foo5 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | +| instance_variables.rb:82:32:82:40 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 : Foo [@field] | +| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 : Foo [@field] | +| instance_variables.rb:83:6:83:9 | foo3 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | +| instance_variables.rb:83:6:83:9 | foo3 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | +| instance_variables.rb:84:6:84:9 | foo5 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | +| instance_variables.rb:84:6:84:9 | foo5 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | +| instance_variables.rb:85:6:85:9 | foo6 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | +| instance_variables.rb:85:6:85:9 | foo6 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | +| instance_variables.rb:89:45:89:53 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 : Foo [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 : Foo [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 : Foo [@field] | +| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 : Foo [@field] | +| instance_variables.rb:90:6:90:9 | foo7 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | +| instance_variables.rb:90:6:90:9 | foo7 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | +| instance_variables.rb:91:6:91:9 | foo8 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | +| instance_variables.rb:91:6:91:9 | foo8 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | +| instance_variables.rb:95:53:95:61 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 : Foo [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 : Foo [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 : Foo [@field] | +| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 : Foo [@field] | +| instance_variables.rb:96:6:96:9 | foo9 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | +| instance_variables.rb:96:6:96:9 | foo9 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | +| instance_variables.rb:97:6:97:10 | foo10 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | +| instance_variables.rb:97:6:97:10 | foo10 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | +| instance_variables.rb:100:17:100:25 | call to taint | captured_variables.rb:57:19:57:19 | x | captured_variables.rb:57:5:59:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:100:5:100:5 | [post] x : Foo [@field] | +| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:10:5:12:7 | self in set_field [Return] : Foo [@field] | instance_variables.rb:100:5:100:5 | [post] x : Foo [@field] | +| instance_variables.rb:105:6:105:10 | foo11 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | +| instance_variables.rb:105:6:105:10 | foo11 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | +| instance_variables.rb:109:6:109:10 | foo12 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | +| instance_variables.rb:109:6:109:10 | foo12 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | +| instance_variables.rb:114:6:114:10 | foo13 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | +| instance_variables.rb:114:6:114:10 | foo13 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | +| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:116:9:116:26 | call to new : Foo [@field] | +| instance_variables.rb:117:6:117:10 | foo15 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | +| instance_variables.rb:117:6:117:10 | foo15 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | +| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:27:5:29:7 | self in call_initialize [Return] : Foo [@field] | instance_variables.rb:119:6:119:10 | [post] foo16 : Foo [@field] | +| instance_variables.rb:120:6:120:10 | foo16 : Foo [@field] | captured_variables.rb:60:5:62:7 | self in get_field : Foo [@field] | captured_variables.rb:61:9:61:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | +| instance_variables.rb:120:6:120:10 | foo16 : Foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field : Foo [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | testFailures #select | blocks.rb:8:10:8:14 | yield ... | blocks.rb:14:12:14:20 | call to source | blocks.rb:8:10:8:14 | yield ... | $@ | blocks.rb:14:12:14:20 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected index 638fab35152..17433b1cd77 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected @@ -1,1366 +1,1366 @@ models edges -| hash_flow.rb:10:5:10:8 | hash [element 0] | hash_flow.rb:30:10:30:13 | hash [element 0] | provenance | | -| hash_flow.rb:10:5:10:8 | hash [element :a] | hash_flow.rb:22:10:22:13 | hash [element :a] | provenance | | -| hash_flow.rb:10:5:10:8 | hash [element :c] | hash_flow.rb:24:10:24:13 | hash [element :c] | provenance | | -| hash_flow.rb:10:5:10:8 | hash [element e] | hash_flow.rb:26:10:26:13 | hash [element e] | provenance | | -| hash_flow.rb:10:5:10:8 | hash [element g] | hash_flow.rb:28:10:28:13 | hash [element g] | provenance | | -| hash_flow.rb:10:12:21:5 | call to [] [element 0] | hash_flow.rb:10:5:10:8 | hash [element 0] | provenance | | -| hash_flow.rb:10:12:21:5 | call to [] [element :a] | hash_flow.rb:10:5:10:8 | hash [element :a] | provenance | | -| hash_flow.rb:10:12:21:5 | call to [] [element :c] | hash_flow.rb:10:5:10:8 | hash [element :c] | provenance | | -| hash_flow.rb:10:12:21:5 | call to [] [element e] | hash_flow.rb:10:5:10:8 | hash [element e] | provenance | | -| hash_flow.rb:10:12:21:5 | call to [] [element g] | hash_flow.rb:10:5:10:8 | hash [element g] | provenance | | -| hash_flow.rb:11:15:11:24 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:13:12:13:21 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:15:14:15:23 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element e] | provenance | | -| hash_flow.rb:17:16:17:25 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element g] | provenance | | -| hash_flow.rb:19:14:19:23 | call to taint | hash_flow.rb:10:12:21:5 | call to [] [element 0] | provenance | | -| hash_flow.rb:22:10:22:13 | hash [element :a] | hash_flow.rb:22:10:22:17 | ...[...] | provenance | | -| hash_flow.rb:24:10:24:13 | hash [element :c] | hash_flow.rb:24:10:24:17 | ...[...] | provenance | | -| hash_flow.rb:26:10:26:13 | hash [element e] | hash_flow.rb:26:10:26:18 | ...[...] | provenance | | -| hash_flow.rb:28:10:28:13 | hash [element g] | hash_flow.rb:28:10:28:18 | ...[...] | provenance | | -| hash_flow.rb:30:10:30:13 | hash [element 0] | hash_flow.rb:30:10:30:16 | ...[...] | provenance | | -| hash_flow.rb:38:5:38:8 | [post] hash [element 0] | hash_flow.rb:39:5:39:8 | hash [element 0] | provenance | | -| hash_flow.rb:38:15:38:24 | call to taint | hash_flow.rb:38:5:38:8 | [post] hash [element 0] | provenance | | -| hash_flow.rb:39:5:39:8 | [post] hash [element 0] | hash_flow.rb:40:5:40:8 | hash [element 0] | provenance | | -| hash_flow.rb:39:5:39:8 | hash [element 0] | hash_flow.rb:39:5:39:8 | [post] hash [element 0] | provenance | | -| hash_flow.rb:40:5:40:8 | [post] hash [element 0] | hash_flow.rb:41:5:41:8 | hash [element 0] | provenance | | -| hash_flow.rb:40:5:40:8 | [post] hash [element :a] | hash_flow.rb:41:5:41:8 | hash [element :a] | provenance | | -| hash_flow.rb:40:5:40:8 | hash [element 0] | hash_flow.rb:40:5:40:8 | [post] hash [element 0] | provenance | | -| hash_flow.rb:40:16:40:25 | call to taint | hash_flow.rb:40:5:40:8 | [post] hash [element :a] | provenance | | -| hash_flow.rb:41:5:41:8 | [post] hash [element 0] | hash_flow.rb:42:5:42:8 | hash [element 0] | provenance | | -| hash_flow.rb:41:5:41:8 | [post] hash [element :a] | hash_flow.rb:42:5:42:8 | hash [element :a] | provenance | | -| hash_flow.rb:41:5:41:8 | hash [element 0] | hash_flow.rb:41:5:41:8 | [post] hash [element 0] | provenance | | -| hash_flow.rb:41:5:41:8 | hash [element :a] | hash_flow.rb:41:5:41:8 | [post] hash [element :a] | provenance | | -| hash_flow.rb:42:5:42:8 | [post] hash [element 0] | hash_flow.rb:43:5:43:8 | hash [element 0] | provenance | | -| hash_flow.rb:42:5:42:8 | [post] hash [element :a] | hash_flow.rb:43:5:43:8 | hash [element :a] | provenance | | -| hash_flow.rb:42:5:42:8 | [post] hash [element a] | hash_flow.rb:43:5:43:8 | hash [element a] | provenance | | -| hash_flow.rb:42:5:42:8 | hash [element 0] | hash_flow.rb:42:5:42:8 | [post] hash [element 0] | provenance | | -| hash_flow.rb:42:5:42:8 | hash [element :a] | hash_flow.rb:42:5:42:8 | [post] hash [element :a] | provenance | | -| hash_flow.rb:42:17:42:26 | call to taint | hash_flow.rb:42:5:42:8 | [post] hash [element a] | provenance | | -| hash_flow.rb:43:5:43:8 | [post] hash [element 0] | hash_flow.rb:44:10:44:13 | hash [element 0] | provenance | | -| hash_flow.rb:43:5:43:8 | [post] hash [element :a] | hash_flow.rb:46:10:46:13 | hash [element :a] | provenance | | -| hash_flow.rb:43:5:43:8 | [post] hash [element :a] | hash_flow.rb:48:10:48:13 | hash [element :a] | provenance | | -| hash_flow.rb:43:5:43:8 | [post] hash [element a] | hash_flow.rb:46:10:46:13 | hash [element a] | provenance | | -| hash_flow.rb:43:5:43:8 | [post] hash [element a] | hash_flow.rb:48:10:48:13 | hash [element a] | provenance | | -| hash_flow.rb:43:5:43:8 | hash [element 0] | hash_flow.rb:43:5:43:8 | [post] hash [element 0] | provenance | | -| hash_flow.rb:43:5:43:8 | hash [element :a] | hash_flow.rb:43:5:43:8 | [post] hash [element :a] | provenance | | -| hash_flow.rb:43:5:43:8 | hash [element a] | hash_flow.rb:43:5:43:8 | [post] hash [element a] | provenance | | -| hash_flow.rb:44:10:44:13 | hash [element 0] | hash_flow.rb:44:10:44:16 | ...[...] | provenance | | -| hash_flow.rb:46:10:46:13 | hash [element :a] | hash_flow.rb:46:10:46:17 | ...[...] | provenance | | -| hash_flow.rb:46:10:46:13 | hash [element a] | hash_flow.rb:46:10:46:17 | ...[...] | provenance | | -| hash_flow.rb:48:10:48:13 | hash [element :a] | hash_flow.rb:48:10:48:18 | ...[...] | provenance | | -| hash_flow.rb:48:10:48:13 | hash [element a] | hash_flow.rb:48:10:48:18 | ...[...] | provenance | | -| hash_flow.rb:55:5:55:9 | hash1 [element :a] | hash_flow.rb:56:10:56:14 | hash1 [element :a] | provenance | | -| hash_flow.rb:55:13:55:37 | ...[...] [element :a] | hash_flow.rb:55:5:55:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:55:21:55:30 | call to taint | hash_flow.rb:55:13:55:37 | ...[...] [element :a] | provenance | | -| hash_flow.rb:56:10:56:14 | hash1 [element :a] | hash_flow.rb:56:10:56:18 | ...[...] | provenance | | -| hash_flow.rb:59:5:59:5 | x [element :a] | hash_flow.rb:60:18:60:18 | x [element :a] | provenance | | -| hash_flow.rb:59:9:59:29 | call to [] [element :a] | hash_flow.rb:59:5:59:5 | x [element :a] | provenance | | -| hash_flow.rb:59:13:59:22 | call to taint | hash_flow.rb:59:9:59:29 | call to [] [element :a] | provenance | | -| hash_flow.rb:60:5:60:9 | hash2 [element :a] | hash_flow.rb:61:10:61:14 | hash2 [element :a] | provenance | | -| hash_flow.rb:60:13:60:19 | ...[...] [element :a] | hash_flow.rb:60:5:60:9 | hash2 [element :a] | provenance | | -| hash_flow.rb:60:18:60:18 | x [element :a] | hash_flow.rb:60:13:60:19 | ...[...] [element :a] | provenance | | -| hash_flow.rb:61:10:61:14 | hash2 [element :a] | hash_flow.rb:61:10:61:18 | ...[...] | provenance | | -| hash_flow.rb:64:5:64:9 | hash3 [element] | hash_flow.rb:65:10:65:14 | hash3 [element] | provenance | | -| hash_flow.rb:64:5:64:9 | hash3 [element] | hash_flow.rb:66:10:66:14 | hash3 [element] | provenance | | -| hash_flow.rb:64:13:64:45 | ...[...] [element] | hash_flow.rb:64:5:64:9 | hash3 [element] | provenance | | -| hash_flow.rb:64:18:64:44 | call to [] [element 0, element 1] | hash_flow.rb:64:13:64:45 | ...[...] [element] | provenance | | -| hash_flow.rb:64:19:64:34 | call to [] [element 1] | hash_flow.rb:64:18:64:44 | call to [] [element 0, element 1] | provenance | | -| hash_flow.rb:64:24:64:33 | call to taint | hash_flow.rb:64:19:64:34 | call to [] [element 1] | provenance | | -| hash_flow.rb:65:10:65:14 | hash3 [element] | hash_flow.rb:65:10:65:18 | ...[...] | provenance | | -| hash_flow.rb:66:10:66:14 | hash3 [element] | hash_flow.rb:66:10:66:18 | ...[...] | provenance | | -| hash_flow.rb:68:5:68:9 | hash4 [element :a] | hash_flow.rb:69:10:69:14 | hash4 [element :a] | provenance | | -| hash_flow.rb:68:13:68:39 | ...[...] [element :a] | hash_flow.rb:68:5:68:9 | hash4 [element :a] | provenance | | -| hash_flow.rb:68:22:68:31 | call to taint | hash_flow.rb:68:13:68:39 | ...[...] [element :a] | provenance | | -| hash_flow.rb:69:10:69:14 | hash4 [element :a] | hash_flow.rb:69:10:69:18 | ...[...] | provenance | | -| hash_flow.rb:72:5:72:9 | hash5 [element a] | hash_flow.rb:73:10:73:14 | hash5 [element a] | provenance | | -| hash_flow.rb:72:13:72:45 | ...[...] [element a] | hash_flow.rb:72:5:72:9 | hash5 [element a] | provenance | | -| hash_flow.rb:72:25:72:34 | call to taint | hash_flow.rb:72:13:72:45 | ...[...] [element a] | provenance | | -| hash_flow.rb:73:10:73:14 | hash5 [element a] | hash_flow.rb:73:10:73:19 | ...[...] | provenance | | -| hash_flow.rb:76:5:76:9 | hash6 [element a] | hash_flow.rb:77:10:77:14 | hash6 [element a] | provenance | | -| hash_flow.rb:76:13:76:47 | ...[...] [element a] | hash_flow.rb:76:5:76:9 | hash6 [element a] | provenance | | -| hash_flow.rb:76:18:76:46 | call to [] [element a] | hash_flow.rb:76:13:76:47 | ...[...] [element a] | provenance | | -| hash_flow.rb:76:26:76:35 | call to taint | hash_flow.rb:76:18:76:46 | call to [] [element a] | provenance | | -| hash_flow.rb:77:10:77:14 | hash6 [element a] | hash_flow.rb:77:10:77:19 | ...[...] | provenance | | -| hash_flow.rb:84:5:84:9 | hash1 [element :a] | hash_flow.rb:85:10:85:14 | hash1 [element :a] | provenance | | -| hash_flow.rb:84:13:84:42 | call to [] [element :a] | hash_flow.rb:84:5:84:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:84:26:84:35 | call to taint | hash_flow.rb:84:13:84:42 | call to [] [element :a] | provenance | | -| hash_flow.rb:85:10:85:14 | hash1 [element :a] | hash_flow.rb:85:10:85:18 | ...[...] | provenance | | -| hash_flow.rb:92:5:92:8 | hash [element :a] | hash_flow.rb:96:30:96:33 | hash [element :a] | provenance | | -| hash_flow.rb:92:12:95:5 | call to [] [element :a] | hash_flow.rb:92:5:92:8 | hash [element :a] | provenance | | -| hash_flow.rb:93:15:93:24 | call to taint | hash_flow.rb:92:12:95:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:96:5:96:9 | hash2 [element :a] | hash_flow.rb:97:10:97:14 | hash2 [element :a] | provenance | | -| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | hash_flow.rb:96:5:96:9 | hash2 [element :a] | provenance | | -| hash_flow.rb:96:30:96:33 | hash [element :a] | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | provenance | | -| hash_flow.rb:97:10:97:14 | hash2 [element :a] | hash_flow.rb:97:10:97:18 | ...[...] | provenance | | +| hash_flow.rb:10:5:10:8 | hash : Hash [element 0] | hash_flow.rb:30:10:30:13 | hash : Hash [element 0] | provenance | | +| hash_flow.rb:10:5:10:8 | hash : Hash [element :a] | hash_flow.rb:22:10:22:13 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:10:5:10:8 | hash : Hash [element :c] | hash_flow.rb:24:10:24:13 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:10:5:10:8 | hash : Hash [element e] | hash_flow.rb:26:10:26:13 | hash : Hash [element e] | provenance | | +| hash_flow.rb:10:5:10:8 | hash : Hash [element g] | hash_flow.rb:28:10:28:13 | hash : Hash [element g] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element 0] | hash_flow.rb:10:5:10:8 | hash : Hash [element 0] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element :a] | hash_flow.rb:10:5:10:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element :c] | hash_flow.rb:10:5:10:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element e] | hash_flow.rb:10:5:10:8 | hash : Hash [element e] | provenance | | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element g] | hash_flow.rb:10:5:10:8 | hash : Hash [element g] | provenance | | +| hash_flow.rb:11:15:11:24 | call to taint | hash_flow.rb:10:12:21:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:13:12:13:21 | call to taint | hash_flow.rb:10:12:21:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:15:14:15:23 | call to taint | hash_flow.rb:10:12:21:5 | call to [] : Hash [element e] | provenance | | +| hash_flow.rb:17:16:17:25 | call to taint | hash_flow.rb:10:12:21:5 | call to [] : Hash [element g] | provenance | | +| hash_flow.rb:19:14:19:23 | call to taint | hash_flow.rb:10:12:21:5 | call to [] : Hash [element 0] | provenance | | +| hash_flow.rb:22:10:22:13 | hash : Hash [element :a] | hash_flow.rb:22:10:22:17 | ...[...] | provenance | | +| hash_flow.rb:24:10:24:13 | hash : Hash [element :c] | hash_flow.rb:24:10:24:17 | ...[...] | provenance | | +| hash_flow.rb:26:10:26:13 | hash : Hash [element e] | hash_flow.rb:26:10:26:18 | ...[...] | provenance | | +| hash_flow.rb:28:10:28:13 | hash : Hash [element g] | hash_flow.rb:28:10:28:18 | ...[...] | provenance | | +| hash_flow.rb:30:10:30:13 | hash : Hash [element 0] | hash_flow.rb:30:10:30:16 | ...[...] | provenance | | +| hash_flow.rb:38:5:38:8 | [post] hash : [collection] [element 0] | hash_flow.rb:39:5:39:8 | hash : [collection] [element 0] | provenance | | +| hash_flow.rb:38:15:38:24 | call to taint | hash_flow.rb:38:5:38:8 | [post] hash : [collection] [element 0] | provenance | | +| hash_flow.rb:39:5:39:8 | [post] hash : [collection] [element 0] | hash_flow.rb:40:5:40:8 | hash : [collection] [element 0] | provenance | | +| hash_flow.rb:39:5:39:8 | hash : [collection] [element 0] | hash_flow.rb:39:5:39:8 | [post] hash : [collection] [element 0] | provenance | | +| hash_flow.rb:40:5:40:8 | [post] hash : [collection] [element 0] | hash_flow.rb:41:5:41:8 | hash : [collection] [element 0] | provenance | | +| hash_flow.rb:40:5:40:8 | [post] hash : [collection] [element :a] | hash_flow.rb:41:5:41:8 | hash : [collection] [element :a] | provenance | | +| hash_flow.rb:40:5:40:8 | hash : [collection] [element 0] | hash_flow.rb:40:5:40:8 | [post] hash : [collection] [element 0] | provenance | | +| hash_flow.rb:40:16:40:25 | call to taint | hash_flow.rb:40:5:40:8 | [post] hash : [collection] [element :a] | provenance | | +| hash_flow.rb:41:5:41:8 | [post] hash : [collection] [element 0] | hash_flow.rb:42:5:42:8 | hash : [collection] [element 0] | provenance | | +| hash_flow.rb:41:5:41:8 | [post] hash : [collection] [element :a] | hash_flow.rb:42:5:42:8 | hash : [collection] [element :a] | provenance | | +| hash_flow.rb:41:5:41:8 | hash : [collection] [element 0] | hash_flow.rb:41:5:41:8 | [post] hash : [collection] [element 0] | provenance | | +| hash_flow.rb:41:5:41:8 | hash : [collection] [element :a] | hash_flow.rb:41:5:41:8 | [post] hash : [collection] [element :a] | provenance | | +| hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element 0] | hash_flow.rb:43:5:43:8 | hash : [collection] [element 0] | provenance | | +| hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element :a] | hash_flow.rb:43:5:43:8 | hash : [collection] [element :a] | provenance | | +| hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element a] | hash_flow.rb:43:5:43:8 | hash : [collection] [element a] | provenance | | +| hash_flow.rb:42:5:42:8 | hash : [collection] [element 0] | hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element 0] | provenance | | +| hash_flow.rb:42:5:42:8 | hash : [collection] [element :a] | hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element :a] | provenance | | +| hash_flow.rb:42:17:42:26 | call to taint | hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element a] | provenance | | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element 0] | hash_flow.rb:44:10:44:13 | hash : [collection] [element 0] | provenance | | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element :a] | hash_flow.rb:46:10:46:13 | hash : [collection] [element :a] | provenance | | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element :a] | hash_flow.rb:48:10:48:13 | hash : [collection] [element :a] | provenance | | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element a] | hash_flow.rb:46:10:46:13 | hash : [collection] [element a] | provenance | | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element a] | hash_flow.rb:48:10:48:13 | hash : [collection] [element a] | provenance | | +| hash_flow.rb:43:5:43:8 | hash : [collection] [element 0] | hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element 0] | provenance | | +| hash_flow.rb:43:5:43:8 | hash : [collection] [element :a] | hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element :a] | provenance | | +| hash_flow.rb:43:5:43:8 | hash : [collection] [element a] | hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element a] | provenance | | +| hash_flow.rb:44:10:44:13 | hash : [collection] [element 0] | hash_flow.rb:44:10:44:16 | ...[...] | provenance | | +| hash_flow.rb:46:10:46:13 | hash : [collection] [element :a] | hash_flow.rb:46:10:46:17 | ...[...] | provenance | | +| hash_flow.rb:46:10:46:13 | hash : [collection] [element a] | hash_flow.rb:46:10:46:17 | ...[...] | provenance | | +| hash_flow.rb:48:10:48:13 | hash : [collection] [element :a] | hash_flow.rb:48:10:48:18 | ...[...] | provenance | | +| hash_flow.rb:48:10:48:13 | hash : [collection] [element a] | hash_flow.rb:48:10:48:18 | ...[...] | provenance | | +| hash_flow.rb:55:5:55:9 | hash1 : Hash [element :a] | hash_flow.rb:56:10:56:14 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:55:13:55:37 | ...[...] : Hash [element :a] | hash_flow.rb:55:5:55:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:55:21:55:30 | call to taint | hash_flow.rb:55:13:55:37 | ...[...] : Hash [element :a] | provenance | | +| hash_flow.rb:56:10:56:14 | hash1 : Hash [element :a] | hash_flow.rb:56:10:56:18 | ...[...] | provenance | | +| hash_flow.rb:59:5:59:5 | x : Hash [element :a] | hash_flow.rb:60:18:60:18 | x : Hash [element :a] | provenance | | +| hash_flow.rb:59:9:59:29 | call to [] : Hash [element :a] | hash_flow.rb:59:5:59:5 | x : Hash [element :a] | provenance | | +| hash_flow.rb:59:13:59:22 | call to taint | hash_flow.rb:59:9:59:29 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:60:5:60:9 | hash2 : Hash [element :a] | hash_flow.rb:61:10:61:14 | hash2 : Hash [element :a] | provenance | | +| hash_flow.rb:60:13:60:19 | ...[...] : Hash [element :a] | hash_flow.rb:60:5:60:9 | hash2 : Hash [element :a] | provenance | | +| hash_flow.rb:60:18:60:18 | x : Hash [element :a] | hash_flow.rb:60:13:60:19 | ...[...] : Hash [element :a] | provenance | | +| hash_flow.rb:61:10:61:14 | hash2 : Hash [element :a] | hash_flow.rb:61:10:61:18 | ...[...] | provenance | | +| hash_flow.rb:64:5:64:9 | hash3 : [collection] [element] | hash_flow.rb:65:10:65:14 | hash3 : [collection] [element] | provenance | | +| hash_flow.rb:64:5:64:9 | hash3 : [collection] [element] | hash_flow.rb:66:10:66:14 | hash3 : [collection] [element] | provenance | | +| hash_flow.rb:64:13:64:45 | ...[...] : [collection] [element] | hash_flow.rb:64:5:64:9 | hash3 : [collection] [element] | provenance | | +| hash_flow.rb:64:18:64:44 | call to [] : Array [element 0, element 1] | hash_flow.rb:64:13:64:45 | ...[...] : [collection] [element] | provenance | | +| hash_flow.rb:64:19:64:34 | call to [] : Array [element 1] | hash_flow.rb:64:18:64:44 | call to [] : Array [element 0, element 1] | provenance | | +| hash_flow.rb:64:24:64:33 | call to taint | hash_flow.rb:64:19:64:34 | call to [] : Array [element 1] | provenance | | +| hash_flow.rb:65:10:65:14 | hash3 : [collection] [element] | hash_flow.rb:65:10:65:18 | ...[...] | provenance | | +| hash_flow.rb:66:10:66:14 | hash3 : [collection] [element] | hash_flow.rb:66:10:66:18 | ...[...] | provenance | | +| hash_flow.rb:68:5:68:9 | hash4 : [collection] [element :a] | hash_flow.rb:69:10:69:14 | hash4 : [collection] [element :a] | provenance | | +| hash_flow.rb:68:13:68:39 | ...[...] : [collection] [element :a] | hash_flow.rb:68:5:68:9 | hash4 : [collection] [element :a] | provenance | | +| hash_flow.rb:68:22:68:31 | call to taint | hash_flow.rb:68:13:68:39 | ...[...] : [collection] [element :a] | provenance | | +| hash_flow.rb:69:10:69:14 | hash4 : [collection] [element :a] | hash_flow.rb:69:10:69:18 | ...[...] | provenance | | +| hash_flow.rb:72:5:72:9 | hash5 : Hash [element a] | hash_flow.rb:73:10:73:14 | hash5 : Hash [element a] | provenance | | +| hash_flow.rb:72:13:72:45 | ...[...] : Hash [element a] | hash_flow.rb:72:5:72:9 | hash5 : Hash [element a] | provenance | | +| hash_flow.rb:72:25:72:34 | call to taint | hash_flow.rb:72:13:72:45 | ...[...] : Hash [element a] | provenance | | +| hash_flow.rb:73:10:73:14 | hash5 : Hash [element a] | hash_flow.rb:73:10:73:19 | ...[...] | provenance | | +| hash_flow.rb:76:5:76:9 | hash6 : Hash [element a] | hash_flow.rb:77:10:77:14 | hash6 : Hash [element a] | provenance | | +| hash_flow.rb:76:13:76:47 | ...[...] : Hash [element a] | hash_flow.rb:76:5:76:9 | hash6 : Hash [element a] | provenance | | +| hash_flow.rb:76:18:76:46 | call to [] : Hash [element a] | hash_flow.rb:76:13:76:47 | ...[...] : Hash [element a] | provenance | | +| hash_flow.rb:76:26:76:35 | call to taint | hash_flow.rb:76:18:76:46 | call to [] : Hash [element a] | provenance | | +| hash_flow.rb:77:10:77:14 | hash6 : Hash [element a] | hash_flow.rb:77:10:77:19 | ...[...] | provenance | | +| hash_flow.rb:84:5:84:9 | hash1 : Hash [element :a] | hash_flow.rb:85:10:85:14 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:84:13:84:42 | call to [] : Hash [element :a] | hash_flow.rb:84:5:84:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:84:26:84:35 | call to taint | hash_flow.rb:84:13:84:42 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:85:10:85:14 | hash1 : Hash [element :a] | hash_flow.rb:85:10:85:18 | ...[...] | provenance | | +| hash_flow.rb:92:5:92:8 | hash : Hash [element :a] | hash_flow.rb:96:30:96:33 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:92:12:95:5 | call to [] : Hash [element :a] | hash_flow.rb:92:5:92:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:93:15:93:24 | call to taint | hash_flow.rb:92:12:95:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:96:5:96:9 | hash2 : Hash [element :a] | hash_flow.rb:97:10:97:14 | hash2 : Hash [element :a] | provenance | | +| hash_flow.rb:96:13:96:34 | call to try_convert : Hash [element :a] | hash_flow.rb:96:5:96:9 | hash2 : Hash [element :a] | provenance | | +| hash_flow.rb:96:30:96:33 | hash : Hash [element :a] | hash_flow.rb:96:13:96:34 | call to try_convert : Hash [element :a] | provenance | | +| hash_flow.rb:97:10:97:14 | hash2 : Hash [element :a] | hash_flow.rb:97:10:97:18 | ...[...] | provenance | | | hash_flow.rb:105:5:105:5 | b | hash_flow.rb:106:10:106:10 | b | provenance | | | hash_flow.rb:105:21:105:30 | call to taint | hash_flow.rb:105:5:105:5 | b | provenance | | | hash_flow.rb:113:5:113:5 | b | hash_flow.rb:115:10:115:10 | b | provenance | | -| hash_flow.rb:113:9:113:12 | [post] hash [element :a] | hash_flow.rb:114:10:114:13 | hash [element :a] | provenance | | +| hash_flow.rb:113:9:113:12 | [post] hash : [collection] [element :a] | hash_flow.rb:114:10:114:13 | hash : [collection] [element :a] | provenance | | | hash_flow.rb:113:9:113:34 | call to store | hash_flow.rb:113:5:113:5 | b | provenance | | -| hash_flow.rb:113:24:113:33 | call to taint | hash_flow.rb:113:9:113:12 | [post] hash [element :a] | provenance | | +| hash_flow.rb:113:24:113:33 | call to taint | hash_flow.rb:113:9:113:12 | [post] hash : [collection] [element :a] | provenance | | | hash_flow.rb:113:24:113:33 | call to taint | hash_flow.rb:113:9:113:34 | call to store | provenance | | -| hash_flow.rb:114:10:114:13 | hash [element :a] | hash_flow.rb:114:10:114:17 | ...[...] | provenance | | +| hash_flow.rb:114:10:114:13 | hash : [collection] [element :a] | hash_flow.rb:114:10:114:17 | ...[...] | provenance | | | hash_flow.rb:118:5:118:5 | c | hash_flow.rb:121:10:121:10 | c | provenance | | -| hash_flow.rb:118:9:118:12 | [post] hash [element] | hash_flow.rb:119:10:119:13 | hash [element] | provenance | | -| hash_flow.rb:118:9:118:12 | [post] hash [element] | hash_flow.rb:120:10:120:13 | hash [element] | provenance | | +| hash_flow.rb:118:9:118:12 | [post] hash : [collection] [element] | hash_flow.rb:119:10:119:13 | hash : [collection] [element] | provenance | | +| hash_flow.rb:118:9:118:12 | [post] hash : [collection] [element] | hash_flow.rb:120:10:120:13 | hash : [collection] [element] | provenance | | | hash_flow.rb:118:9:118:33 | call to store | hash_flow.rb:118:5:118:5 | c | provenance | | -| hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:118:9:118:12 | [post] hash [element] | provenance | | +| hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:118:9:118:12 | [post] hash : [collection] [element] | provenance | | | hash_flow.rb:118:23:118:32 | call to taint | hash_flow.rb:118:9:118:33 | call to store | provenance | | -| hash_flow.rb:119:10:119:13 | hash [element] | hash_flow.rb:119:10:119:17 | ...[...] | provenance | | -| hash_flow.rb:120:10:120:13 | hash [element] | hash_flow.rb:120:10:120:17 | ...[...] | provenance | | -| hash_flow.rb:127:5:127:8 | hash [element :a] | hash_flow.rb:131:5:131:8 | hash [element :a] | provenance | | -| hash_flow.rb:127:5:127:8 | hash [element :a] | hash_flow.rb:134:5:134:8 | hash [element :a] | provenance | | -| hash_flow.rb:127:12:130:5 | call to [] [element :a] | hash_flow.rb:127:5:127:8 | hash [element :a] | provenance | | -| hash_flow.rb:128:15:128:24 | call to taint | hash_flow.rb:127:12:130:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:131:5:131:8 | hash [element :a] | hash_flow.rb:131:18:131:29 | key_or_value | provenance | | +| hash_flow.rb:119:10:119:13 | hash : [collection] [element] | hash_flow.rb:119:10:119:17 | ...[...] | provenance | | +| hash_flow.rb:120:10:120:13 | hash : [collection] [element] | hash_flow.rb:120:10:120:17 | ...[...] | provenance | | +| hash_flow.rb:127:5:127:8 | hash : Hash [element :a] | hash_flow.rb:131:5:131:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:127:5:127:8 | hash : Hash [element :a] | hash_flow.rb:134:5:134:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:127:12:130:5 | call to [] : Hash [element :a] | hash_flow.rb:127:5:127:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:128:15:128:24 | call to taint | hash_flow.rb:127:12:130:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:131:5:131:8 | hash : Hash [element :a] | hash_flow.rb:131:18:131:29 | key_or_value | provenance | | | hash_flow.rb:131:18:131:29 | key_or_value | hash_flow.rb:132:14:132:25 | key_or_value | provenance | | -| hash_flow.rb:134:5:134:8 | hash [element :a] | hash_flow.rb:134:22:134:26 | value | provenance | | +| hash_flow.rb:134:5:134:8 | hash : Hash [element :a] | hash_flow.rb:134:22:134:26 | value | provenance | | | hash_flow.rb:134:22:134:26 | value | hash_flow.rb:136:14:136:18 | value | provenance | | -| hash_flow.rb:143:5:143:8 | hash [element :a] | hash_flow.rb:147:9:147:12 | hash [element :a] | provenance | | -| hash_flow.rb:143:5:143:8 | hash [element :a] | hash_flow.rb:151:9:151:12 | hash [element :a] | provenance | | -| hash_flow.rb:143:12:146:5 | call to [] [element :a] | hash_flow.rb:143:5:143:8 | hash [element :a] | provenance | | -| hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:143:12:146:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:147:5:147:5 | b [element 1] | hash_flow.rb:149:10:149:10 | b [element 1] | provenance | | -| hash_flow.rb:147:5:147:5 | b [element 1] | hash_flow.rb:150:10:150:10 | b [element 1] | provenance | | -| hash_flow.rb:147:9:147:12 | hash [element :a] | hash_flow.rb:147:9:147:22 | call to assoc [element 1] | provenance | | -| hash_flow.rb:147:9:147:22 | call to assoc [element 1] | hash_flow.rb:147:5:147:5 | b [element 1] | provenance | | -| hash_flow.rb:149:10:149:10 | b [element 1] | hash_flow.rb:149:10:149:13 | ...[...] | provenance | | -| hash_flow.rb:150:10:150:10 | b [element 1] | hash_flow.rb:150:10:150:13 | ...[...] | provenance | | -| hash_flow.rb:151:5:151:5 | c [element 1] | hash_flow.rb:152:10:152:10 | c [element 1] | provenance | | -| hash_flow.rb:151:9:151:12 | hash [element :a] | hash_flow.rb:151:9:151:21 | call to assoc [element 1] | provenance | | -| hash_flow.rb:151:9:151:21 | call to assoc [element 1] | hash_flow.rb:151:5:151:5 | c [element 1] | provenance | | -| hash_flow.rb:152:10:152:10 | c [element 1] | hash_flow.rb:152:10:152:13 | ...[...] | provenance | | -| hash_flow.rb:169:5:169:8 | hash [element :a] | hash_flow.rb:173:9:173:12 | hash [element :a] | provenance | | -| hash_flow.rb:169:12:172:5 | call to [] [element :a] | hash_flow.rb:169:5:169:8 | hash [element :a] | provenance | | -| hash_flow.rb:170:15:170:25 | call to taint | hash_flow.rb:169:12:172:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:173:5:173:5 | a [element :a] | hash_flow.rb:174:10:174:10 | a [element :a] | provenance | | -| hash_flow.rb:173:9:173:12 | hash [element :a] | hash_flow.rb:173:9:173:20 | call to compact [element :a] | provenance | | -| hash_flow.rb:173:9:173:20 | call to compact [element :a] | hash_flow.rb:173:5:173:5 | a [element :a] | provenance | | -| hash_flow.rb:174:10:174:10 | a [element :a] | hash_flow.rb:174:10:174:14 | ...[...] | provenance | | -| hash_flow.rb:181:5:181:8 | hash [element :a] | hash_flow.rb:185:9:185:12 | hash [element :a] | provenance | | -| hash_flow.rb:181:12:184:5 | call to [] [element :a] | hash_flow.rb:181:5:181:8 | hash [element :a] | provenance | | -| hash_flow.rb:182:15:182:25 | call to taint | hash_flow.rb:181:12:184:5 | call to [] [element :a] | provenance | | +| hash_flow.rb:143:5:143:8 | hash : Hash [element :a] | hash_flow.rb:147:9:147:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:143:5:143:8 | hash : Hash [element :a] | hash_flow.rb:151:9:151:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:143:12:146:5 | call to [] : Hash [element :a] | hash_flow.rb:143:5:143:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:144:15:144:25 | call to taint | hash_flow.rb:143:12:146:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:147:5:147:5 | b : [collection] [element 1] | hash_flow.rb:149:10:149:10 | b : [collection] [element 1] | provenance | | +| hash_flow.rb:147:5:147:5 | b : [collection] [element 1] | hash_flow.rb:150:10:150:10 | b : [collection] [element 1] | provenance | | +| hash_flow.rb:147:9:147:12 | hash : Hash [element :a] | hash_flow.rb:147:9:147:22 | call to assoc : [collection] [element 1] | provenance | | +| hash_flow.rb:147:9:147:22 | call to assoc : [collection] [element 1] | hash_flow.rb:147:5:147:5 | b : [collection] [element 1] | provenance | | +| hash_flow.rb:149:10:149:10 | b : [collection] [element 1] | hash_flow.rb:149:10:149:13 | ...[...] | provenance | | +| hash_flow.rb:150:10:150:10 | b : [collection] [element 1] | hash_flow.rb:150:10:150:13 | ...[...] | provenance | | +| hash_flow.rb:151:5:151:5 | c : [collection] [element 1] | hash_flow.rb:152:10:152:10 | c : [collection] [element 1] | provenance | | +| hash_flow.rb:151:9:151:12 | hash : Hash [element :a] | hash_flow.rb:151:9:151:21 | call to assoc : [collection] [element 1] | provenance | | +| hash_flow.rb:151:9:151:21 | call to assoc : [collection] [element 1] | hash_flow.rb:151:5:151:5 | c : [collection] [element 1] | provenance | | +| hash_flow.rb:152:10:152:10 | c : [collection] [element 1] | hash_flow.rb:152:10:152:13 | ...[...] | provenance | | +| hash_flow.rb:169:5:169:8 | hash : Hash [element :a] | hash_flow.rb:173:9:173:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:169:12:172:5 | call to [] : Hash [element :a] | hash_flow.rb:169:5:169:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:170:15:170:25 | call to taint | hash_flow.rb:169:12:172:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:173:5:173:5 | a : Hash [element :a] | hash_flow.rb:174:10:174:10 | a : Hash [element :a] | provenance | | +| hash_flow.rb:173:9:173:12 | hash : Hash [element :a] | hash_flow.rb:173:9:173:20 | call to compact : Hash [element :a] | provenance | | +| hash_flow.rb:173:9:173:20 | call to compact : Hash [element :a] | hash_flow.rb:173:5:173:5 | a : Hash [element :a] | provenance | | +| hash_flow.rb:174:10:174:10 | a : Hash [element :a] | hash_flow.rb:174:10:174:14 | ...[...] | provenance | | +| hash_flow.rb:181:5:181:8 | hash : Hash [element :a] | hash_flow.rb:185:9:185:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:181:12:184:5 | call to [] : Hash [element :a] | hash_flow.rb:181:5:181:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:182:15:182:25 | call to taint | hash_flow.rb:181:12:184:5 | call to [] : Hash [element :a] | provenance | | | hash_flow.rb:185:5:185:5 | a | hash_flow.rb:186:10:186:10 | a | provenance | | -| hash_flow.rb:185:9:185:12 | hash [element :a] | hash_flow.rb:185:9:185:23 | call to delete | provenance | | +| hash_flow.rb:185:9:185:12 | hash : Hash [element :a] | hash_flow.rb:185:9:185:23 | call to delete | provenance | | | hash_flow.rb:185:9:185:23 | call to delete | hash_flow.rb:185:5:185:5 | a | provenance | | -| hash_flow.rb:193:5:193:8 | hash [element :a] | hash_flow.rb:197:9:197:12 | hash [element :a] | provenance | | -| hash_flow.rb:193:12:196:5 | call to [] [element :a] | hash_flow.rb:193:5:193:8 | hash [element :a] | provenance | | -| hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:193:12:196:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:197:5:197:5 | a [element :a] | hash_flow.rb:201:10:201:10 | a [element :a] | provenance | | -| hash_flow.rb:197:9:197:12 | [post] hash [element :a] | hash_flow.rb:202:10:202:13 | hash [element :a] | provenance | | -| hash_flow.rb:197:9:197:12 | hash [element :a] | hash_flow.rb:197:9:197:12 | [post] hash [element :a] | provenance | | -| hash_flow.rb:197:9:197:12 | hash [element :a] | hash_flow.rb:197:9:200:7 | call to delete_if [element :a] | provenance | | -| hash_flow.rb:197:9:197:12 | hash [element :a] | hash_flow.rb:197:33:197:37 | value | provenance | | -| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] | hash_flow.rb:197:5:197:5 | a [element :a] | provenance | | +| hash_flow.rb:193:5:193:8 | hash : Hash [element :a] | hash_flow.rb:197:9:197:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:193:12:196:5 | call to [] : Hash [element :a] | hash_flow.rb:193:5:193:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:194:15:194:25 | call to taint | hash_flow.rb:193:12:196:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:197:5:197:5 | a : Hash [element :a] | hash_flow.rb:201:10:201:10 | a : Hash [element :a] | provenance | | +| hash_flow.rb:197:9:197:12 | [post] hash : Hash [element :a] | hash_flow.rb:202:10:202:13 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:197:9:197:12 | hash : Hash [element :a] | hash_flow.rb:197:9:197:12 | [post] hash : Hash [element :a] | provenance | | +| hash_flow.rb:197:9:197:12 | hash : Hash [element :a] | hash_flow.rb:197:9:200:7 | call to delete_if : Hash [element :a] | provenance | | +| hash_flow.rb:197:9:197:12 | hash : Hash [element :a] | hash_flow.rb:197:33:197:37 | value | provenance | | +| hash_flow.rb:197:9:200:7 | call to delete_if : Hash [element :a] | hash_flow.rb:197:5:197:5 | a : Hash [element :a] | provenance | | | hash_flow.rb:197:33:197:37 | value | hash_flow.rb:199:14:199:18 | value | provenance | | -| hash_flow.rb:201:10:201:10 | a [element :a] | hash_flow.rb:201:10:201:14 | ...[...] | provenance | | -| hash_flow.rb:202:10:202:13 | hash [element :a] | hash_flow.rb:202:10:202:17 | ...[...] | provenance | | -| hash_flow.rb:209:5:209:8 | hash [element :a] | hash_flow.rb:217:10:217:13 | hash [element :a] | provenance | | -| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | provenance | | -| hash_flow.rb:209:12:216:5 | call to [] [element :a] | hash_flow.rb:209:5:209:8 | hash [element :a] | provenance | | -| hash_flow.rb:209:12:216:5 | call to [] [element :c, element :d] | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | provenance | | -| hash_flow.rb:210:15:210:25 | call to taint | hash_flow.rb:209:12:216:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:212:15:215:9 | call to [] [element :d] | hash_flow.rb:209:12:216:5 | call to [] [element :c, element :d] | provenance | | -| hash_flow.rb:213:19:213:29 | call to taint | hash_flow.rb:212:15:215:9 | call to [] [element :d] | provenance | | -| hash_flow.rb:217:10:217:13 | hash [element :a] | hash_flow.rb:217:10:217:21 | call to dig | provenance | | -| hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | hash_flow.rb:219:10:219:24 | call to dig | provenance | | -| hash_flow.rb:226:5:226:8 | hash [element :a] | hash_flow.rb:230:9:230:12 | hash [element :a] | provenance | | -| hash_flow.rb:226:12:229:5 | call to [] [element :a] | hash_flow.rb:226:5:226:8 | hash [element :a] | provenance | | -| hash_flow.rb:227:15:227:25 | call to taint | hash_flow.rb:226:12:229:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:230:5:230:5 | x [element :a] | hash_flow.rb:234:10:234:10 | x [element :a] | provenance | | -| hash_flow.rb:230:9:230:12 | hash [element :a] | hash_flow.rb:230:9:233:7 | call to each [element :a] | provenance | | -| hash_flow.rb:230:9:230:12 | hash [element :a] | hash_flow.rb:230:28:230:32 | value | provenance | | -| hash_flow.rb:230:9:233:7 | call to each [element :a] | hash_flow.rb:230:5:230:5 | x [element :a] | provenance | | +| hash_flow.rb:201:10:201:10 | a : Hash [element :a] | hash_flow.rb:201:10:201:14 | ...[...] | provenance | | +| hash_flow.rb:202:10:202:13 | hash : Hash [element :a] | hash_flow.rb:202:10:202:17 | ...[...] | provenance | | +| hash_flow.rb:209:5:209:8 | hash : Hash [element :a] | hash_flow.rb:217:10:217:13 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:209:5:209:8 | hash : Hash [element :c, element :d] | hash_flow.rb:219:10:219:13 | hash : Hash [element :c, element :d] | provenance | | +| hash_flow.rb:209:12:216:5 | call to [] : Hash [element :a] | hash_flow.rb:209:5:209:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:209:12:216:5 | call to [] : Hash [element :c, element :d] | hash_flow.rb:209:5:209:8 | hash : Hash [element :c, element :d] | provenance | | +| hash_flow.rb:210:15:210:25 | call to taint | hash_flow.rb:209:12:216:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:212:15:215:9 | call to [] : Hash [element :d] | hash_flow.rb:209:12:216:5 | call to [] : Hash [element :c, element :d] | provenance | | +| hash_flow.rb:213:19:213:29 | call to taint | hash_flow.rb:212:15:215:9 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:217:10:217:13 | hash : Hash [element :a] | hash_flow.rb:217:10:217:21 | call to dig | provenance | | +| hash_flow.rb:219:10:219:13 | hash : Hash [element :c, element :d] | hash_flow.rb:219:10:219:24 | call to dig | provenance | | +| hash_flow.rb:226:5:226:8 | hash : Hash [element :a] | hash_flow.rb:230:9:230:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:226:12:229:5 | call to [] : Hash [element :a] | hash_flow.rb:226:5:226:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:227:15:227:25 | call to taint | hash_flow.rb:226:12:229:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:230:5:230:5 | x : Hash [element :a] | hash_flow.rb:234:10:234:10 | x : Hash [element :a] | provenance | | +| hash_flow.rb:230:9:230:12 | hash : Hash [element :a] | hash_flow.rb:230:9:233:7 | call to each : Hash [element :a] | provenance | | +| hash_flow.rb:230:9:230:12 | hash : Hash [element :a] | hash_flow.rb:230:28:230:32 | value | provenance | | +| hash_flow.rb:230:9:233:7 | call to each : Hash [element :a] | hash_flow.rb:230:5:230:5 | x : Hash [element :a] | provenance | | | hash_flow.rb:230:28:230:32 | value | hash_flow.rb:232:14:232:18 | value | provenance | | -| hash_flow.rb:234:10:234:10 | x [element :a] | hash_flow.rb:234:10:234:14 | ...[...] | provenance | | -| hash_flow.rb:241:5:241:8 | hash [element :a] | hash_flow.rb:245:9:245:12 | hash [element :a] | provenance | | -| hash_flow.rb:241:12:244:5 | call to [] [element :a] | hash_flow.rb:241:5:241:8 | hash [element :a] | provenance | | -| hash_flow.rb:242:15:242:25 | call to taint | hash_flow.rb:241:12:244:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:245:5:245:5 | x [element :a] | hash_flow.rb:248:10:248:10 | x [element :a] | provenance | | -| hash_flow.rb:245:9:245:12 | hash [element :a] | hash_flow.rb:245:9:247:7 | call to each_key [element :a] | provenance | | -| hash_flow.rb:245:9:247:7 | call to each_key [element :a] | hash_flow.rb:245:5:245:5 | x [element :a] | provenance | | -| hash_flow.rb:248:10:248:10 | x [element :a] | hash_flow.rb:248:10:248:14 | ...[...] | provenance | | -| hash_flow.rb:255:5:255:8 | hash [element :a] | hash_flow.rb:259:9:259:12 | hash [element :a] | provenance | | -| hash_flow.rb:255:12:258:5 | call to [] [element :a] | hash_flow.rb:255:5:255:8 | hash [element :a] | provenance | | -| hash_flow.rb:256:15:256:25 | call to taint | hash_flow.rb:255:12:258:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:259:5:259:5 | x [element :a] | hash_flow.rb:263:10:263:10 | x [element :a] | provenance | | -| hash_flow.rb:259:9:259:12 | hash [element :a] | hash_flow.rb:259:9:262:7 | call to each_pair [element :a] | provenance | | -| hash_flow.rb:259:9:259:12 | hash [element :a] | hash_flow.rb:259:33:259:37 | value | provenance | | -| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] | hash_flow.rb:259:5:259:5 | x [element :a] | provenance | | +| hash_flow.rb:234:10:234:10 | x : Hash [element :a] | hash_flow.rb:234:10:234:14 | ...[...] | provenance | | +| hash_flow.rb:241:5:241:8 | hash : Hash [element :a] | hash_flow.rb:245:9:245:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:241:12:244:5 | call to [] : Hash [element :a] | hash_flow.rb:241:5:241:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:242:15:242:25 | call to taint | hash_flow.rb:241:12:244:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:245:5:245:5 | x : Hash [element :a] | hash_flow.rb:248:10:248:10 | x : Hash [element :a] | provenance | | +| hash_flow.rb:245:9:245:12 | hash : Hash [element :a] | hash_flow.rb:245:9:247:7 | call to each_key : Hash [element :a] | provenance | | +| hash_flow.rb:245:9:247:7 | call to each_key : Hash [element :a] | hash_flow.rb:245:5:245:5 | x : Hash [element :a] | provenance | | +| hash_flow.rb:248:10:248:10 | x : Hash [element :a] | hash_flow.rb:248:10:248:14 | ...[...] | provenance | | +| hash_flow.rb:255:5:255:8 | hash : Hash [element :a] | hash_flow.rb:259:9:259:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:255:12:258:5 | call to [] : Hash [element :a] | hash_flow.rb:255:5:255:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:256:15:256:25 | call to taint | hash_flow.rb:255:12:258:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:259:5:259:5 | x : Hash [element :a] | hash_flow.rb:263:10:263:10 | x : Hash [element :a] | provenance | | +| hash_flow.rb:259:9:259:12 | hash : Hash [element :a] | hash_flow.rb:259:9:262:7 | call to each_pair : Hash [element :a] | provenance | | +| hash_flow.rb:259:9:259:12 | hash : Hash [element :a] | hash_flow.rb:259:33:259:37 | value | provenance | | +| hash_flow.rb:259:9:262:7 | call to each_pair : Hash [element :a] | hash_flow.rb:259:5:259:5 | x : Hash [element :a] | provenance | | | hash_flow.rb:259:33:259:37 | value | hash_flow.rb:261:14:261:18 | value | provenance | | -| hash_flow.rb:263:10:263:10 | x [element :a] | hash_flow.rb:263:10:263:14 | ...[...] | provenance | | -| hash_flow.rb:270:5:270:8 | hash [element :a] | hash_flow.rb:274:9:274:12 | hash [element :a] | provenance | | -| hash_flow.rb:270:12:273:5 | call to [] [element :a] | hash_flow.rb:270:5:270:8 | hash [element :a] | provenance | | -| hash_flow.rb:271:15:271:25 | call to taint | hash_flow.rb:270:12:273:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:274:5:274:5 | x [element :a] | hash_flow.rb:277:10:277:10 | x [element :a] | provenance | | -| hash_flow.rb:274:9:274:12 | hash [element :a] | hash_flow.rb:274:9:276:7 | call to each_value [element :a] | provenance | | -| hash_flow.rb:274:9:274:12 | hash [element :a] | hash_flow.rb:274:29:274:33 | value | provenance | | -| hash_flow.rb:274:9:276:7 | call to each_value [element :a] | hash_flow.rb:274:5:274:5 | x [element :a] | provenance | | +| hash_flow.rb:263:10:263:10 | x : Hash [element :a] | hash_flow.rb:263:10:263:14 | ...[...] | provenance | | +| hash_flow.rb:270:5:270:8 | hash : Hash [element :a] | hash_flow.rb:274:9:274:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:270:12:273:5 | call to [] : Hash [element :a] | hash_flow.rb:270:5:270:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:271:15:271:25 | call to taint | hash_flow.rb:270:12:273:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:274:5:274:5 | x : Hash [element :a] | hash_flow.rb:277:10:277:10 | x : Hash [element :a] | provenance | | +| hash_flow.rb:274:9:274:12 | hash : Hash [element :a] | hash_flow.rb:274:9:276:7 | call to each_value : Hash [element :a] | provenance | | +| hash_flow.rb:274:9:274:12 | hash : Hash [element :a] | hash_flow.rb:274:29:274:33 | value | provenance | | +| hash_flow.rb:274:9:276:7 | call to each_value : Hash [element :a] | hash_flow.rb:274:5:274:5 | x : Hash [element :a] | provenance | | | hash_flow.rb:274:29:274:33 | value | hash_flow.rb:275:14:275:18 | value | provenance | | -| hash_flow.rb:277:10:277:10 | x [element :a] | hash_flow.rb:277:10:277:14 | ...[...] | provenance | | -| hash_flow.rb:284:5:284:8 | hash [element :c] | hash_flow.rb:290:9:290:12 | hash [element :c] | provenance | | -| hash_flow.rb:284:12:289:5 | call to [] [element :c] | hash_flow.rb:284:5:284:8 | hash [element :c] | provenance | | -| hash_flow.rb:287:15:287:25 | call to taint | hash_flow.rb:284:12:289:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:290:5:290:5 | x [element :c] | hash_flow.rb:293:10:293:10 | x [element :c] | provenance | | -| hash_flow.rb:290:9:290:12 | hash [element :c] | hash_flow.rb:290:9:290:28 | call to except [element :c] | provenance | | -| hash_flow.rb:290:9:290:28 | call to except [element :c] | hash_flow.rb:290:5:290:5 | x [element :c] | provenance | | -| hash_flow.rb:293:10:293:10 | x [element :c] | hash_flow.rb:293:10:293:14 | ...[...] | provenance | | -| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:305:9:305:12 | hash [element :a] | provenance | | -| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:309:9:309:12 | hash [element :a] | provenance | | -| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:311:9:311:12 | hash [element :a] | provenance | | -| hash_flow.rb:300:5:300:8 | hash [element :a] | hash_flow.rb:315:9:315:12 | hash [element :a] | provenance | | -| hash_flow.rb:300:5:300:8 | hash [element :c] | hash_flow.rb:305:9:305:12 | hash [element :c] | provenance | | -| hash_flow.rb:300:5:300:8 | hash [element :c] | hash_flow.rb:315:9:315:12 | hash [element :c] | provenance | | -| hash_flow.rb:300:12:304:5 | call to [] [element :a] | hash_flow.rb:300:5:300:8 | hash [element :a] | provenance | | -| hash_flow.rb:300:12:304:5 | call to [] [element :c] | hash_flow.rb:300:5:300:8 | hash [element :c] | provenance | | -| hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:300:12:304:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:303:15:303:25 | call to taint | hash_flow.rb:300:12:304:5 | call to [] [element :c] | provenance | | +| hash_flow.rb:277:10:277:10 | x : Hash [element :a] | hash_flow.rb:277:10:277:14 | ...[...] | provenance | | +| hash_flow.rb:284:5:284:8 | hash : Hash [element :c] | hash_flow.rb:290:9:290:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:284:12:289:5 | call to [] : Hash [element :c] | hash_flow.rb:284:5:284:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:287:15:287:25 | call to taint | hash_flow.rb:284:12:289:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:290:5:290:5 | x : Hash [element :c] | hash_flow.rb:293:10:293:10 | x : Hash [element :c] | provenance | | +| hash_flow.rb:290:9:290:12 | hash : Hash [element :c] | hash_flow.rb:290:9:290:28 | call to except : Hash [element :c] | provenance | | +| hash_flow.rb:290:9:290:28 | call to except : Hash [element :c] | hash_flow.rb:290:5:290:5 | x : Hash [element :c] | provenance | | +| hash_flow.rb:293:10:293:10 | x : Hash [element :c] | hash_flow.rb:293:10:293:14 | ...[...] | provenance | | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :a] | hash_flow.rb:305:9:305:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :a] | hash_flow.rb:309:9:309:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :a] | hash_flow.rb:311:9:311:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :a] | hash_flow.rb:315:9:315:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :c] | hash_flow.rb:305:9:305:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :c] | hash_flow.rb:315:9:315:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:300:12:304:5 | call to [] : Hash [element :a] | hash_flow.rb:300:5:300:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:300:12:304:5 | call to [] : Hash [element :c] | hash_flow.rb:300:5:300:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:301:15:301:25 | call to taint | hash_flow.rb:300:12:304:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:303:15:303:25 | call to taint | hash_flow.rb:300:12:304:5 | call to [] : Hash [element :c] | provenance | | | hash_flow.rb:305:5:305:5 | b | hash_flow.rb:308:10:308:10 | b | provenance | | -| hash_flow.rb:305:9:305:12 | hash [element :a] | hash_flow.rb:305:9:307:7 | call to fetch | provenance | | -| hash_flow.rb:305:9:305:12 | hash [element :c] | hash_flow.rb:305:9:307:7 | call to fetch | provenance | | +| hash_flow.rb:305:9:305:12 | hash : Hash [element :a] | hash_flow.rb:305:9:307:7 | call to fetch | provenance | | +| hash_flow.rb:305:9:305:12 | hash : Hash [element :c] | hash_flow.rb:305:9:307:7 | call to fetch | provenance | | | hash_flow.rb:305:9:307:7 | call to fetch | hash_flow.rb:305:5:305:5 | b | provenance | | | hash_flow.rb:305:20:305:30 | call to taint | hash_flow.rb:305:37:305:37 | x | provenance | | | hash_flow.rb:305:37:305:37 | x | hash_flow.rb:306:14:306:14 | x | provenance | | | hash_flow.rb:309:5:309:5 | b | hash_flow.rb:310:10:310:10 | b | provenance | | -| hash_flow.rb:309:9:309:12 | hash [element :a] | hash_flow.rb:309:9:309:22 | call to fetch | provenance | | +| hash_flow.rb:309:9:309:12 | hash : Hash [element :a] | hash_flow.rb:309:9:309:22 | call to fetch | provenance | | | hash_flow.rb:309:9:309:22 | call to fetch | hash_flow.rb:309:5:309:5 | b | provenance | | | hash_flow.rb:311:5:311:5 | b | hash_flow.rb:312:10:312:10 | b | provenance | | -| hash_flow.rb:311:9:311:12 | hash [element :a] | hash_flow.rb:311:9:311:35 | call to fetch | provenance | | +| hash_flow.rb:311:9:311:12 | hash : Hash [element :a] | hash_flow.rb:311:9:311:35 | call to fetch | provenance | | | hash_flow.rb:311:9:311:35 | call to fetch | hash_flow.rb:311:5:311:5 | b | provenance | | | hash_flow.rb:311:24:311:34 | call to taint | hash_flow.rb:311:9:311:35 | call to fetch | provenance | | | hash_flow.rb:313:5:313:5 | b | hash_flow.rb:314:10:314:10 | b | provenance | | | hash_flow.rb:313:9:313:35 | call to fetch | hash_flow.rb:313:5:313:5 | b | provenance | | | hash_flow.rb:313:24:313:34 | call to taint | hash_flow.rb:313:9:313:35 | call to fetch | provenance | | | hash_flow.rb:315:5:315:5 | b | hash_flow.rb:316:10:316:10 | b | provenance | | -| hash_flow.rb:315:9:315:12 | hash [element :a] | hash_flow.rb:315:9:315:34 | call to fetch | provenance | | -| hash_flow.rb:315:9:315:12 | hash [element :c] | hash_flow.rb:315:9:315:34 | call to fetch | provenance | | +| hash_flow.rb:315:9:315:12 | hash : Hash [element :a] | hash_flow.rb:315:9:315:34 | call to fetch | provenance | | +| hash_flow.rb:315:9:315:12 | hash : Hash [element :c] | hash_flow.rb:315:9:315:34 | call to fetch | provenance | | | hash_flow.rb:315:9:315:34 | call to fetch | hash_flow.rb:315:5:315:5 | b | provenance | | | hash_flow.rb:315:23:315:33 | call to taint | hash_flow.rb:315:9:315:34 | call to fetch | provenance | | -| hash_flow.rb:322:5:322:8 | hash [element :a] | hash_flow.rb:327:9:327:12 | hash [element :a] | provenance | | -| hash_flow.rb:322:5:322:8 | hash [element :a] | hash_flow.rb:332:9:332:12 | hash [element :a] | provenance | | -| hash_flow.rb:322:5:322:8 | hash [element :a] | hash_flow.rb:334:9:334:12 | hash [element :a] | provenance | | -| hash_flow.rb:322:5:322:8 | hash [element :c] | hash_flow.rb:327:9:327:12 | hash [element :c] | provenance | | -| hash_flow.rb:322:5:322:8 | hash [element :c] | hash_flow.rb:334:9:334:12 | hash [element :c] | provenance | | -| hash_flow.rb:322:12:326:5 | call to [] [element :a] | hash_flow.rb:322:5:322:8 | hash [element :a] | provenance | | -| hash_flow.rb:322:12:326:5 | call to [] [element :c] | hash_flow.rb:322:5:322:8 | hash [element :c] | provenance | | -| hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:322:12:326:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:325:15:325:25 | call to taint | hash_flow.rb:322:12:326:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:327:5:327:5 | b [element] | hash_flow.rb:331:10:331:10 | b [element] | provenance | | -| hash_flow.rb:327:9:327:12 | hash [element :a] | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | provenance | | -| hash_flow.rb:327:9:327:12 | hash [element :c] | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | provenance | | -| hash_flow.rb:327:9:330:7 | call to fetch_values [element] | hash_flow.rb:327:5:327:5 | b [element] | provenance | | +| hash_flow.rb:322:5:322:8 | hash : Hash [element :a] | hash_flow.rb:327:9:327:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:322:5:322:8 | hash : Hash [element :a] | hash_flow.rb:332:9:332:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:322:5:322:8 | hash : Hash [element :a] | hash_flow.rb:334:9:334:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:322:5:322:8 | hash : Hash [element :c] | hash_flow.rb:327:9:327:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:322:5:322:8 | hash : Hash [element :c] | hash_flow.rb:334:9:334:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:322:12:326:5 | call to [] : Hash [element :a] | hash_flow.rb:322:5:322:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:322:12:326:5 | call to [] : Hash [element :c] | hash_flow.rb:322:5:322:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:323:15:323:25 | call to taint | hash_flow.rb:322:12:326:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:325:15:325:25 | call to taint | hash_flow.rb:322:12:326:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:327:5:327:5 | b : [collection] [element] | hash_flow.rb:331:10:331:10 | b : [collection] [element] | provenance | | +| hash_flow.rb:327:9:327:12 | hash : Hash [element :a] | hash_flow.rb:327:9:330:7 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:327:9:327:12 | hash : Hash [element :c] | hash_flow.rb:327:9:330:7 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:327:9:330:7 | call to fetch_values : [collection] [element] | hash_flow.rb:327:5:327:5 | b : [collection] [element] | provenance | | | hash_flow.rb:327:27:327:37 | call to taint | hash_flow.rb:327:44:327:44 | x | provenance | | | hash_flow.rb:327:44:327:44 | x | hash_flow.rb:328:14:328:14 | x | provenance | | -| hash_flow.rb:329:9:329:19 | call to taint | hash_flow.rb:327:9:330:7 | call to fetch_values [element] | provenance | | -| hash_flow.rb:331:10:331:10 | b [element] | hash_flow.rb:331:10:331:13 | ...[...] | provenance | | -| hash_flow.rb:332:5:332:5 | b [element] | hash_flow.rb:333:10:333:10 | b [element] | provenance | | -| hash_flow.rb:332:9:332:12 | hash [element :a] | hash_flow.rb:332:9:332:29 | call to fetch_values [element] | provenance | | -| hash_flow.rb:332:9:332:29 | call to fetch_values [element] | hash_flow.rb:332:5:332:5 | b [element] | provenance | | -| hash_flow.rb:333:10:333:10 | b [element] | hash_flow.rb:333:10:333:13 | ...[...] | provenance | | -| hash_flow.rb:334:5:334:5 | b [element] | hash_flow.rb:335:10:335:10 | b [element] | provenance | | -| hash_flow.rb:334:9:334:12 | hash [element :a] | hash_flow.rb:334:9:334:31 | call to fetch_values [element] | provenance | | -| hash_flow.rb:334:9:334:12 | hash [element :c] | hash_flow.rb:334:9:334:31 | call to fetch_values [element] | provenance | | -| hash_flow.rb:334:9:334:31 | call to fetch_values [element] | hash_flow.rb:334:5:334:5 | b [element] | provenance | | -| hash_flow.rb:335:10:335:10 | b [element] | hash_flow.rb:335:10:335:13 | ...[...] | provenance | | -| hash_flow.rb:341:5:341:8 | hash [element :a] | hash_flow.rb:346:9:346:12 | hash [element :a] | provenance | | -| hash_flow.rb:341:5:341:8 | hash [element :c] | hash_flow.rb:346:9:346:12 | hash [element :c] | provenance | | -| hash_flow.rb:341:12:345:5 | call to [] [element :a] | hash_flow.rb:341:5:341:8 | hash [element :a] | provenance | | -| hash_flow.rb:341:12:345:5 | call to [] [element :c] | hash_flow.rb:341:5:341:8 | hash [element :c] | provenance | | -| hash_flow.rb:342:15:342:25 | call to taint | hash_flow.rb:341:12:345:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:344:15:344:25 | call to taint | hash_flow.rb:341:12:345:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:346:5:346:5 | b [element :a] | hash_flow.rb:351:11:351:11 | b [element :a] | provenance | | -| hash_flow.rb:346:9:346:12 | hash [element :a] | hash_flow.rb:346:9:350:7 | call to filter [element :a] | provenance | | -| hash_flow.rb:346:9:346:12 | hash [element :a] | hash_flow.rb:346:30:346:34 | value | provenance | | -| hash_flow.rb:346:9:346:12 | hash [element :c] | hash_flow.rb:346:30:346:34 | value | provenance | | -| hash_flow.rb:346:9:350:7 | call to filter [element :a] | hash_flow.rb:346:5:346:5 | b [element :a] | provenance | | +| hash_flow.rb:329:9:329:19 | call to taint | hash_flow.rb:327:9:330:7 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:331:10:331:10 | b : [collection] [element] | hash_flow.rb:331:10:331:13 | ...[...] | provenance | | +| hash_flow.rb:332:5:332:5 | b : [collection] [element] | hash_flow.rb:333:10:333:10 | b : [collection] [element] | provenance | | +| hash_flow.rb:332:9:332:12 | hash : Hash [element :a] | hash_flow.rb:332:9:332:29 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:332:9:332:29 | call to fetch_values : [collection] [element] | hash_flow.rb:332:5:332:5 | b : [collection] [element] | provenance | | +| hash_flow.rb:333:10:333:10 | b : [collection] [element] | hash_flow.rb:333:10:333:13 | ...[...] | provenance | | +| hash_flow.rb:334:5:334:5 | b : [collection] [element] | hash_flow.rb:335:10:335:10 | b : [collection] [element] | provenance | | +| hash_flow.rb:334:9:334:12 | hash : Hash [element :a] | hash_flow.rb:334:9:334:31 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:334:9:334:12 | hash : Hash [element :c] | hash_flow.rb:334:9:334:31 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:334:9:334:31 | call to fetch_values : [collection] [element] | hash_flow.rb:334:5:334:5 | b : [collection] [element] | provenance | | +| hash_flow.rb:335:10:335:10 | b : [collection] [element] | hash_flow.rb:335:10:335:13 | ...[...] | provenance | | +| hash_flow.rb:341:5:341:8 | hash : Hash [element :a] | hash_flow.rb:346:9:346:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:341:5:341:8 | hash : Hash [element :c] | hash_flow.rb:346:9:346:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:341:12:345:5 | call to [] : Hash [element :a] | hash_flow.rb:341:5:341:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:341:12:345:5 | call to [] : Hash [element :c] | hash_flow.rb:341:5:341:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:342:15:342:25 | call to taint | hash_flow.rb:341:12:345:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:344:15:344:25 | call to taint | hash_flow.rb:341:12:345:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:346:5:346:5 | b : Hash [element :a] | hash_flow.rb:351:11:351:11 | b : Hash [element :a] | provenance | | +| hash_flow.rb:346:9:346:12 | hash : Hash [element :a] | hash_flow.rb:346:9:350:7 | call to filter : Hash [element :a] | provenance | | +| hash_flow.rb:346:9:346:12 | hash : Hash [element :a] | hash_flow.rb:346:30:346:34 | value | provenance | | +| hash_flow.rb:346:9:346:12 | hash : Hash [element :c] | hash_flow.rb:346:30:346:34 | value | provenance | | +| hash_flow.rb:346:9:350:7 | call to filter : Hash [element :a] | hash_flow.rb:346:5:346:5 | b : Hash [element :a] | provenance | | | hash_flow.rb:346:30:346:34 | value | hash_flow.rb:348:14:348:18 | value | provenance | | -| hash_flow.rb:351:11:351:11 | b [element :a] | hash_flow.rb:351:11:351:15 | ...[...] | provenance | | +| hash_flow.rb:351:11:351:11 | b : Hash [element :a] | hash_flow.rb:351:11:351:15 | ...[...] | provenance | | | hash_flow.rb:351:11:351:15 | ...[...] | hash_flow.rb:351:10:351:16 | ( ... ) | provenance | | -| hash_flow.rb:357:5:357:8 | hash [element :a] | hash_flow.rb:362:5:362:8 | hash [element :a] | provenance | | -| hash_flow.rb:357:5:357:8 | hash [element :c] | hash_flow.rb:362:5:362:8 | hash [element :c] | provenance | | -| hash_flow.rb:357:12:361:5 | call to [] [element :a] | hash_flow.rb:357:5:357:8 | hash [element :a] | provenance | | -| hash_flow.rb:357:12:361:5 | call to [] [element :c] | hash_flow.rb:357:5:357:8 | hash [element :c] | provenance | | -| hash_flow.rb:358:15:358:25 | call to taint | hash_flow.rb:357:12:361:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:360:15:360:25 | call to taint | hash_flow.rb:357:12:361:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:362:5:362:8 | [post] hash [element :a] | hash_flow.rb:367:11:367:14 | hash [element :a] | provenance | | -| hash_flow.rb:362:5:362:8 | hash [element :a] | hash_flow.rb:362:5:362:8 | [post] hash [element :a] | provenance | | -| hash_flow.rb:362:5:362:8 | hash [element :a] | hash_flow.rb:362:27:362:31 | value | provenance | | -| hash_flow.rb:362:5:362:8 | hash [element :c] | hash_flow.rb:362:27:362:31 | value | provenance | | +| hash_flow.rb:357:5:357:8 | hash : Hash [element :a] | hash_flow.rb:362:5:362:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:357:5:357:8 | hash : Hash [element :c] | hash_flow.rb:362:5:362:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:357:12:361:5 | call to [] : Hash [element :a] | hash_flow.rb:357:5:357:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:357:12:361:5 | call to [] : Hash [element :c] | hash_flow.rb:357:5:357:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:358:15:358:25 | call to taint | hash_flow.rb:357:12:361:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:360:15:360:25 | call to taint | hash_flow.rb:357:12:361:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:362:5:362:8 | [post] hash : Hash [element :a] | hash_flow.rb:367:11:367:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:362:5:362:8 | hash : Hash [element :a] | hash_flow.rb:362:5:362:8 | [post] hash : Hash [element :a] | provenance | | +| hash_flow.rb:362:5:362:8 | hash : Hash [element :a] | hash_flow.rb:362:27:362:31 | value | provenance | | +| hash_flow.rb:362:5:362:8 | hash : Hash [element :c] | hash_flow.rb:362:27:362:31 | value | provenance | | | hash_flow.rb:362:27:362:31 | value | hash_flow.rb:364:14:364:18 | value | provenance | | -| hash_flow.rb:367:11:367:14 | hash [element :a] | hash_flow.rb:367:11:367:18 | ...[...] | provenance | | +| hash_flow.rb:367:11:367:14 | hash : Hash [element :a] | hash_flow.rb:367:11:367:18 | ...[...] | provenance | | | hash_flow.rb:367:11:367:18 | ...[...] | hash_flow.rb:367:10:367:19 | ( ... ) | provenance | | -| hash_flow.rb:373:5:373:8 | hash [element :a] | hash_flow.rb:378:9:378:12 | hash [element :a] | provenance | | -| hash_flow.rb:373:5:373:8 | hash [element :c] | hash_flow.rb:378:9:378:12 | hash [element :c] | provenance | | -| hash_flow.rb:373:12:377:5 | call to [] [element :a] | hash_flow.rb:373:5:373:8 | hash [element :a] | provenance | | -| hash_flow.rb:373:12:377:5 | call to [] [element :c] | hash_flow.rb:373:5:373:8 | hash [element :c] | provenance | | -| hash_flow.rb:374:15:374:25 | call to taint | hash_flow.rb:373:12:377:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:376:15:376:25 | call to taint | hash_flow.rb:373:12:377:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:378:5:378:5 | b [element] | hash_flow.rb:379:11:379:11 | b [element] | provenance | | -| hash_flow.rb:378:9:378:12 | hash [element :a] | hash_flow.rb:378:9:378:20 | call to flatten [element] | provenance | | -| hash_flow.rb:378:9:378:12 | hash [element :c] | hash_flow.rb:378:9:378:20 | call to flatten [element] | provenance | | -| hash_flow.rb:378:9:378:20 | call to flatten [element] | hash_flow.rb:378:5:378:5 | b [element] | provenance | | -| hash_flow.rb:379:11:379:11 | b [element] | hash_flow.rb:379:11:379:14 | ...[...] | provenance | | -| hash_flow.rb:379:11:379:14 | ...[...] | hash_flow.rb:379:10:379:15 | ( ... ) | provenance | | -| hash_flow.rb:385:5:385:8 | hash [element :a] | hash_flow.rb:390:9:390:12 | hash [element :a] | provenance | | -| hash_flow.rb:385:5:385:8 | hash [element :c] | hash_flow.rb:390:9:390:12 | hash [element :c] | provenance | | -| hash_flow.rb:385:12:389:5 | call to [] [element :a] | hash_flow.rb:385:5:385:8 | hash [element :a] | provenance | | -| hash_flow.rb:385:12:389:5 | call to [] [element :c] | hash_flow.rb:385:5:385:8 | hash [element :c] | provenance | | -| hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:385:12:389:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:388:15:388:25 | call to taint | hash_flow.rb:385:12:389:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:390:5:390:5 | b [element :a] | hash_flow.rb:396:11:396:11 | b [element :a] | provenance | | -| hash_flow.rb:390:9:390:12 | [post] hash [element :a] | hash_flow.rb:395:11:395:14 | hash [element :a] | provenance | | -| hash_flow.rb:390:9:390:12 | hash [element :a] | hash_flow.rb:390:9:390:12 | [post] hash [element :a] | provenance | | -| hash_flow.rb:390:9:390:12 | hash [element :a] | hash_flow.rb:390:9:394:7 | call to keep_if [element :a] | provenance | | -| hash_flow.rb:390:9:390:12 | hash [element :a] | hash_flow.rb:390:31:390:35 | value | provenance | | -| hash_flow.rb:390:9:390:12 | hash [element :c] | hash_flow.rb:390:31:390:35 | value | provenance | | -| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] | hash_flow.rb:390:5:390:5 | b [element :a] | provenance | | +| hash_flow.rb:373:5:373:8 | hash : Hash [element :a] | hash_flow.rb:378:9:378:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:373:5:373:8 | hash : Hash [element :c] | hash_flow.rb:378:9:378:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:373:12:377:5 | call to [] : Hash [element :a] | hash_flow.rb:373:5:373:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:373:12:377:5 | call to [] : Hash [element :c] | hash_flow.rb:373:5:373:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:374:15:374:25 | call to taint | hash_flow.rb:373:12:377:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:376:15:376:25 | call to taint | hash_flow.rb:373:12:377:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:378:5:378:5 | b : [collection] [element] : [collection] | hash_flow.rb:379:11:379:11 | b : [collection] [element] : [collection] | provenance | | +| hash_flow.rb:378:9:378:12 | hash : Hash [element :a] | hash_flow.rb:378:9:378:20 | call to flatten : [collection] [element] : [collection] | provenance | | +| hash_flow.rb:378:9:378:12 | hash : Hash [element :c] | hash_flow.rb:378:9:378:20 | call to flatten : [collection] [element] : [collection] | provenance | | +| hash_flow.rb:378:9:378:20 | call to flatten : [collection] [element] : [collection] | hash_flow.rb:378:5:378:5 | b : [collection] [element] : [collection] | provenance | | +| hash_flow.rb:379:11:379:11 | b : [collection] [element] : [collection] | hash_flow.rb:379:11:379:14 | ...[...] : [collection] | provenance | | +| hash_flow.rb:379:11:379:14 | ...[...] : [collection] | hash_flow.rb:379:10:379:15 | ( ... ) | provenance | | +| hash_flow.rb:385:5:385:8 | hash : Hash [element :a] | hash_flow.rb:390:9:390:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:385:5:385:8 | hash : Hash [element :c] | hash_flow.rb:390:9:390:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:385:12:389:5 | call to [] : Hash [element :a] | hash_flow.rb:385:5:385:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:385:12:389:5 | call to [] : Hash [element :c] | hash_flow.rb:385:5:385:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:386:15:386:25 | call to taint | hash_flow.rb:385:12:389:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:388:15:388:25 | call to taint | hash_flow.rb:385:12:389:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:390:5:390:5 | b : Hash [element :a] | hash_flow.rb:396:11:396:11 | b : Hash [element :a] | provenance | | +| hash_flow.rb:390:9:390:12 | [post] hash : Hash [element :a] | hash_flow.rb:395:11:395:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:390:9:390:12 | hash : Hash [element :a] | hash_flow.rb:390:9:390:12 | [post] hash : Hash [element :a] | provenance | | +| hash_flow.rb:390:9:390:12 | hash : Hash [element :a] | hash_flow.rb:390:9:394:7 | call to keep_if : Hash [element :a] | provenance | | +| hash_flow.rb:390:9:390:12 | hash : Hash [element :a] | hash_flow.rb:390:31:390:35 | value | provenance | | +| hash_flow.rb:390:9:390:12 | hash : Hash [element :c] | hash_flow.rb:390:31:390:35 | value | provenance | | +| hash_flow.rb:390:9:394:7 | call to keep_if : Hash [element :a] | hash_flow.rb:390:5:390:5 | b : Hash [element :a] | provenance | | | hash_flow.rb:390:31:390:35 | value | hash_flow.rb:392:14:392:18 | value | provenance | | -| hash_flow.rb:395:11:395:14 | hash [element :a] | hash_flow.rb:395:11:395:18 | ...[...] | provenance | | +| hash_flow.rb:395:11:395:14 | hash : Hash [element :a] | hash_flow.rb:395:11:395:18 | ...[...] | provenance | | | hash_flow.rb:395:11:395:18 | ...[...] | hash_flow.rb:395:10:395:19 | ( ... ) | provenance | | -| hash_flow.rb:396:11:396:11 | b [element :a] | hash_flow.rb:396:11:396:15 | ...[...] | provenance | | +| hash_flow.rb:396:11:396:11 | b : Hash [element :a] | hash_flow.rb:396:11:396:15 | ...[...] | provenance | | | hash_flow.rb:396:11:396:15 | ...[...] | hash_flow.rb:396:10:396:16 | ( ... ) | provenance | | -| hash_flow.rb:402:5:402:9 | hash1 [element :a] | hash_flow.rb:412:12:412:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:402:5:402:9 | hash1 [element :c] | hash_flow.rb:412:12:412:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:402:13:406:5 | call to [] [element :a] | hash_flow.rb:402:5:402:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:402:13:406:5 | call to [] [element :c] | hash_flow.rb:402:5:402:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:402:13:406:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:402:13:406:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:407:5:407:9 | hash2 [element :d] | hash_flow.rb:412:24:412:28 | hash2 [element :d] | provenance | | -| hash_flow.rb:407:5:407:9 | hash2 [element :f] | hash_flow.rb:412:24:412:28 | hash2 [element :f] | provenance | | -| hash_flow.rb:407:13:411:5 | call to [] [element :d] | hash_flow.rb:407:5:407:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:407:13:411:5 | call to [] [element :f] | hash_flow.rb:407:5:407:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:407:13:411:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:407:13:411:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:412:5:412:8 | hash [element :a] | hash_flow.rb:417:11:417:14 | hash [element :a] | provenance | | -| hash_flow.rb:412:5:412:8 | hash [element :c] | hash_flow.rb:419:11:419:14 | hash [element :c] | provenance | | -| hash_flow.rb:412:5:412:8 | hash [element :d] | hash_flow.rb:420:11:420:14 | hash [element :d] | provenance | | -| hash_flow.rb:412:5:412:8 | hash [element :f] | hash_flow.rb:422:11:422:14 | hash [element :f] | provenance | | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] | hash_flow.rb:412:12:416:7 | call to merge [element :a] | provenance | | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] | hash_flow.rb:412:40:412:48 | old_value | provenance | | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] | hash_flow.rb:412:51:412:59 | new_value | provenance | | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] | hash_flow.rb:412:12:416:7 | call to merge [element :c] | provenance | | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] | hash_flow.rb:412:40:412:48 | old_value | provenance | | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] | hash_flow.rb:412:51:412:59 | new_value | provenance | | -| hash_flow.rb:412:12:416:7 | call to merge [element :a] | hash_flow.rb:412:5:412:8 | hash [element :a] | provenance | | -| hash_flow.rb:412:12:416:7 | call to merge [element :c] | hash_flow.rb:412:5:412:8 | hash [element :c] | provenance | | -| hash_flow.rb:412:12:416:7 | call to merge [element :d] | hash_flow.rb:412:5:412:8 | hash [element :d] | provenance | | -| hash_flow.rb:412:12:416:7 | call to merge [element :f] | hash_flow.rb:412:5:412:8 | hash [element :f] | provenance | | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] | hash_flow.rb:412:12:416:7 | call to merge [element :d] | provenance | | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] | hash_flow.rb:412:40:412:48 | old_value | provenance | | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] | hash_flow.rb:412:51:412:59 | new_value | provenance | | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] | hash_flow.rb:412:12:416:7 | call to merge [element :f] | provenance | | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] | hash_flow.rb:412:40:412:48 | old_value | provenance | | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] | hash_flow.rb:412:51:412:59 | new_value | provenance | | +| hash_flow.rb:402:5:402:9 | hash1 : Hash [element :a] | hash_flow.rb:412:12:412:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:402:5:402:9 | hash1 : Hash [element :c] | hash_flow.rb:412:12:412:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:402:13:406:5 | call to [] : Hash [element :a] | hash_flow.rb:402:5:402:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:402:13:406:5 | call to [] : Hash [element :c] | hash_flow.rb:402:5:402:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:403:15:403:25 | call to taint | hash_flow.rb:402:13:406:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:405:15:405:25 | call to taint | hash_flow.rb:402:13:406:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:407:5:407:9 | hash2 : Hash [element :d] | hash_flow.rb:412:24:412:28 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:407:5:407:9 | hash2 : Hash [element :f] | hash_flow.rb:412:24:412:28 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:407:13:411:5 | call to [] : Hash [element :d] | hash_flow.rb:407:5:407:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:407:13:411:5 | call to [] : Hash [element :f] | hash_flow.rb:407:5:407:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:408:15:408:25 | call to taint | hash_flow.rb:407:13:411:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:410:15:410:25 | call to taint | hash_flow.rb:407:13:411:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :a] | hash_flow.rb:417:11:417:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :c] | hash_flow.rb:419:11:419:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :d] | hash_flow.rb:420:11:420:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :f] | hash_flow.rb:422:11:422:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :a] | hash_flow.rb:412:12:416:7 | call to merge : Hash [element :a] | provenance | | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :a] | hash_flow.rb:412:40:412:48 | old_value | provenance | | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :a] | hash_flow.rb:412:51:412:59 | new_value | provenance | | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :c] | hash_flow.rb:412:12:416:7 | call to merge : Hash [element :c] | provenance | | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :c] | hash_flow.rb:412:40:412:48 | old_value | provenance | | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :c] | hash_flow.rb:412:51:412:59 | new_value | provenance | | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :a] | hash_flow.rb:412:5:412:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :c] | hash_flow.rb:412:5:412:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :d] | hash_flow.rb:412:5:412:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :f] | hash_flow.rb:412:5:412:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :d] | hash_flow.rb:412:12:416:7 | call to merge : Hash [element :d] | provenance | | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :d] | hash_flow.rb:412:40:412:48 | old_value | provenance | | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :d] | hash_flow.rb:412:51:412:59 | new_value | provenance | | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :f] | hash_flow.rb:412:12:416:7 | call to merge : Hash [element :f] | provenance | | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :f] | hash_flow.rb:412:40:412:48 | old_value | provenance | | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :f] | hash_flow.rb:412:51:412:59 | new_value | provenance | | | hash_flow.rb:412:40:412:48 | old_value | hash_flow.rb:414:14:414:22 | old_value | provenance | | | hash_flow.rb:412:51:412:59 | new_value | hash_flow.rb:415:14:415:22 | new_value | provenance | | -| hash_flow.rb:417:11:417:14 | hash [element :a] | hash_flow.rb:417:11:417:18 | ...[...] | provenance | | +| hash_flow.rb:417:11:417:14 | hash : Hash [element :a] | hash_flow.rb:417:11:417:18 | ...[...] | provenance | | | hash_flow.rb:417:11:417:18 | ...[...] | hash_flow.rb:417:10:417:19 | ( ... ) | provenance | | -| hash_flow.rb:419:11:419:14 | hash [element :c] | hash_flow.rb:419:11:419:18 | ...[...] | provenance | | +| hash_flow.rb:419:11:419:14 | hash : Hash [element :c] | hash_flow.rb:419:11:419:18 | ...[...] | provenance | | | hash_flow.rb:419:11:419:18 | ...[...] | hash_flow.rb:419:10:419:19 | ( ... ) | provenance | | -| hash_flow.rb:420:11:420:14 | hash [element :d] | hash_flow.rb:420:11:420:18 | ...[...] | provenance | | +| hash_flow.rb:420:11:420:14 | hash : Hash [element :d] | hash_flow.rb:420:11:420:18 | ...[...] | provenance | | | hash_flow.rb:420:11:420:18 | ...[...] | hash_flow.rb:420:10:420:19 | ( ... ) | provenance | | -| hash_flow.rb:422:11:422:14 | hash [element :f] | hash_flow.rb:422:11:422:18 | ...[...] | provenance | | +| hash_flow.rb:422:11:422:14 | hash : Hash [element :f] | hash_flow.rb:422:11:422:18 | ...[...] | provenance | | | hash_flow.rb:422:11:422:18 | ...[...] | hash_flow.rb:422:10:422:19 | ( ... ) | provenance | | -| hash_flow.rb:428:5:428:9 | hash1 [element :a] | hash_flow.rb:438:12:438:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:428:5:428:9 | hash1 [element :c] | hash_flow.rb:438:12:438:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:428:13:432:5 | call to [] [element :a] | hash_flow.rb:428:5:428:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:428:13:432:5 | call to [] [element :c] | hash_flow.rb:428:5:428:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:428:13:432:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:428:13:432:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:433:5:433:9 | hash2 [element :d] | hash_flow.rb:438:25:438:29 | hash2 [element :d] | provenance | | -| hash_flow.rb:433:5:433:9 | hash2 [element :f] | hash_flow.rb:438:25:438:29 | hash2 [element :f] | provenance | | -| hash_flow.rb:433:13:437:5 | call to [] [element :d] | hash_flow.rb:433:5:433:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:433:13:437:5 | call to [] [element :f] | hash_flow.rb:433:5:433:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:433:13:437:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:433:13:437:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:438:5:438:8 | hash [element :a] | hash_flow.rb:443:11:443:14 | hash [element :a] | provenance | | -| hash_flow.rb:438:5:438:8 | hash [element :c] | hash_flow.rb:445:11:445:14 | hash [element :c] | provenance | | -| hash_flow.rb:438:5:438:8 | hash [element :d] | hash_flow.rb:446:11:446:14 | hash [element :d] | provenance | | -| hash_flow.rb:438:5:438:8 | hash [element :f] | hash_flow.rb:448:11:448:14 | hash [element :f] | provenance | | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] | hash_flow.rb:450:11:450:15 | hash1 [element :a] | provenance | | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] | hash_flow.rb:452:11:452:15 | hash1 [element :c] | provenance | | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] | hash_flow.rb:453:11:453:15 | hash1 [element :d] | provenance | | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] | hash_flow.rb:455:11:455:15 | hash1 [element :f] | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:12:442:7 | call to merge! [element :a] | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:41:438:49 | old_value | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] | hash_flow.rb:438:52:438:60 | new_value | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:12:442:7 | call to merge! [element :c] | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:41:438:49 | old_value | provenance | | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] | hash_flow.rb:438:52:438:60 | new_value | provenance | | -| hash_flow.rb:438:12:442:7 | call to merge! [element :a] | hash_flow.rb:438:5:438:8 | hash [element :a] | provenance | | -| hash_flow.rb:438:12:442:7 | call to merge! [element :c] | hash_flow.rb:438:5:438:8 | hash [element :c] | provenance | | -| hash_flow.rb:438:12:442:7 | call to merge! [element :d] | hash_flow.rb:438:5:438:8 | hash [element :d] | provenance | | -| hash_flow.rb:438:12:442:7 | call to merge! [element :f] | hash_flow.rb:438:5:438:8 | hash [element :f] | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:12:442:7 | call to merge! [element :d] | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:41:438:49 | old_value | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] | hash_flow.rb:438:52:438:60 | new_value | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:12:442:7 | call to merge! [element :f] | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:41:438:49 | old_value | provenance | | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] | hash_flow.rb:438:52:438:60 | new_value | provenance | | +| hash_flow.rb:428:5:428:9 | hash1 : Hash [element :a] | hash_flow.rb:438:12:438:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:428:5:428:9 | hash1 : Hash [element :c] | hash_flow.rb:438:12:438:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:428:13:432:5 | call to [] : Hash [element :a] | hash_flow.rb:428:5:428:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:428:13:432:5 | call to [] : Hash [element :c] | hash_flow.rb:428:5:428:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:429:15:429:25 | call to taint | hash_flow.rb:428:13:432:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:431:15:431:25 | call to taint | hash_flow.rb:428:13:432:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:433:5:433:9 | hash2 : Hash [element :d] | hash_flow.rb:438:25:438:29 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:433:5:433:9 | hash2 : Hash [element :f] | hash_flow.rb:438:25:438:29 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:433:13:437:5 | call to [] : Hash [element :d] | hash_flow.rb:433:5:433:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:433:13:437:5 | call to [] : Hash [element :f] | hash_flow.rb:433:5:433:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:434:15:434:25 | call to taint | hash_flow.rb:433:13:437:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:436:15:436:25 | call to taint | hash_flow.rb:433:13:437:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :a] | hash_flow.rb:443:11:443:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :c] | hash_flow.rb:445:11:445:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :d] | hash_flow.rb:446:11:446:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :f] | hash_flow.rb:448:11:448:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :a] | hash_flow.rb:450:11:450:15 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :c] | hash_flow.rb:452:11:452:15 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :d] | hash_flow.rb:453:11:453:15 | hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :f] | hash_flow.rb:455:11:455:15 | hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :a] | hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :a] | hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :a] | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :a] | hash_flow.rb:438:41:438:49 | old_value | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :a] | hash_flow.rb:438:52:438:60 | new_value | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :c] | hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :c] | hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :c] | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :c] | hash_flow.rb:438:41:438:49 | old_value | provenance | | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :c] | hash_flow.rb:438:52:438:60 | new_value | provenance | | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :a] | hash_flow.rb:438:5:438:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :c] | hash_flow.rb:438:5:438:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :d] | hash_flow.rb:438:5:438:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :f] | hash_flow.rb:438:5:438:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :d] | hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :d] | hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :d] | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :d] | hash_flow.rb:438:41:438:49 | old_value | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :d] | hash_flow.rb:438:52:438:60 | new_value | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :f] | hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :f] | hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :f] | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :f] | hash_flow.rb:438:41:438:49 | old_value | provenance | | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :f] | hash_flow.rb:438:52:438:60 | new_value | provenance | | | hash_flow.rb:438:41:438:49 | old_value | hash_flow.rb:440:14:440:22 | old_value | provenance | | | hash_flow.rb:438:52:438:60 | new_value | hash_flow.rb:441:14:441:22 | new_value | provenance | | -| hash_flow.rb:443:11:443:14 | hash [element :a] | hash_flow.rb:443:11:443:18 | ...[...] | provenance | | +| hash_flow.rb:443:11:443:14 | hash : Hash [element :a] | hash_flow.rb:443:11:443:18 | ...[...] | provenance | | | hash_flow.rb:443:11:443:18 | ...[...] | hash_flow.rb:443:10:443:19 | ( ... ) | provenance | | -| hash_flow.rb:445:11:445:14 | hash [element :c] | hash_flow.rb:445:11:445:18 | ...[...] | provenance | | +| hash_flow.rb:445:11:445:14 | hash : Hash [element :c] | hash_flow.rb:445:11:445:18 | ...[...] | provenance | | | hash_flow.rb:445:11:445:18 | ...[...] | hash_flow.rb:445:10:445:19 | ( ... ) | provenance | | -| hash_flow.rb:446:11:446:14 | hash [element :d] | hash_flow.rb:446:11:446:18 | ...[...] | provenance | | +| hash_flow.rb:446:11:446:14 | hash : Hash [element :d] | hash_flow.rb:446:11:446:18 | ...[...] | provenance | | | hash_flow.rb:446:11:446:18 | ...[...] | hash_flow.rb:446:10:446:19 | ( ... ) | provenance | | -| hash_flow.rb:448:11:448:14 | hash [element :f] | hash_flow.rb:448:11:448:18 | ...[...] | provenance | | +| hash_flow.rb:448:11:448:14 | hash : Hash [element :f] | hash_flow.rb:448:11:448:18 | ...[...] | provenance | | | hash_flow.rb:448:11:448:18 | ...[...] | hash_flow.rb:448:10:448:19 | ( ... ) | provenance | | -| hash_flow.rb:450:11:450:15 | hash1 [element :a] | hash_flow.rb:450:11:450:19 | ...[...] | provenance | | +| hash_flow.rb:450:11:450:15 | hash1 : Hash [element :a] | hash_flow.rb:450:11:450:19 | ...[...] | provenance | | | hash_flow.rb:450:11:450:19 | ...[...] | hash_flow.rb:450:10:450:20 | ( ... ) | provenance | | -| hash_flow.rb:452:11:452:15 | hash1 [element :c] | hash_flow.rb:452:11:452:19 | ...[...] | provenance | | +| hash_flow.rb:452:11:452:15 | hash1 : Hash [element :c] | hash_flow.rb:452:11:452:19 | ...[...] | provenance | | | hash_flow.rb:452:11:452:19 | ...[...] | hash_flow.rb:452:10:452:20 | ( ... ) | provenance | | -| hash_flow.rb:453:11:453:15 | hash1 [element :d] | hash_flow.rb:453:11:453:19 | ...[...] | provenance | | +| hash_flow.rb:453:11:453:15 | hash1 : Hash [element :d] | hash_flow.rb:453:11:453:19 | ...[...] | provenance | | | hash_flow.rb:453:11:453:19 | ...[...] | hash_flow.rb:453:10:453:20 | ( ... ) | provenance | | -| hash_flow.rb:455:11:455:15 | hash1 [element :f] | hash_flow.rb:455:11:455:19 | ...[...] | provenance | | +| hash_flow.rb:455:11:455:15 | hash1 : Hash [element :f] | hash_flow.rb:455:11:455:19 | ...[...] | provenance | | | hash_flow.rb:455:11:455:19 | ...[...] | hash_flow.rb:455:10:455:20 | ( ... ) | provenance | | -| hash_flow.rb:461:5:461:8 | hash [element :a] | hash_flow.rb:465:9:465:12 | hash [element :a] | provenance | | -| hash_flow.rb:461:12:464:5 | call to [] [element :a] | hash_flow.rb:461:5:461:8 | hash [element :a] | provenance | | -| hash_flow.rb:462:15:462:25 | call to taint | hash_flow.rb:461:12:464:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:465:5:465:5 | b [element 1] | hash_flow.rb:467:10:467:10 | b [element 1] | provenance | | -| hash_flow.rb:465:9:465:12 | hash [element :a] | hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | provenance | | -| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | hash_flow.rb:465:5:465:5 | b [element 1] | provenance | | -| hash_flow.rb:467:10:467:10 | b [element 1] | hash_flow.rb:467:10:467:13 | ...[...] | provenance | | -| hash_flow.rb:473:5:473:8 | hash [element :a] | hash_flow.rb:477:9:477:12 | hash [element :a] | provenance | | -| hash_flow.rb:473:12:476:5 | call to [] [element :a] | hash_flow.rb:473:5:473:8 | hash [element :a] | provenance | | -| hash_flow.rb:474:15:474:25 | call to taint | hash_flow.rb:473:12:476:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:477:5:477:5 | b [element :a] | hash_flow.rb:482:10:482:10 | b [element :a] | provenance | | -| hash_flow.rb:477:9:477:12 | hash [element :a] | hash_flow.rb:477:9:481:7 | call to reject [element :a] | provenance | | -| hash_flow.rb:477:9:477:12 | hash [element :a] | hash_flow.rb:477:29:477:33 | value | provenance | | -| hash_flow.rb:477:9:481:7 | call to reject [element :a] | hash_flow.rb:477:5:477:5 | b [element :a] | provenance | | +| hash_flow.rb:461:5:461:8 | hash : Hash [element :a] | hash_flow.rb:465:9:465:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:461:12:464:5 | call to [] : Hash [element :a] | hash_flow.rb:461:5:461:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:462:15:462:25 | call to taint | hash_flow.rb:461:12:464:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:465:5:465:5 | b : [collection] [element 1] | hash_flow.rb:467:10:467:10 | b : [collection] [element 1] | provenance | | +| hash_flow.rb:465:9:465:12 | hash : Hash [element :a] | hash_flow.rb:465:9:465:22 | call to rassoc : [collection] [element 1] | provenance | | +| hash_flow.rb:465:9:465:22 | call to rassoc : [collection] [element 1] | hash_flow.rb:465:5:465:5 | b : [collection] [element 1] | provenance | | +| hash_flow.rb:467:10:467:10 | b : [collection] [element 1] | hash_flow.rb:467:10:467:13 | ...[...] | provenance | | +| hash_flow.rb:473:5:473:8 | hash : Hash [element :a] | hash_flow.rb:477:9:477:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:473:12:476:5 | call to [] : Hash [element :a] | hash_flow.rb:473:5:473:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:474:15:474:25 | call to taint | hash_flow.rb:473:12:476:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:477:5:477:5 | b : Hash [element :a] | hash_flow.rb:482:10:482:10 | b : Hash [element :a] | provenance | | +| hash_flow.rb:477:9:477:12 | hash : Hash [element :a] | hash_flow.rb:477:9:481:7 | call to reject : Hash [element :a] | provenance | | +| hash_flow.rb:477:9:477:12 | hash : Hash [element :a] | hash_flow.rb:477:29:477:33 | value | provenance | | +| hash_flow.rb:477:9:481:7 | call to reject : Hash [element :a] | hash_flow.rb:477:5:477:5 | b : Hash [element :a] | provenance | | | hash_flow.rb:477:29:477:33 | value | hash_flow.rb:479:14:479:18 | value | provenance | | -| hash_flow.rb:482:10:482:10 | b [element :a] | hash_flow.rb:482:10:482:14 | ...[...] | provenance | | -| hash_flow.rb:488:5:488:8 | hash [element :a] | hash_flow.rb:492:9:492:12 | hash [element :a] | provenance | | -| hash_flow.rb:488:12:491:5 | call to [] [element :a] | hash_flow.rb:488:5:488:8 | hash [element :a] | provenance | | -| hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:488:12:491:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:492:5:492:5 | b [element :a] | hash_flow.rb:497:10:497:10 | b [element :a] | provenance | | -| hash_flow.rb:492:9:492:12 | [post] hash [element :a] | hash_flow.rb:498:10:498:13 | hash [element :a] | provenance | | -| hash_flow.rb:492:9:492:12 | hash [element :a] | hash_flow.rb:492:9:492:12 | [post] hash [element :a] | provenance | | -| hash_flow.rb:492:9:492:12 | hash [element :a] | hash_flow.rb:492:9:496:7 | call to reject! [element :a] | provenance | | -| hash_flow.rb:492:9:492:12 | hash [element :a] | hash_flow.rb:492:30:492:34 | value | provenance | | -| hash_flow.rb:492:9:496:7 | call to reject! [element :a] | hash_flow.rb:492:5:492:5 | b [element :a] | provenance | | +| hash_flow.rb:482:10:482:10 | b : Hash [element :a] | hash_flow.rb:482:10:482:14 | ...[...] | provenance | | +| hash_flow.rb:488:5:488:8 | hash : Hash [element :a] | hash_flow.rb:492:9:492:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:488:12:491:5 | call to [] : Hash [element :a] | hash_flow.rb:488:5:488:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:489:15:489:25 | call to taint | hash_flow.rb:488:12:491:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:492:5:492:5 | b : Hash [element :a] | hash_flow.rb:497:10:497:10 | b : Hash [element :a] | provenance | | +| hash_flow.rb:492:9:492:12 | [post] hash : Hash [element :a] | hash_flow.rb:498:10:498:13 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:492:9:492:12 | hash : Hash [element :a] | hash_flow.rb:492:9:492:12 | [post] hash : Hash [element :a] | provenance | | +| hash_flow.rb:492:9:492:12 | hash : Hash [element :a] | hash_flow.rb:492:9:496:7 | call to reject! : Hash [element :a] | provenance | | +| hash_flow.rb:492:9:492:12 | hash : Hash [element :a] | hash_flow.rb:492:30:492:34 | value | provenance | | +| hash_flow.rb:492:9:496:7 | call to reject! : Hash [element :a] | hash_flow.rb:492:5:492:5 | b : Hash [element :a] | provenance | | | hash_flow.rb:492:30:492:34 | value | hash_flow.rb:494:14:494:18 | value | provenance | | -| hash_flow.rb:497:10:497:10 | b [element :a] | hash_flow.rb:497:10:497:14 | ...[...] | provenance | | -| hash_flow.rb:498:10:498:13 | hash [element :a] | hash_flow.rb:498:10:498:17 | ...[...] | provenance | | -| hash_flow.rb:504:5:504:8 | hash [element :a] | hash_flow.rb:512:19:512:22 | hash [element :a] | provenance | | -| hash_flow.rb:504:5:504:8 | hash [element :c] | hash_flow.rb:512:19:512:22 | hash [element :c] | provenance | | -| hash_flow.rb:504:12:508:5 | call to [] [element :a] | hash_flow.rb:504:5:504:8 | hash [element :a] | provenance | | -| hash_flow.rb:504:12:508:5 | call to [] [element :c] | hash_flow.rb:504:5:504:8 | hash [element :c] | provenance | | -| hash_flow.rb:505:15:505:25 | call to taint | hash_flow.rb:504:12:508:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:507:15:507:25 | call to taint | hash_flow.rb:504:12:508:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | hash_flow.rb:513:11:513:15 | hash2 [element :a] | provenance | | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] | hash_flow.rb:515:11:515:15 | hash2 [element :c] | provenance | | -| hash_flow.rb:512:19:512:22 | hash [element :a] | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | provenance | | -| hash_flow.rb:512:19:512:22 | hash [element :c] | hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] | provenance | | -| hash_flow.rb:513:11:513:15 | hash2 [element :a] | hash_flow.rb:513:11:513:19 | ...[...] | provenance | | +| hash_flow.rb:497:10:497:10 | b : Hash [element :a] | hash_flow.rb:497:10:497:14 | ...[...] | provenance | | +| hash_flow.rb:498:10:498:13 | hash : Hash [element :a] | hash_flow.rb:498:10:498:17 | ...[...] | provenance | | +| hash_flow.rb:504:5:504:8 | hash : Hash [element :a] | hash_flow.rb:512:19:512:22 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:504:5:504:8 | hash : Hash [element :c] | hash_flow.rb:512:19:512:22 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:504:12:508:5 | call to [] : Hash [element :a] | hash_flow.rb:504:5:504:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:504:12:508:5 | call to [] : Hash [element :c] | hash_flow.rb:504:5:504:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:505:15:505:25 | call to taint | hash_flow.rb:504:12:508:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:507:15:507:25 | call to taint | hash_flow.rb:504:12:508:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:512:5:512:9 | [post] hash2 : Hash [element :a] | hash_flow.rb:513:11:513:15 | hash2 : Hash [element :a] | provenance | | +| hash_flow.rb:512:5:512:9 | [post] hash2 : Hash [element :c] | hash_flow.rb:515:11:515:15 | hash2 : Hash [element :c] | provenance | | +| hash_flow.rb:512:19:512:22 | hash : Hash [element :a] | hash_flow.rb:512:5:512:9 | [post] hash2 : Hash [element :a] | provenance | | +| hash_flow.rb:512:19:512:22 | hash : Hash [element :c] | hash_flow.rb:512:5:512:9 | [post] hash2 : Hash [element :c] | provenance | | +| hash_flow.rb:513:11:513:15 | hash2 : Hash [element :a] | hash_flow.rb:513:11:513:19 | ...[...] | provenance | | | hash_flow.rb:513:11:513:19 | ...[...] | hash_flow.rb:513:10:513:20 | ( ... ) | provenance | | -| hash_flow.rb:515:11:515:15 | hash2 [element :c] | hash_flow.rb:515:11:515:19 | ...[...] | provenance | | +| hash_flow.rb:515:11:515:15 | hash2 : Hash [element :c] | hash_flow.rb:515:11:515:19 | ...[...] | provenance | | | hash_flow.rb:515:11:515:19 | ...[...] | hash_flow.rb:515:10:515:20 | ( ... ) | provenance | | -| hash_flow.rb:519:5:519:8 | hash [element :a] | hash_flow.rb:524:9:524:12 | hash [element :a] | provenance | | -| hash_flow.rb:519:5:519:8 | hash [element :c] | hash_flow.rb:524:9:524:12 | hash [element :c] | provenance | | -| hash_flow.rb:519:12:523:5 | call to [] [element :a] | hash_flow.rb:519:5:519:8 | hash [element :a] | provenance | | -| hash_flow.rb:519:12:523:5 | call to [] [element :c] | hash_flow.rb:519:5:519:8 | hash [element :c] | provenance | | -| hash_flow.rb:520:15:520:25 | call to taint | hash_flow.rb:519:12:523:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:522:15:522:25 | call to taint | hash_flow.rb:519:12:523:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:524:5:524:5 | b [element :a] | hash_flow.rb:529:11:529:11 | b [element :a] | provenance | | -| hash_flow.rb:524:9:524:12 | hash [element :a] | hash_flow.rb:524:9:528:7 | call to select [element :a] | provenance | | -| hash_flow.rb:524:9:524:12 | hash [element :a] | hash_flow.rb:524:30:524:34 | value | provenance | | -| hash_flow.rb:524:9:524:12 | hash [element :c] | hash_flow.rb:524:30:524:34 | value | provenance | | -| hash_flow.rb:524:9:528:7 | call to select [element :a] | hash_flow.rb:524:5:524:5 | b [element :a] | provenance | | +| hash_flow.rb:519:5:519:8 | hash : Hash [element :a] | hash_flow.rb:524:9:524:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:519:5:519:8 | hash : Hash [element :c] | hash_flow.rb:524:9:524:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:519:12:523:5 | call to [] : Hash [element :a] | hash_flow.rb:519:5:519:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:519:12:523:5 | call to [] : Hash [element :c] | hash_flow.rb:519:5:519:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:520:15:520:25 | call to taint | hash_flow.rb:519:12:523:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:522:15:522:25 | call to taint | hash_flow.rb:519:12:523:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:524:5:524:5 | b : Hash [element :a] | hash_flow.rb:529:11:529:11 | b : Hash [element :a] | provenance | | +| hash_flow.rb:524:9:524:12 | hash : Hash [element :a] | hash_flow.rb:524:9:528:7 | call to select : Hash [element :a] | provenance | | +| hash_flow.rb:524:9:524:12 | hash : Hash [element :a] | hash_flow.rb:524:30:524:34 | value | provenance | | +| hash_flow.rb:524:9:524:12 | hash : Hash [element :c] | hash_flow.rb:524:30:524:34 | value | provenance | | +| hash_flow.rb:524:9:528:7 | call to select : Hash [element :a] | hash_flow.rb:524:5:524:5 | b : Hash [element :a] | provenance | | | hash_flow.rb:524:30:524:34 | value | hash_flow.rb:526:14:526:18 | value | provenance | | -| hash_flow.rb:529:11:529:11 | b [element :a] | hash_flow.rb:529:11:529:15 | ...[...] | provenance | | +| hash_flow.rb:529:11:529:11 | b : Hash [element :a] | hash_flow.rb:529:11:529:15 | ...[...] | provenance | | | hash_flow.rb:529:11:529:15 | ...[...] | hash_flow.rb:529:10:529:16 | ( ... ) | provenance | | -| hash_flow.rb:535:5:535:8 | hash [element :a] | hash_flow.rb:540:5:540:8 | hash [element :a] | provenance | | -| hash_flow.rb:535:5:535:8 | hash [element :c] | hash_flow.rb:540:5:540:8 | hash [element :c] | provenance | | -| hash_flow.rb:535:12:539:5 | call to [] [element :a] | hash_flow.rb:535:5:535:8 | hash [element :a] | provenance | | -| hash_flow.rb:535:12:539:5 | call to [] [element :c] | hash_flow.rb:535:5:535:8 | hash [element :c] | provenance | | -| hash_flow.rb:536:15:536:25 | call to taint | hash_flow.rb:535:12:539:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:538:15:538:25 | call to taint | hash_flow.rb:535:12:539:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:540:5:540:8 | [post] hash [element :a] | hash_flow.rb:545:11:545:14 | hash [element :a] | provenance | | -| hash_flow.rb:540:5:540:8 | hash [element :a] | hash_flow.rb:540:5:540:8 | [post] hash [element :a] | provenance | | -| hash_flow.rb:540:5:540:8 | hash [element :a] | hash_flow.rb:540:27:540:31 | value | provenance | | -| hash_flow.rb:540:5:540:8 | hash [element :c] | hash_flow.rb:540:27:540:31 | value | provenance | | +| hash_flow.rb:535:5:535:8 | hash : Hash [element :a] | hash_flow.rb:540:5:540:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:535:5:535:8 | hash : Hash [element :c] | hash_flow.rb:540:5:540:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:535:12:539:5 | call to [] : Hash [element :a] | hash_flow.rb:535:5:535:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:535:12:539:5 | call to [] : Hash [element :c] | hash_flow.rb:535:5:535:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:536:15:536:25 | call to taint | hash_flow.rb:535:12:539:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:538:15:538:25 | call to taint | hash_flow.rb:535:12:539:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:540:5:540:8 | [post] hash : Hash [element :a] | hash_flow.rb:545:11:545:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:540:5:540:8 | hash : Hash [element :a] | hash_flow.rb:540:5:540:8 | [post] hash : Hash [element :a] | provenance | | +| hash_flow.rb:540:5:540:8 | hash : Hash [element :a] | hash_flow.rb:540:27:540:31 | value | provenance | | +| hash_flow.rb:540:5:540:8 | hash : Hash [element :c] | hash_flow.rb:540:27:540:31 | value | provenance | | | hash_flow.rb:540:27:540:31 | value | hash_flow.rb:542:14:542:18 | value | provenance | | -| hash_flow.rb:545:11:545:14 | hash [element :a] | hash_flow.rb:545:11:545:18 | ...[...] | provenance | | +| hash_flow.rb:545:11:545:14 | hash : Hash [element :a] | hash_flow.rb:545:11:545:18 | ...[...] | provenance | | | hash_flow.rb:545:11:545:18 | ...[...] | hash_flow.rb:545:10:545:19 | ( ... ) | provenance | | -| hash_flow.rb:551:5:551:8 | hash [element :a] | hash_flow.rb:556:9:556:12 | hash [element :a] | provenance | | -| hash_flow.rb:551:5:551:8 | hash [element :c] | hash_flow.rb:556:9:556:12 | hash [element :c] | provenance | | -| hash_flow.rb:551:12:555:5 | call to [] [element :a] | hash_flow.rb:551:5:551:8 | hash [element :a] | provenance | | -| hash_flow.rb:551:12:555:5 | call to [] [element :c] | hash_flow.rb:551:5:551:8 | hash [element :c] | provenance | | -| hash_flow.rb:552:15:552:25 | call to taint | hash_flow.rb:551:12:555:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:554:15:554:25 | call to taint | hash_flow.rb:551:12:555:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:556:5:556:5 | b [element 1] | hash_flow.rb:559:11:559:11 | b [element 1] | provenance | | -| hash_flow.rb:556:9:556:12 | [post] hash [element :a] | hash_flow.rb:557:11:557:14 | hash [element :a] | provenance | | -| hash_flow.rb:556:9:556:12 | hash [element :a] | hash_flow.rb:556:9:556:12 | [post] hash [element :a] | provenance | | -| hash_flow.rb:556:9:556:12 | hash [element :a] | hash_flow.rb:556:9:556:18 | call to shift [element 1] | provenance | | -| hash_flow.rb:556:9:556:12 | hash [element :c] | hash_flow.rb:556:9:556:18 | call to shift [element 1] | provenance | | -| hash_flow.rb:556:9:556:18 | call to shift [element 1] | hash_flow.rb:556:5:556:5 | b [element 1] | provenance | | -| hash_flow.rb:557:11:557:14 | hash [element :a] | hash_flow.rb:557:11:557:18 | ...[...] | provenance | | +| hash_flow.rb:551:5:551:8 | hash : Hash [element :a] | hash_flow.rb:556:9:556:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:551:5:551:8 | hash : Hash [element :c] | hash_flow.rb:556:9:556:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:551:12:555:5 | call to [] : Hash [element :a] | hash_flow.rb:551:5:551:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:551:12:555:5 | call to [] : Hash [element :c] | hash_flow.rb:551:5:551:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:552:15:552:25 | call to taint | hash_flow.rb:551:12:555:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:554:15:554:25 | call to taint | hash_flow.rb:551:12:555:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:556:5:556:5 | b : [collection] [element 1] | hash_flow.rb:559:11:559:11 | b : [collection] [element 1] | provenance | | +| hash_flow.rb:556:9:556:12 | [post] hash : Hash [element :a] | hash_flow.rb:557:11:557:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:556:9:556:12 | hash : Hash [element :a] | hash_flow.rb:556:9:556:12 | [post] hash : Hash [element :a] | provenance | | +| hash_flow.rb:556:9:556:12 | hash : Hash [element :a] | hash_flow.rb:556:9:556:18 | call to shift : [collection] [element 1] | provenance | | +| hash_flow.rb:556:9:556:12 | hash : Hash [element :c] | hash_flow.rb:556:9:556:18 | call to shift : [collection] [element 1] | provenance | | +| hash_flow.rb:556:9:556:18 | call to shift : [collection] [element 1] | hash_flow.rb:556:5:556:5 | b : [collection] [element 1] | provenance | | +| hash_flow.rb:557:11:557:14 | hash : Hash [element :a] | hash_flow.rb:557:11:557:18 | ...[...] | provenance | | | hash_flow.rb:557:11:557:18 | ...[...] | hash_flow.rb:557:10:557:19 | ( ... ) | provenance | | -| hash_flow.rb:559:11:559:11 | b [element 1] | hash_flow.rb:559:11:559:14 | ...[...] | provenance | | +| hash_flow.rb:559:11:559:11 | b : [collection] [element 1] | hash_flow.rb:559:11:559:14 | ...[...] | provenance | | | hash_flow.rb:559:11:559:14 | ...[...] | hash_flow.rb:559:10:559:15 | ( ... ) | provenance | | -| hash_flow.rb:565:5:565:8 | hash [element :a] | hash_flow.rb:570:9:570:12 | hash [element :a] | provenance | | -| hash_flow.rb:565:5:565:8 | hash [element :a] | hash_flow.rb:575:9:575:12 | hash [element :a] | provenance | | -| hash_flow.rb:565:5:565:8 | hash [element :c] | hash_flow.rb:575:9:575:12 | hash [element :c] | provenance | | -| hash_flow.rb:565:12:569:5 | call to [] [element :a] | hash_flow.rb:565:5:565:8 | hash [element :a] | provenance | | -| hash_flow.rb:565:12:569:5 | call to [] [element :c] | hash_flow.rb:565:5:565:8 | hash [element :c] | provenance | | -| hash_flow.rb:566:15:566:25 | call to taint | hash_flow.rb:565:12:569:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:568:15:568:25 | call to taint | hash_flow.rb:565:12:569:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:570:5:570:5 | b [element :a] | hash_flow.rb:571:11:571:11 | b [element :a] | provenance | | -| hash_flow.rb:570:9:570:12 | hash [element :a] | hash_flow.rb:570:9:570:26 | call to slice [element :a] | provenance | | -| hash_flow.rb:570:9:570:26 | call to slice [element :a] | hash_flow.rb:570:5:570:5 | b [element :a] | provenance | | -| hash_flow.rb:571:11:571:11 | b [element :a] | hash_flow.rb:571:11:571:15 | ...[...] | provenance | | +| hash_flow.rb:565:5:565:8 | hash : Hash [element :a] | hash_flow.rb:570:9:570:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:565:5:565:8 | hash : Hash [element :a] | hash_flow.rb:575:9:575:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:565:5:565:8 | hash : Hash [element :c] | hash_flow.rb:575:9:575:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:565:12:569:5 | call to [] : Hash [element :a] | hash_flow.rb:565:5:565:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:565:12:569:5 | call to [] : Hash [element :c] | hash_flow.rb:565:5:565:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:566:15:566:25 | call to taint | hash_flow.rb:565:12:569:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:568:15:568:25 | call to taint | hash_flow.rb:565:12:569:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:570:5:570:5 | b : Hash [element :a] | hash_flow.rb:571:11:571:11 | b : Hash [element :a] | provenance | | +| hash_flow.rb:570:9:570:12 | hash : Hash [element :a] | hash_flow.rb:570:9:570:26 | call to slice : Hash [element :a] | provenance | | +| hash_flow.rb:570:9:570:26 | call to slice : Hash [element :a] | hash_flow.rb:570:5:570:5 | b : Hash [element :a] | provenance | | +| hash_flow.rb:571:11:571:11 | b : Hash [element :a] | hash_flow.rb:571:11:571:15 | ...[...] | provenance | | | hash_flow.rb:571:11:571:15 | ...[...] | hash_flow.rb:571:10:571:16 | ( ... ) | provenance | | -| hash_flow.rb:575:5:575:5 | c [element :a] | hash_flow.rb:576:11:576:11 | c [element :a] | provenance | | -| hash_flow.rb:575:5:575:5 | c [element :c] | hash_flow.rb:578:11:578:11 | c [element :c] | provenance | | -| hash_flow.rb:575:9:575:12 | hash [element :a] | hash_flow.rb:575:9:575:25 | call to slice [element :a] | provenance | | -| hash_flow.rb:575:9:575:12 | hash [element :c] | hash_flow.rb:575:9:575:25 | call to slice [element :c] | provenance | | -| hash_flow.rb:575:9:575:25 | call to slice [element :a] | hash_flow.rb:575:5:575:5 | c [element :a] | provenance | | -| hash_flow.rb:575:9:575:25 | call to slice [element :c] | hash_flow.rb:575:5:575:5 | c [element :c] | provenance | | -| hash_flow.rb:576:11:576:11 | c [element :a] | hash_flow.rb:576:11:576:15 | ...[...] | provenance | | +| hash_flow.rb:575:5:575:5 | c : Hash [element :a] | hash_flow.rb:576:11:576:11 | c : Hash [element :a] | provenance | | +| hash_flow.rb:575:5:575:5 | c : Hash [element :c] | hash_flow.rb:578:11:578:11 | c : Hash [element :c] | provenance | | +| hash_flow.rb:575:9:575:12 | hash : Hash [element :a] | hash_flow.rb:575:9:575:25 | call to slice : Hash [element :a] | provenance | | +| hash_flow.rb:575:9:575:12 | hash : Hash [element :c] | hash_flow.rb:575:9:575:25 | call to slice : Hash [element :c] | provenance | | +| hash_flow.rb:575:9:575:25 | call to slice : Hash [element :a] | hash_flow.rb:575:5:575:5 | c : Hash [element :a] | provenance | | +| hash_flow.rb:575:9:575:25 | call to slice : Hash [element :c] | hash_flow.rb:575:5:575:5 | c : Hash [element :c] | provenance | | +| hash_flow.rb:576:11:576:11 | c : Hash [element :a] | hash_flow.rb:576:11:576:15 | ...[...] | provenance | | | hash_flow.rb:576:11:576:15 | ...[...] | hash_flow.rb:576:10:576:16 | ( ... ) | provenance | | -| hash_flow.rb:578:11:578:11 | c [element :c] | hash_flow.rb:578:11:578:15 | ...[...] | provenance | | +| hash_flow.rb:578:11:578:11 | c : Hash [element :c] | hash_flow.rb:578:11:578:15 | ...[...] | provenance | | | hash_flow.rb:578:11:578:15 | ...[...] | hash_flow.rb:578:10:578:16 | ( ... ) | provenance | | -| hash_flow.rb:584:5:584:8 | hash [element :a] | hash_flow.rb:589:9:589:12 | hash [element :a] | provenance | | -| hash_flow.rb:584:5:584:8 | hash [element :c] | hash_flow.rb:589:9:589:12 | hash [element :c] | provenance | | -| hash_flow.rb:584:12:588:5 | call to [] [element :a] | hash_flow.rb:584:5:584:8 | hash [element :a] | provenance | | -| hash_flow.rb:584:12:588:5 | call to [] [element :c] | hash_flow.rb:584:5:584:8 | hash [element :c] | provenance | | -| hash_flow.rb:585:15:585:25 | call to taint | hash_flow.rb:584:12:588:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:587:15:587:25 | call to taint | hash_flow.rb:584:12:588:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:589:5:589:5 | a [element, element 1] | hash_flow.rb:591:11:591:11 | a [element, element 1] | provenance | | -| hash_flow.rb:589:9:589:12 | hash [element :a] | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | provenance | | -| hash_flow.rb:589:9:589:12 | hash [element :c] | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | provenance | | -| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | hash_flow.rb:589:5:589:5 | a [element, element 1] | provenance | | -| hash_flow.rb:591:11:591:11 | a [element, element 1] | hash_flow.rb:591:11:591:14 | ...[...] [element 1] | provenance | | +| hash_flow.rb:584:5:584:8 | hash : Hash [element :a] | hash_flow.rb:589:9:589:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:584:5:584:8 | hash : Hash [element :c] | hash_flow.rb:589:9:589:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:584:12:588:5 | call to [] : Hash [element :a] | hash_flow.rb:584:5:584:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:584:12:588:5 | call to [] : Hash [element :c] | hash_flow.rb:584:5:584:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:585:15:585:25 | call to taint | hash_flow.rb:584:12:588:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:587:15:587:25 | call to taint | hash_flow.rb:584:12:588:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:589:5:589:5 | a : [collection] [element, element 1] | hash_flow.rb:591:11:591:11 | a : [collection] [element, element 1] | provenance | | +| hash_flow.rb:589:9:589:12 | hash : Hash [element :a] | hash_flow.rb:589:9:589:17 | call to to_a : [collection] [element, element 1] | provenance | | +| hash_flow.rb:589:9:589:12 | hash : Hash [element :c] | hash_flow.rb:589:9:589:17 | call to to_a : [collection] [element, element 1] | provenance | | +| hash_flow.rb:589:9:589:17 | call to to_a : [collection] [element, element 1] | hash_flow.rb:589:5:589:5 | a : [collection] [element, element 1] | provenance | | +| hash_flow.rb:591:11:591:11 | a : [collection] [element, element 1] | hash_flow.rb:591:11:591:14 | ...[...] [element 1] | provenance | | | hash_flow.rb:591:11:591:14 | ...[...] [element 1] | hash_flow.rb:591:11:591:17 | ...[...] | provenance | | | hash_flow.rb:591:11:591:17 | ...[...] | hash_flow.rb:591:10:591:18 | ( ... ) | provenance | | -| hash_flow.rb:597:5:597:8 | hash [element :a] | hash_flow.rb:602:9:602:12 | hash [element :a] | provenance | | -| hash_flow.rb:597:5:597:8 | hash [element :a] | hash_flow.rb:607:9:607:12 | hash [element :a] | provenance | | -| hash_flow.rb:597:5:597:8 | hash [element :c] | hash_flow.rb:602:9:602:12 | hash [element :c] | provenance | | -| hash_flow.rb:597:5:597:8 | hash [element :c] | hash_flow.rb:607:9:607:12 | hash [element :c] | provenance | | -| hash_flow.rb:597:12:601:5 | call to [] [element :a] | hash_flow.rb:597:5:597:8 | hash [element :a] | provenance | | -| hash_flow.rb:597:12:601:5 | call to [] [element :c] | hash_flow.rb:597:5:597:8 | hash [element :c] | provenance | | -| hash_flow.rb:598:15:598:25 | call to taint | hash_flow.rb:597:12:601:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:600:15:600:25 | call to taint | hash_flow.rb:597:12:601:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:602:5:602:5 | a [element :a] | hash_flow.rb:603:11:603:11 | a [element :a] | provenance | | -| hash_flow.rb:602:5:602:5 | a [element :c] | hash_flow.rb:605:11:605:11 | a [element :c] | provenance | | -| hash_flow.rb:602:9:602:12 | hash [element :a] | hash_flow.rb:602:9:602:17 | call to to_h [element :a] | provenance | | -| hash_flow.rb:602:9:602:12 | hash [element :c] | hash_flow.rb:602:9:602:17 | call to to_h [element :c] | provenance | | -| hash_flow.rb:602:9:602:17 | call to to_h [element :a] | hash_flow.rb:602:5:602:5 | a [element :a] | provenance | | -| hash_flow.rb:602:9:602:17 | call to to_h [element :c] | hash_flow.rb:602:5:602:5 | a [element :c] | provenance | | -| hash_flow.rb:603:11:603:11 | a [element :a] | hash_flow.rb:603:11:603:15 | ...[...] | provenance | | +| hash_flow.rb:597:5:597:8 | hash : Hash [element :a] | hash_flow.rb:602:9:602:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:597:5:597:8 | hash : Hash [element :a] | hash_flow.rb:607:9:607:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:597:5:597:8 | hash : Hash [element :c] | hash_flow.rb:602:9:602:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:597:5:597:8 | hash : Hash [element :c] | hash_flow.rb:607:9:607:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:597:12:601:5 | call to [] : Hash [element :a] | hash_flow.rb:597:5:597:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:597:12:601:5 | call to [] : Hash [element :c] | hash_flow.rb:597:5:597:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:598:15:598:25 | call to taint | hash_flow.rb:597:12:601:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:600:15:600:25 | call to taint | hash_flow.rb:597:12:601:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:602:5:602:5 | a : Hash [element :a] | hash_flow.rb:603:11:603:11 | a : Hash [element :a] | provenance | | +| hash_flow.rb:602:5:602:5 | a : Hash [element :c] | hash_flow.rb:605:11:605:11 | a : Hash [element :c] | provenance | | +| hash_flow.rb:602:9:602:12 | hash : Hash [element :a] | hash_flow.rb:602:9:602:17 | call to to_h : Hash [element :a] | provenance | | +| hash_flow.rb:602:9:602:12 | hash : Hash [element :c] | hash_flow.rb:602:9:602:17 | call to to_h : Hash [element :c] | provenance | | +| hash_flow.rb:602:9:602:17 | call to to_h : Hash [element :a] | hash_flow.rb:602:5:602:5 | a : Hash [element :a] | provenance | | +| hash_flow.rb:602:9:602:17 | call to to_h : Hash [element :c] | hash_flow.rb:602:5:602:5 | a : Hash [element :c] | provenance | | +| hash_flow.rb:603:11:603:11 | a : Hash [element :a] | hash_flow.rb:603:11:603:15 | ...[...] | provenance | | | hash_flow.rb:603:11:603:15 | ...[...] | hash_flow.rb:603:10:603:16 | ( ... ) | provenance | | -| hash_flow.rb:605:11:605:11 | a [element :c] | hash_flow.rb:605:11:605:15 | ...[...] | provenance | | +| hash_flow.rb:605:11:605:11 | a : Hash [element :c] | hash_flow.rb:605:11:605:15 | ...[...] | provenance | | | hash_flow.rb:605:11:605:15 | ...[...] | hash_flow.rb:605:10:605:16 | ( ... ) | provenance | | -| hash_flow.rb:607:5:607:5 | b [element] | hash_flow.rb:612:11:612:11 | b [element] | provenance | | -| hash_flow.rb:607:9:607:12 | hash [element :a] | hash_flow.rb:607:28:607:32 | value | provenance | | -| hash_flow.rb:607:9:607:12 | hash [element :c] | hash_flow.rb:607:28:607:32 | value | provenance | | -| hash_flow.rb:607:9:611:7 | call to to_h [element] | hash_flow.rb:607:5:607:5 | b [element] | provenance | | +| hash_flow.rb:607:5:607:5 | b : [collection] [element] | hash_flow.rb:612:11:612:11 | b : [collection] [element] | provenance | | +| hash_flow.rb:607:9:607:12 | hash : Hash [element :a] | hash_flow.rb:607:28:607:32 | value | provenance | | +| hash_flow.rb:607:9:607:12 | hash : Hash [element :c] | hash_flow.rb:607:28:607:32 | value | provenance | | +| hash_flow.rb:607:9:611:7 | call to to_h : [collection] [element] | hash_flow.rb:607:5:607:5 | b : [collection] [element] | provenance | | | hash_flow.rb:607:28:607:32 | value | hash_flow.rb:609:14:609:18 | value | provenance | | -| hash_flow.rb:610:9:610:25 | call to [] [element 1] | hash_flow.rb:607:9:611:7 | call to to_h [element] | provenance | | -| hash_flow.rb:610:14:610:24 | call to taint | hash_flow.rb:610:9:610:25 | call to [] [element 1] | provenance | | -| hash_flow.rb:612:11:612:11 | b [element] | hash_flow.rb:612:11:612:15 | ...[...] | provenance | | +| hash_flow.rb:610:9:610:25 | call to [] : Array [element 1] | hash_flow.rb:607:9:611:7 | call to to_h : [collection] [element] | provenance | | +| hash_flow.rb:610:14:610:24 | call to taint | hash_flow.rb:610:9:610:25 | call to [] : Array [element 1] | provenance | | +| hash_flow.rb:612:11:612:11 | b : [collection] [element] | hash_flow.rb:612:11:612:15 | ...[...] | provenance | | | hash_flow.rb:612:11:612:15 | ...[...] | hash_flow.rb:612:10:612:16 | ( ... ) | provenance | | -| hash_flow.rb:618:5:618:8 | hash [element :a] | hash_flow.rb:623:9:623:12 | hash [element :a] | provenance | | -| hash_flow.rb:618:5:618:8 | hash [element :c] | hash_flow.rb:623:9:623:12 | hash [element :c] | provenance | | -| hash_flow.rb:618:12:622:5 | call to [] [element :a] | hash_flow.rb:618:5:618:8 | hash [element :a] | provenance | | -| hash_flow.rb:618:12:622:5 | call to [] [element :c] | hash_flow.rb:618:5:618:8 | hash [element :c] | provenance | | -| hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:618:12:622:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:618:12:622:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:624:11:624:11 | a [element] | provenance | | -| hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:625:11:625:11 | a [element] | provenance | | -| hash_flow.rb:623:5:623:5 | a [element] | hash_flow.rb:626:11:626:11 | a [element] | provenance | | -| hash_flow.rb:623:9:623:12 | hash [element :a] | hash_flow.rb:623:9:623:45 | call to transform_keys [element] | provenance | | -| hash_flow.rb:623:9:623:12 | hash [element :c] | hash_flow.rb:623:9:623:45 | call to transform_keys [element] | provenance | | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] | hash_flow.rb:623:5:623:5 | a [element] | provenance | | -| hash_flow.rb:624:11:624:11 | a [element] | hash_flow.rb:624:11:624:16 | ...[...] | provenance | | +| hash_flow.rb:618:5:618:8 | hash : Hash [element :a] | hash_flow.rb:623:9:623:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:618:5:618:8 | hash : Hash [element :c] | hash_flow.rb:623:9:623:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:618:12:622:5 | call to [] : Hash [element :a] | hash_flow.rb:618:5:618:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:618:12:622:5 | call to [] : Hash [element :c] | hash_flow.rb:618:5:618:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:619:15:619:25 | call to taint | hash_flow.rb:618:12:622:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:621:15:621:25 | call to taint | hash_flow.rb:618:12:622:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:623:5:623:5 | a : [collection] [element] | hash_flow.rb:624:11:624:11 | a : [collection] [element] | provenance | | +| hash_flow.rb:623:5:623:5 | a : [collection] [element] | hash_flow.rb:625:11:625:11 | a : [collection] [element] | provenance | | +| hash_flow.rb:623:5:623:5 | a : [collection] [element] | hash_flow.rb:626:11:626:11 | a : [collection] [element] | provenance | | +| hash_flow.rb:623:9:623:12 | hash : Hash [element :a] | hash_flow.rb:623:9:623:45 | call to transform_keys : [collection] [element] | provenance | | +| hash_flow.rb:623:9:623:12 | hash : Hash [element :c] | hash_flow.rb:623:9:623:45 | call to transform_keys : [collection] [element] | provenance | | +| hash_flow.rb:623:9:623:45 | call to transform_keys : [collection] [element] | hash_flow.rb:623:5:623:5 | a : [collection] [element] | provenance | | +| hash_flow.rb:624:11:624:11 | a : [collection] [element] | hash_flow.rb:624:11:624:16 | ...[...] | provenance | | | hash_flow.rb:624:11:624:16 | ...[...] | hash_flow.rb:624:10:624:17 | ( ... ) | provenance | | -| hash_flow.rb:625:11:625:11 | a [element] | hash_flow.rb:625:11:625:16 | ...[...] | provenance | | +| hash_flow.rb:625:11:625:11 | a : [collection] [element] | hash_flow.rb:625:11:625:16 | ...[...] | provenance | | | hash_flow.rb:625:11:625:16 | ...[...] | hash_flow.rb:625:10:625:17 | ( ... ) | provenance | | -| hash_flow.rb:626:11:626:11 | a [element] | hash_flow.rb:626:11:626:16 | ...[...] | provenance | | +| hash_flow.rb:626:11:626:11 | a : [collection] [element] | hash_flow.rb:626:11:626:16 | ...[...] | provenance | | | hash_flow.rb:626:11:626:16 | ...[...] | hash_flow.rb:626:10:626:17 | ( ... ) | provenance | | -| hash_flow.rb:632:5:632:8 | hash [element :a] | hash_flow.rb:639:5:639:8 | hash [element :a] | provenance | | -| hash_flow.rb:632:5:632:8 | hash [element :a] | hash_flow.rb:640:11:640:14 | hash [element :a] | provenance | | -| hash_flow.rb:632:5:632:8 | hash [element :c] | hash_flow.rb:639:5:639:8 | hash [element :c] | provenance | | -| hash_flow.rb:632:5:632:8 | hash [element :c] | hash_flow.rb:642:11:642:14 | hash [element :c] | provenance | | -| hash_flow.rb:632:12:636:5 | call to [] [element :a] | hash_flow.rb:632:5:632:8 | hash [element :a] | provenance | | -| hash_flow.rb:632:12:636:5 | call to [] [element :c] | hash_flow.rb:632:5:632:8 | hash [element :c] | provenance | | -| hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:632:12:636:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:632:12:636:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:639:5:639:8 | hash [element] | provenance | | -| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:640:11:640:14 | hash [element] | provenance | | -| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:641:11:641:14 | hash [element] | provenance | | -| hash_flow.rb:637:5:637:8 | [post] hash [element] | hash_flow.rb:642:11:642:14 | hash [element] | provenance | | -| hash_flow.rb:637:15:637:25 | call to taint | hash_flow.rb:637:5:637:8 | [post] hash [element] | provenance | | -| hash_flow.rb:639:5:639:8 | [post] hash [element] | hash_flow.rb:640:11:640:14 | hash [element] | provenance | | -| hash_flow.rb:639:5:639:8 | [post] hash [element] | hash_flow.rb:641:11:641:14 | hash [element] | provenance | | -| hash_flow.rb:639:5:639:8 | [post] hash [element] | hash_flow.rb:642:11:642:14 | hash [element] | provenance | | -| hash_flow.rb:639:5:639:8 | hash [element :a] | hash_flow.rb:639:5:639:8 | [post] hash [element] | provenance | | -| hash_flow.rb:639:5:639:8 | hash [element :c] | hash_flow.rb:639:5:639:8 | [post] hash [element] | provenance | | -| hash_flow.rb:639:5:639:8 | hash [element] | hash_flow.rb:639:5:639:8 | [post] hash [element] | provenance | | -| hash_flow.rb:640:11:640:14 | hash [element :a] | hash_flow.rb:640:11:640:19 | ...[...] | provenance | | -| hash_flow.rb:640:11:640:14 | hash [element] | hash_flow.rb:640:11:640:19 | ...[...] | provenance | | +| hash_flow.rb:632:5:632:8 | hash : Hash [element :a] | hash_flow.rb:639:5:639:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:632:5:632:8 | hash : Hash [element :a] | hash_flow.rb:640:11:640:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:632:5:632:8 | hash : Hash [element :c] | hash_flow.rb:639:5:639:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:632:5:632:8 | hash : Hash [element :c] | hash_flow.rb:642:11:642:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:632:12:636:5 | call to [] : Hash [element :a] | hash_flow.rb:632:5:632:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:632:12:636:5 | call to [] : Hash [element :c] | hash_flow.rb:632:5:632:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:633:15:633:25 | call to taint | hash_flow.rb:632:12:636:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:635:15:635:25 | call to taint | hash_flow.rb:632:12:636:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:637:5:637:8 | [post] hash : [collection] [element] | hash_flow.rb:639:5:639:8 | hash : [collection] [element] | provenance | | +| hash_flow.rb:637:5:637:8 | [post] hash : [collection] [element] | hash_flow.rb:640:11:640:14 | hash : [collection] [element] | provenance | | +| hash_flow.rb:637:5:637:8 | [post] hash : [collection] [element] | hash_flow.rb:641:11:641:14 | hash : [collection] [element] | provenance | | +| hash_flow.rb:637:5:637:8 | [post] hash : [collection] [element] | hash_flow.rb:642:11:642:14 | hash : [collection] [element] | provenance | | +| hash_flow.rb:637:15:637:25 | call to taint | hash_flow.rb:637:5:637:8 | [post] hash : [collection] [element] | provenance | | +| hash_flow.rb:639:5:639:8 | [post] hash : [collection] [element] | hash_flow.rb:640:11:640:14 | hash : [collection] [element] | provenance | | +| hash_flow.rb:639:5:639:8 | [post] hash : [collection] [element] | hash_flow.rb:641:11:641:14 | hash : [collection] [element] | provenance | | +| hash_flow.rb:639:5:639:8 | [post] hash : [collection] [element] | hash_flow.rb:642:11:642:14 | hash : [collection] [element] | provenance | | +| hash_flow.rb:639:5:639:8 | hash : Hash [element :a] | hash_flow.rb:639:5:639:8 | [post] hash : [collection] [element] | provenance | | +| hash_flow.rb:639:5:639:8 | hash : Hash [element :c] | hash_flow.rb:639:5:639:8 | [post] hash : [collection] [element] | provenance | | +| hash_flow.rb:639:5:639:8 | hash : [collection] [element] | hash_flow.rb:639:5:639:8 | [post] hash : [collection] [element] | provenance | | +| hash_flow.rb:640:11:640:14 | hash : Hash [element :a] | hash_flow.rb:640:11:640:19 | ...[...] | provenance | | +| hash_flow.rb:640:11:640:14 | hash : [collection] [element] | hash_flow.rb:640:11:640:19 | ...[...] | provenance | | | hash_flow.rb:640:11:640:19 | ...[...] | hash_flow.rb:640:10:640:20 | ( ... ) | provenance | | -| hash_flow.rb:641:11:641:14 | hash [element] | hash_flow.rb:641:11:641:19 | ...[...] | provenance | | +| hash_flow.rb:641:11:641:14 | hash : [collection] [element] | hash_flow.rb:641:11:641:19 | ...[...] | provenance | | | hash_flow.rb:641:11:641:19 | ...[...] | hash_flow.rb:641:10:641:20 | ( ... ) | provenance | | -| hash_flow.rb:642:11:642:14 | hash [element :c] | hash_flow.rb:642:11:642:19 | ...[...] | provenance | | -| hash_flow.rb:642:11:642:14 | hash [element] | hash_flow.rb:642:11:642:19 | ...[...] | provenance | | +| hash_flow.rb:642:11:642:14 | hash : Hash [element :c] | hash_flow.rb:642:11:642:19 | ...[...] | provenance | | +| hash_flow.rb:642:11:642:14 | hash : [collection] [element] | hash_flow.rb:642:11:642:19 | ...[...] | provenance | | | hash_flow.rb:642:11:642:19 | ...[...] | hash_flow.rb:642:10:642:20 | ( ... ) | provenance | | -| hash_flow.rb:648:5:648:8 | hash [element :a] | hash_flow.rb:653:9:653:12 | hash [element :a] | provenance | | -| hash_flow.rb:648:5:648:8 | hash [element :a] | hash_flow.rb:657:11:657:14 | hash [element :a] | provenance | | -| hash_flow.rb:648:5:648:8 | hash [element :c] | hash_flow.rb:653:9:653:12 | hash [element :c] | provenance | | -| hash_flow.rb:648:12:652:5 | call to [] [element :a] | hash_flow.rb:648:5:648:8 | hash [element :a] | provenance | | -| hash_flow.rb:648:12:652:5 | call to [] [element :c] | hash_flow.rb:648:5:648:8 | hash [element :c] | provenance | | -| hash_flow.rb:649:15:649:25 | call to taint | hash_flow.rb:648:12:652:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:651:15:651:25 | call to taint | hash_flow.rb:648:12:652:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:653:5:653:5 | b [element] | hash_flow.rb:658:11:658:11 | b [element] | provenance | | -| hash_flow.rb:653:9:653:12 | hash [element :a] | hash_flow.rb:653:35:653:39 | value | provenance | | -| hash_flow.rb:653:9:653:12 | hash [element :c] | hash_flow.rb:653:35:653:39 | value | provenance | | -| hash_flow.rb:653:9:656:7 | call to transform_values [element] | hash_flow.rb:653:5:653:5 | b [element] | provenance | | +| hash_flow.rb:648:5:648:8 | hash : Hash [element :a] | hash_flow.rb:653:9:653:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:648:5:648:8 | hash : Hash [element :a] | hash_flow.rb:657:11:657:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:648:5:648:8 | hash : Hash [element :c] | hash_flow.rb:653:9:653:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:648:12:652:5 | call to [] : Hash [element :a] | hash_flow.rb:648:5:648:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:648:12:652:5 | call to [] : Hash [element :c] | hash_flow.rb:648:5:648:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:649:15:649:25 | call to taint | hash_flow.rb:648:12:652:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:651:15:651:25 | call to taint | hash_flow.rb:648:12:652:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:653:5:653:5 | b : [collection] [element] | hash_flow.rb:658:11:658:11 | b : [collection] [element] | provenance | | +| hash_flow.rb:653:9:653:12 | hash : Hash [element :a] | hash_flow.rb:653:35:653:39 | value | provenance | | +| hash_flow.rb:653:9:653:12 | hash : Hash [element :c] | hash_flow.rb:653:35:653:39 | value | provenance | | +| hash_flow.rb:653:9:656:7 | call to transform_values : [collection] [element] | hash_flow.rb:653:5:653:5 | b : [collection] [element] | provenance | | | hash_flow.rb:653:35:653:39 | value | hash_flow.rb:654:14:654:18 | value | provenance | | -| hash_flow.rb:655:9:655:19 | call to taint | hash_flow.rb:653:9:656:7 | call to transform_values [element] | provenance | | -| hash_flow.rb:657:11:657:14 | hash [element :a] | hash_flow.rb:657:11:657:18 | ...[...] | provenance | | +| hash_flow.rb:655:9:655:19 | call to taint | hash_flow.rb:653:9:656:7 | call to transform_values : [collection] [element] | provenance | | +| hash_flow.rb:657:11:657:14 | hash : Hash [element :a] | hash_flow.rb:657:11:657:18 | ...[...] | provenance | | | hash_flow.rb:657:11:657:18 | ...[...] | hash_flow.rb:657:10:657:19 | ( ... ) | provenance | | -| hash_flow.rb:658:11:658:11 | b [element] | hash_flow.rb:658:11:658:15 | ...[...] | provenance | | +| hash_flow.rb:658:11:658:11 | b : [collection] [element] | hash_flow.rb:658:11:658:15 | ...[...] | provenance | | | hash_flow.rb:658:11:658:15 | ...[...] | hash_flow.rb:658:10:658:16 | ( ... ) | provenance | | -| hash_flow.rb:664:5:664:8 | hash [element :a] | hash_flow.rb:669:5:669:8 | hash [element :a] | provenance | | -| hash_flow.rb:664:5:664:8 | hash [element :c] | hash_flow.rb:669:5:669:8 | hash [element :c] | provenance | | -| hash_flow.rb:664:12:668:5 | call to [] [element :a] | hash_flow.rb:664:5:664:8 | hash [element :a] | provenance | | -| hash_flow.rb:664:12:668:5 | call to [] [element :c] | hash_flow.rb:664:5:664:8 | hash [element :c] | provenance | | -| hash_flow.rb:665:15:665:25 | call to taint | hash_flow.rb:664:12:668:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:667:15:667:25 | call to taint | hash_flow.rb:664:12:668:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:669:5:669:8 | [post] hash [element] | hash_flow.rb:673:11:673:14 | hash [element] | provenance | | -| hash_flow.rb:669:5:669:8 | hash [element :a] | hash_flow.rb:669:32:669:36 | value | provenance | | -| hash_flow.rb:669:5:669:8 | hash [element :c] | hash_flow.rb:669:32:669:36 | value | provenance | | +| hash_flow.rb:664:5:664:8 | hash : Hash [element :a] | hash_flow.rb:669:5:669:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:664:5:664:8 | hash : Hash [element :c] | hash_flow.rb:669:5:669:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:664:12:668:5 | call to [] : Hash [element :a] | hash_flow.rb:664:5:664:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:664:12:668:5 | call to [] : Hash [element :c] | hash_flow.rb:664:5:664:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:665:15:665:25 | call to taint | hash_flow.rb:664:12:668:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:667:15:667:25 | call to taint | hash_flow.rb:664:12:668:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:669:5:669:8 | [post] hash : [collection] [element] | hash_flow.rb:673:11:673:14 | hash : [collection] [element] | provenance | | +| hash_flow.rb:669:5:669:8 | hash : Hash [element :a] | hash_flow.rb:669:32:669:36 | value | provenance | | +| hash_flow.rb:669:5:669:8 | hash : Hash [element :c] | hash_flow.rb:669:32:669:36 | value | provenance | | | hash_flow.rb:669:32:669:36 | value | hash_flow.rb:670:14:670:18 | value | provenance | | -| hash_flow.rb:671:9:671:19 | call to taint | hash_flow.rb:669:5:669:8 | [post] hash [element] | provenance | | -| hash_flow.rb:673:11:673:14 | hash [element] | hash_flow.rb:673:11:673:18 | ...[...] | provenance | | +| hash_flow.rb:671:9:671:19 | call to taint | hash_flow.rb:669:5:669:8 | [post] hash : [collection] [element] | provenance | | +| hash_flow.rb:673:11:673:14 | hash : [collection] [element] | hash_flow.rb:673:11:673:18 | ...[...] | provenance | | | hash_flow.rb:673:11:673:18 | ...[...] | hash_flow.rb:673:10:673:19 | ( ... ) | provenance | | -| hash_flow.rb:679:5:679:9 | hash1 [element :a] | hash_flow.rb:689:12:689:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:679:5:679:9 | hash1 [element :c] | hash_flow.rb:689:12:689:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:679:13:683:5 | call to [] [element :a] | hash_flow.rb:679:5:679:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:679:13:683:5 | call to [] [element :c] | hash_flow.rb:679:5:679:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:679:13:683:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:679:13:683:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:684:5:684:9 | hash2 [element :d] | hash_flow.rb:689:25:689:29 | hash2 [element :d] | provenance | | -| hash_flow.rb:684:5:684:9 | hash2 [element :f] | hash_flow.rb:689:25:689:29 | hash2 [element :f] | provenance | | -| hash_flow.rb:684:13:688:5 | call to [] [element :d] | hash_flow.rb:684:5:684:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:684:13:688:5 | call to [] [element :f] | hash_flow.rb:684:5:684:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:684:13:688:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:684:13:688:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:689:5:689:8 | hash [element :a] | hash_flow.rb:694:11:694:14 | hash [element :a] | provenance | | -| hash_flow.rb:689:5:689:8 | hash [element :c] | hash_flow.rb:696:11:696:14 | hash [element :c] | provenance | | -| hash_flow.rb:689:5:689:8 | hash [element :d] | hash_flow.rb:697:11:697:14 | hash [element :d] | provenance | | -| hash_flow.rb:689:5:689:8 | hash [element :f] | hash_flow.rb:699:11:699:14 | hash [element :f] | provenance | | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] | hash_flow.rb:701:11:701:15 | hash1 [element :a] | provenance | | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] | hash_flow.rb:703:11:703:15 | hash1 [element :c] | provenance | | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] | hash_flow.rb:704:11:704:15 | hash1 [element :d] | provenance | | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] | hash_flow.rb:706:11:706:15 | hash1 [element :f] | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:12:693:7 | call to update [element :a] | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:41:689:49 | old_value | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] | hash_flow.rb:689:52:689:60 | new_value | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:12:693:7 | call to update [element :c] | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:41:689:49 | old_value | provenance | | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] | hash_flow.rb:689:52:689:60 | new_value | provenance | | -| hash_flow.rb:689:12:693:7 | call to update [element :a] | hash_flow.rb:689:5:689:8 | hash [element :a] | provenance | | -| hash_flow.rb:689:12:693:7 | call to update [element :c] | hash_flow.rb:689:5:689:8 | hash [element :c] | provenance | | -| hash_flow.rb:689:12:693:7 | call to update [element :d] | hash_flow.rb:689:5:689:8 | hash [element :d] | provenance | | -| hash_flow.rb:689:12:693:7 | call to update [element :f] | hash_flow.rb:689:5:689:8 | hash [element :f] | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:12:693:7 | call to update [element :d] | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:41:689:49 | old_value | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] | hash_flow.rb:689:52:689:60 | new_value | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:12:693:7 | call to update [element :f] | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:41:689:49 | old_value | provenance | | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] | hash_flow.rb:689:52:689:60 | new_value | provenance | | +| hash_flow.rb:679:5:679:9 | hash1 : Hash [element :a] | hash_flow.rb:689:12:689:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:679:5:679:9 | hash1 : Hash [element :c] | hash_flow.rb:689:12:689:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:679:13:683:5 | call to [] : Hash [element :a] | hash_flow.rb:679:5:679:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:679:13:683:5 | call to [] : Hash [element :c] | hash_flow.rb:679:5:679:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:680:15:680:25 | call to taint | hash_flow.rb:679:13:683:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:682:15:682:25 | call to taint | hash_flow.rb:679:13:683:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:684:5:684:9 | hash2 : Hash [element :d] | hash_flow.rb:689:25:689:29 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:684:5:684:9 | hash2 : Hash [element :f] | hash_flow.rb:689:25:689:29 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:684:13:688:5 | call to [] : Hash [element :d] | hash_flow.rb:684:5:684:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:684:13:688:5 | call to [] : Hash [element :f] | hash_flow.rb:684:5:684:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:685:15:685:25 | call to taint | hash_flow.rb:684:13:688:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:687:15:687:25 | call to taint | hash_flow.rb:684:13:688:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :a] | hash_flow.rb:694:11:694:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :c] | hash_flow.rb:696:11:696:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :d] | hash_flow.rb:697:11:697:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :f] | hash_flow.rb:699:11:699:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :a] | hash_flow.rb:701:11:701:15 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :c] | hash_flow.rb:703:11:703:15 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :d] | hash_flow.rb:704:11:704:15 | hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :f] | hash_flow.rb:706:11:706:15 | hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :a] | hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :a] | hash_flow.rb:689:12:693:7 | call to update : Hash [element :a] | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :a] | hash_flow.rb:689:41:689:49 | old_value | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :a] | hash_flow.rb:689:52:689:60 | new_value | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :c] | hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :c] | hash_flow.rb:689:12:693:7 | call to update : Hash [element :c] | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :c] | hash_flow.rb:689:41:689:49 | old_value | provenance | | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :c] | hash_flow.rb:689:52:689:60 | new_value | provenance | | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :a] | hash_flow.rb:689:5:689:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :c] | hash_flow.rb:689:5:689:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :d] | hash_flow.rb:689:5:689:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :f] | hash_flow.rb:689:5:689:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :d] | hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :d] | hash_flow.rb:689:12:693:7 | call to update : Hash [element :d] | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :d] | hash_flow.rb:689:41:689:49 | old_value | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :d] | hash_flow.rb:689:52:689:60 | new_value | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :f] | hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :f] | hash_flow.rb:689:12:693:7 | call to update : Hash [element :f] | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :f] | hash_flow.rb:689:41:689:49 | old_value | provenance | | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :f] | hash_flow.rb:689:52:689:60 | new_value | provenance | | | hash_flow.rb:689:41:689:49 | old_value | hash_flow.rb:691:14:691:22 | old_value | provenance | | | hash_flow.rb:689:52:689:60 | new_value | hash_flow.rb:692:14:692:22 | new_value | provenance | | -| hash_flow.rb:694:11:694:14 | hash [element :a] | hash_flow.rb:694:11:694:18 | ...[...] | provenance | | +| hash_flow.rb:694:11:694:14 | hash : Hash [element :a] | hash_flow.rb:694:11:694:18 | ...[...] | provenance | | | hash_flow.rb:694:11:694:18 | ...[...] | hash_flow.rb:694:10:694:19 | ( ... ) | provenance | | -| hash_flow.rb:696:11:696:14 | hash [element :c] | hash_flow.rb:696:11:696:18 | ...[...] | provenance | | +| hash_flow.rb:696:11:696:14 | hash : Hash [element :c] | hash_flow.rb:696:11:696:18 | ...[...] | provenance | | | hash_flow.rb:696:11:696:18 | ...[...] | hash_flow.rb:696:10:696:19 | ( ... ) | provenance | | -| hash_flow.rb:697:11:697:14 | hash [element :d] | hash_flow.rb:697:11:697:18 | ...[...] | provenance | | +| hash_flow.rb:697:11:697:14 | hash : Hash [element :d] | hash_flow.rb:697:11:697:18 | ...[...] | provenance | | | hash_flow.rb:697:11:697:18 | ...[...] | hash_flow.rb:697:10:697:19 | ( ... ) | provenance | | -| hash_flow.rb:699:11:699:14 | hash [element :f] | hash_flow.rb:699:11:699:18 | ...[...] | provenance | | +| hash_flow.rb:699:11:699:14 | hash : Hash [element :f] | hash_flow.rb:699:11:699:18 | ...[...] | provenance | | | hash_flow.rb:699:11:699:18 | ...[...] | hash_flow.rb:699:10:699:19 | ( ... ) | provenance | | -| hash_flow.rb:701:11:701:15 | hash1 [element :a] | hash_flow.rb:701:11:701:19 | ...[...] | provenance | | +| hash_flow.rb:701:11:701:15 | hash1 : Hash [element :a] | hash_flow.rb:701:11:701:19 | ...[...] | provenance | | | hash_flow.rb:701:11:701:19 | ...[...] | hash_flow.rb:701:10:701:20 | ( ... ) | provenance | | -| hash_flow.rb:703:11:703:15 | hash1 [element :c] | hash_flow.rb:703:11:703:19 | ...[...] | provenance | | +| hash_flow.rb:703:11:703:15 | hash1 : Hash [element :c] | hash_flow.rb:703:11:703:19 | ...[...] | provenance | | | hash_flow.rb:703:11:703:19 | ...[...] | hash_flow.rb:703:10:703:20 | ( ... ) | provenance | | -| hash_flow.rb:704:11:704:15 | hash1 [element :d] | hash_flow.rb:704:11:704:19 | ...[...] | provenance | | +| hash_flow.rb:704:11:704:15 | hash1 : Hash [element :d] | hash_flow.rb:704:11:704:19 | ...[...] | provenance | | | hash_flow.rb:704:11:704:19 | ...[...] | hash_flow.rb:704:10:704:20 | ( ... ) | provenance | | -| hash_flow.rb:706:11:706:15 | hash1 [element :f] | hash_flow.rb:706:11:706:19 | ...[...] | provenance | | +| hash_flow.rb:706:11:706:15 | hash1 : Hash [element :f] | hash_flow.rb:706:11:706:19 | ...[...] | provenance | | | hash_flow.rb:706:11:706:19 | ...[...] | hash_flow.rb:706:10:706:20 | ( ... ) | provenance | | -| hash_flow.rb:712:5:712:8 | hash [element :a] | hash_flow.rb:717:9:717:12 | hash [element :a] | provenance | | -| hash_flow.rb:712:5:712:8 | hash [element :c] | hash_flow.rb:717:9:717:12 | hash [element :c] | provenance | | -| hash_flow.rb:712:12:716:5 | call to [] [element :a] | hash_flow.rb:712:5:712:8 | hash [element :a] | provenance | | -| hash_flow.rb:712:12:716:5 | call to [] [element :c] | hash_flow.rb:712:5:712:8 | hash [element :c] | provenance | | -| hash_flow.rb:713:15:713:25 | call to taint | hash_flow.rb:712:12:716:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:715:15:715:25 | call to taint | hash_flow.rb:712:12:716:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:717:5:717:5 | a [element] | hash_flow.rb:718:11:718:11 | a [element] | provenance | | -| hash_flow.rb:717:9:717:12 | hash [element :a] | hash_flow.rb:717:9:717:19 | call to values [element] | provenance | | -| hash_flow.rb:717:9:717:12 | hash [element :c] | hash_flow.rb:717:9:717:19 | call to values [element] | provenance | | -| hash_flow.rb:717:9:717:19 | call to values [element] | hash_flow.rb:717:5:717:5 | a [element] | provenance | | -| hash_flow.rb:718:11:718:11 | a [element] | hash_flow.rb:718:11:718:14 | ...[...] | provenance | | +| hash_flow.rb:712:5:712:8 | hash : Hash [element :a] | hash_flow.rb:717:9:717:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:712:5:712:8 | hash : Hash [element :c] | hash_flow.rb:717:9:717:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:712:12:716:5 | call to [] : Hash [element :a] | hash_flow.rb:712:5:712:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:712:12:716:5 | call to [] : Hash [element :c] | hash_flow.rb:712:5:712:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:713:15:713:25 | call to taint | hash_flow.rb:712:12:716:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:715:15:715:25 | call to taint | hash_flow.rb:712:12:716:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:717:5:717:5 | a : [collection] [element] | hash_flow.rb:718:11:718:11 | a : [collection] [element] | provenance | | +| hash_flow.rb:717:9:717:12 | hash : Hash [element :a] | hash_flow.rb:717:9:717:19 | call to values : [collection] [element] | provenance | | +| hash_flow.rb:717:9:717:12 | hash : Hash [element :c] | hash_flow.rb:717:9:717:19 | call to values : [collection] [element] | provenance | | +| hash_flow.rb:717:9:717:19 | call to values : [collection] [element] | hash_flow.rb:717:5:717:5 | a : [collection] [element] | provenance | | +| hash_flow.rb:718:11:718:11 | a : [collection] [element] | hash_flow.rb:718:11:718:14 | ...[...] | provenance | | | hash_flow.rb:718:11:718:14 | ...[...] | hash_flow.rb:718:10:718:15 | ( ... ) | provenance | | -| hash_flow.rb:724:5:724:8 | hash [element :a] | hash_flow.rb:729:9:729:12 | hash [element :a] | provenance | | -| hash_flow.rb:724:5:724:8 | hash [element :a] | hash_flow.rb:731:9:731:12 | hash [element :a] | provenance | | -| hash_flow.rb:724:5:724:8 | hash [element :c] | hash_flow.rb:731:9:731:12 | hash [element :c] | provenance | | -| hash_flow.rb:724:12:728:5 | call to [] [element :a] | hash_flow.rb:724:5:724:8 | hash [element :a] | provenance | | -| hash_flow.rb:724:12:728:5 | call to [] [element :c] | hash_flow.rb:724:5:724:8 | hash [element :c] | provenance | | -| hash_flow.rb:725:15:725:25 | call to taint | hash_flow.rb:724:12:728:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:727:15:727:25 | call to taint | hash_flow.rb:724:12:728:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:729:5:729:5 | b [element 0] | hash_flow.rb:730:10:730:10 | b [element 0] | provenance | | -| hash_flow.rb:729:9:729:12 | hash [element :a] | hash_flow.rb:729:9:729:26 | call to values_at [element 0] | provenance | | -| hash_flow.rb:729:9:729:26 | call to values_at [element 0] | hash_flow.rb:729:5:729:5 | b [element 0] | provenance | | -| hash_flow.rb:730:10:730:10 | b [element 0] | hash_flow.rb:730:10:730:13 | ...[...] | provenance | | -| hash_flow.rb:731:5:731:5 | b [element] | hash_flow.rb:732:10:732:10 | b [element] | provenance | | -| hash_flow.rb:731:9:731:12 | hash [element :a] | hash_flow.rb:731:9:731:31 | call to fetch_values [element] | provenance | | -| hash_flow.rb:731:9:731:12 | hash [element :c] | hash_flow.rb:731:9:731:31 | call to fetch_values [element] | provenance | | -| hash_flow.rb:731:9:731:31 | call to fetch_values [element] | hash_flow.rb:731:5:731:5 | b [element] | provenance | | -| hash_flow.rb:732:10:732:10 | b [element] | hash_flow.rb:732:10:732:13 | ...[...] | provenance | | -| hash_flow.rb:738:5:738:9 | hash1 [element :a] | hash_flow.rb:748:16:748:20 | hash1 [element :a] | provenance | | -| hash_flow.rb:738:5:738:9 | hash1 [element :c] | hash_flow.rb:748:16:748:20 | hash1 [element :c] | provenance | | -| hash_flow.rb:738:13:742:5 | call to [] [element :a] | hash_flow.rb:738:5:738:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:738:13:742:5 | call to [] [element :c] | hash_flow.rb:738:5:738:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:739:15:739:25 | call to taint | hash_flow.rb:738:13:742:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:741:15:741:25 | call to taint | hash_flow.rb:738:13:742:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:743:5:743:9 | hash2 [element :d] | hash_flow.rb:748:44:748:48 | hash2 [element :d] | provenance | | -| hash_flow.rb:743:5:743:9 | hash2 [element :f] | hash_flow.rb:748:44:748:48 | hash2 [element :f] | provenance | | -| hash_flow.rb:743:13:747:5 | call to [] [element :d] | hash_flow.rb:743:5:743:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:743:13:747:5 | call to [] [element :f] | hash_flow.rb:743:5:743:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:744:15:744:25 | call to taint | hash_flow.rb:743:13:747:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:746:15:746:25 | call to taint | hash_flow.rb:743:13:747:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:748:5:748:8 | hash [element :a] | hash_flow.rb:749:10:749:13 | hash [element :a] | provenance | | -| hash_flow.rb:748:5:748:8 | hash [element :c] | hash_flow.rb:751:10:751:13 | hash [element :c] | provenance | | -| hash_flow.rb:748:5:748:8 | hash [element :d] | hash_flow.rb:752:10:752:13 | hash [element :d] | provenance | | -| hash_flow.rb:748:5:748:8 | hash [element :f] | hash_flow.rb:754:10:754:13 | hash [element :f] | provenance | | -| hash_flow.rb:748:5:748:8 | hash [element :g] | hash_flow.rb:755:10:755:13 | hash [element :g] | provenance | | -| hash_flow.rb:748:12:748:59 | call to [] [element :a] | hash_flow.rb:748:5:748:8 | hash [element :a] | provenance | | -| hash_flow.rb:748:12:748:59 | call to [] [element :c] | hash_flow.rb:748:5:748:8 | hash [element :c] | provenance | | -| hash_flow.rb:748:12:748:59 | call to [] [element :d] | hash_flow.rb:748:5:748:8 | hash [element :d] | provenance | | -| hash_flow.rb:748:12:748:59 | call to [] [element :f] | hash_flow.rb:748:5:748:8 | hash [element :f] | provenance | | -| hash_flow.rb:748:12:748:59 | call to [] [element :g] | hash_flow.rb:748:5:748:8 | hash [element :g] | provenance | | -| hash_flow.rb:748:14:748:20 | ** ... [element :a] | hash_flow.rb:748:12:748:59 | call to [] [element :a] | provenance | | -| hash_flow.rb:748:14:748:20 | ** ... [element :c] | hash_flow.rb:748:12:748:59 | call to [] [element :c] | provenance | | -| hash_flow.rb:748:16:748:20 | hash1 [element :a] | hash_flow.rb:748:14:748:20 | ** ... [element :a] | provenance | | -| hash_flow.rb:748:16:748:20 | hash1 [element :c] | hash_flow.rb:748:14:748:20 | ** ... [element :c] | provenance | | -| hash_flow.rb:748:29:748:39 | call to taint | hash_flow.rb:748:12:748:59 | call to [] [element :g] | provenance | | -| hash_flow.rb:748:42:748:48 | ** ... [element :d] | hash_flow.rb:748:12:748:59 | call to [] [element :d] | provenance | | -| hash_flow.rb:748:42:748:48 | ** ... [element :f] | hash_flow.rb:748:12:748:59 | call to [] [element :f] | provenance | | -| hash_flow.rb:748:44:748:48 | hash2 [element :d] | hash_flow.rb:748:42:748:48 | ** ... [element :d] | provenance | | -| hash_flow.rb:748:44:748:48 | hash2 [element :f] | hash_flow.rb:748:42:748:48 | ** ... [element :f] | provenance | | -| hash_flow.rb:749:10:749:13 | hash [element :a] | hash_flow.rb:749:10:749:17 | ...[...] | provenance | | -| hash_flow.rb:751:10:751:13 | hash [element :c] | hash_flow.rb:751:10:751:17 | ...[...] | provenance | | -| hash_flow.rb:752:10:752:13 | hash [element :d] | hash_flow.rb:752:10:752:17 | ...[...] | provenance | | -| hash_flow.rb:754:10:754:13 | hash [element :f] | hash_flow.rb:754:10:754:17 | ...[...] | provenance | | -| hash_flow.rb:755:10:755:13 | hash [element :g] | hash_flow.rb:755:10:755:17 | ...[...] | provenance | | -| hash_flow.rb:762:5:762:8 | hash [element :a] | hash_flow.rb:769:10:769:13 | hash [element :a] | provenance | | -| hash_flow.rb:762:5:762:8 | hash [element :c] | hash_flow.rb:771:10:771:13 | hash [element :c] | provenance | | -| hash_flow.rb:762:5:762:8 | hash [element :c] | hash_flow.rb:774:9:774:12 | hash [element :c] | provenance | | -| hash_flow.rb:762:5:762:8 | hash [element :d] | hash_flow.rb:772:10:772:13 | hash [element :d] | provenance | | -| hash_flow.rb:762:12:767:5 | call to [] [element :a] | hash_flow.rb:762:5:762:8 | hash [element :a] | provenance | | -| hash_flow.rb:762:12:767:5 | call to [] [element :c] | hash_flow.rb:762:5:762:8 | hash [element :c] | provenance | | -| hash_flow.rb:762:12:767:5 | call to [] [element :d] | hash_flow.rb:762:5:762:8 | hash [element :d] | provenance | | -| hash_flow.rb:763:15:763:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:766:15:766:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:769:10:769:13 | hash [element :a] | hash_flow.rb:769:10:769:17 | ...[...] | provenance | | -| hash_flow.rb:771:10:771:13 | hash [element :c] | hash_flow.rb:771:10:771:17 | ...[...] | provenance | | -| hash_flow.rb:772:10:772:13 | hash [element :d] | hash_flow.rb:772:10:772:17 | ...[...] | provenance | | -| hash_flow.rb:774:5:774:5 | x [element :c] | hash_flow.rb:778:10:778:10 | x [element :c] | provenance | | -| hash_flow.rb:774:9:774:12 | [post] hash [element :c] | hash_flow.rb:783:10:783:13 | hash [element :c] | provenance | | -| hash_flow.rb:774:9:774:12 | hash [element :c] | hash_flow.rb:774:9:774:12 | [post] hash [element :c] | provenance | | -| hash_flow.rb:774:9:774:12 | hash [element :c] | hash_flow.rb:774:9:774:31 | call to except! [element :c] | provenance | | -| hash_flow.rb:774:9:774:31 | call to except! [element :c] | hash_flow.rb:774:5:774:5 | x [element :c] | provenance | | -| hash_flow.rb:778:10:778:10 | x [element :c] | hash_flow.rb:778:10:778:14 | ...[...] | provenance | | -| hash_flow.rb:783:10:783:13 | hash [element :c] | hash_flow.rb:783:10:783:17 | ...[...] | provenance | | -| hash_flow.rb:790:5:790:9 | hash1 [element :a] | hash_flow.rb:800:12:800:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:790:5:790:9 | hash1 [element :c] | hash_flow.rb:800:12:800:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:790:13:794:5 | call to [] [element :a] | hash_flow.rb:790:5:790:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:790:13:794:5 | call to [] [element :c] | hash_flow.rb:790:5:790:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:790:13:794:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:790:13:794:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:795:5:795:9 | hash2 [element :d] | hash_flow.rb:800:29:800:33 | hash2 [element :d] | provenance | | -| hash_flow.rb:795:5:795:9 | hash2 [element :f] | hash_flow.rb:800:29:800:33 | hash2 [element :f] | provenance | | -| hash_flow.rb:795:13:799:5 | call to [] [element :d] | hash_flow.rb:795:5:795:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:795:13:799:5 | call to [] [element :f] | hash_flow.rb:795:5:795:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:795:13:799:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:795:13:799:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:800:5:800:8 | hash [element :a] | hash_flow.rb:805:11:805:14 | hash [element :a] | provenance | | -| hash_flow.rb:800:5:800:8 | hash [element :c] | hash_flow.rb:807:11:807:14 | hash [element :c] | provenance | | -| hash_flow.rb:800:5:800:8 | hash [element :d] | hash_flow.rb:808:11:808:14 | hash [element :d] | provenance | | -| hash_flow.rb:800:5:800:8 | hash [element :f] | hash_flow.rb:810:11:810:14 | hash [element :f] | provenance | | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] | provenance | | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] | hash_flow.rb:800:45:800:53 | old_value | provenance | | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] | hash_flow.rb:800:56:800:64 | new_value | provenance | | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] | provenance | | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] | hash_flow.rb:800:45:800:53 | old_value | provenance | | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] | hash_flow.rb:800:56:800:64 | new_value | provenance | | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] | hash_flow.rb:800:5:800:8 | hash [element :a] | provenance | | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] | hash_flow.rb:800:5:800:8 | hash [element :c] | provenance | | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] | hash_flow.rb:800:5:800:8 | hash [element :d] | provenance | | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] | hash_flow.rb:800:5:800:8 | hash [element :f] | provenance | | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] | provenance | | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] | hash_flow.rb:800:45:800:53 | old_value | provenance | | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] | hash_flow.rb:800:56:800:64 | new_value | provenance | | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] | hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] | provenance | | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] | hash_flow.rb:800:45:800:53 | old_value | provenance | | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] | hash_flow.rb:800:56:800:64 | new_value | provenance | | +| hash_flow.rb:724:5:724:8 | hash : Hash [element :a] | hash_flow.rb:729:9:729:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:724:5:724:8 | hash : Hash [element :a] | hash_flow.rb:731:9:731:12 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:724:5:724:8 | hash : Hash [element :c] | hash_flow.rb:731:9:731:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:724:12:728:5 | call to [] : Hash [element :a] | hash_flow.rb:724:5:724:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:724:12:728:5 | call to [] : Hash [element :c] | hash_flow.rb:724:5:724:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:725:15:725:25 | call to taint | hash_flow.rb:724:12:728:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:727:15:727:25 | call to taint | hash_flow.rb:724:12:728:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:729:5:729:5 | b : [collection] [element 0] | hash_flow.rb:730:10:730:10 | b : [collection] [element 0] | provenance | | +| hash_flow.rb:729:9:729:12 | hash : Hash [element :a] | hash_flow.rb:729:9:729:26 | call to values_at : [collection] [element 0] | provenance | | +| hash_flow.rb:729:9:729:26 | call to values_at : [collection] [element 0] | hash_flow.rb:729:5:729:5 | b : [collection] [element 0] | provenance | | +| hash_flow.rb:730:10:730:10 | b : [collection] [element 0] | hash_flow.rb:730:10:730:13 | ...[...] | provenance | | +| hash_flow.rb:731:5:731:5 | b : [collection] [element] | hash_flow.rb:732:10:732:10 | b : [collection] [element] | provenance | | +| hash_flow.rb:731:9:731:12 | hash : Hash [element :a] | hash_flow.rb:731:9:731:31 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:731:9:731:12 | hash : Hash [element :c] | hash_flow.rb:731:9:731:31 | call to fetch_values : [collection] [element] | provenance | | +| hash_flow.rb:731:9:731:31 | call to fetch_values : [collection] [element] | hash_flow.rb:731:5:731:5 | b : [collection] [element] | provenance | | +| hash_flow.rb:732:10:732:10 | b : [collection] [element] | hash_flow.rb:732:10:732:13 | ...[...] | provenance | | +| hash_flow.rb:738:5:738:9 | hash1 : Hash [element :a] | hash_flow.rb:748:16:748:20 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:738:5:738:9 | hash1 : Hash [element :c] | hash_flow.rb:748:16:748:20 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:738:13:742:5 | call to [] : Hash [element :a] | hash_flow.rb:738:5:738:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:738:13:742:5 | call to [] : Hash [element :c] | hash_flow.rb:738:5:738:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:739:15:739:25 | call to taint | hash_flow.rb:738:13:742:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:741:15:741:25 | call to taint | hash_flow.rb:738:13:742:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:743:5:743:9 | hash2 : Hash [element :d] | hash_flow.rb:748:44:748:48 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:743:5:743:9 | hash2 : Hash [element :f] | hash_flow.rb:748:44:748:48 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:743:13:747:5 | call to [] : Hash [element :d] | hash_flow.rb:743:5:743:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:743:13:747:5 | call to [] : Hash [element :f] | hash_flow.rb:743:5:743:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:744:15:744:25 | call to taint | hash_flow.rb:743:13:747:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:746:15:746:25 | call to taint | hash_flow.rb:743:13:747:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :a] | hash_flow.rb:749:10:749:13 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :c] | hash_flow.rb:751:10:751:13 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :d] | hash_flow.rb:752:10:752:13 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :f] | hash_flow.rb:754:10:754:13 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :g] | hash_flow.rb:755:10:755:13 | hash : Hash [element :g] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :a] | hash_flow.rb:748:5:748:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :c] | hash_flow.rb:748:5:748:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :d] | hash_flow.rb:748:5:748:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :f] | hash_flow.rb:748:5:748:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :g] | hash_flow.rb:748:5:748:8 | hash : Hash [element :g] | provenance | | +| hash_flow.rb:748:14:748:20 | ** ... : Hash [element :a] | hash_flow.rb:748:12:748:59 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:748:14:748:20 | ** ... : Hash [element :c] | hash_flow.rb:748:12:748:59 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:748:16:748:20 | hash1 : Hash [element :a] | hash_flow.rb:748:14:748:20 | ** ... : Hash [element :a] | provenance | | +| hash_flow.rb:748:16:748:20 | hash1 : Hash [element :c] | hash_flow.rb:748:14:748:20 | ** ... : Hash [element :c] | provenance | | +| hash_flow.rb:748:29:748:39 | call to taint | hash_flow.rb:748:12:748:59 | call to [] : Hash [element :g] | provenance | | +| hash_flow.rb:748:42:748:48 | ** ... : Hash [element :d] | hash_flow.rb:748:12:748:59 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:748:42:748:48 | ** ... : Hash [element :f] | hash_flow.rb:748:12:748:59 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:748:44:748:48 | hash2 : Hash [element :d] | hash_flow.rb:748:42:748:48 | ** ... : Hash [element :d] | provenance | | +| hash_flow.rb:748:44:748:48 | hash2 : Hash [element :f] | hash_flow.rb:748:42:748:48 | ** ... : Hash [element :f] | provenance | | +| hash_flow.rb:749:10:749:13 | hash : Hash [element :a] | hash_flow.rb:749:10:749:17 | ...[...] | provenance | | +| hash_flow.rb:751:10:751:13 | hash : Hash [element :c] | hash_flow.rb:751:10:751:17 | ...[...] | provenance | | +| hash_flow.rb:752:10:752:13 | hash : Hash [element :d] | hash_flow.rb:752:10:752:17 | ...[...] | provenance | | +| hash_flow.rb:754:10:754:13 | hash : Hash [element :f] | hash_flow.rb:754:10:754:17 | ...[...] | provenance | | +| hash_flow.rb:755:10:755:13 | hash : Hash [element :g] | hash_flow.rb:755:10:755:17 | ...[...] | provenance | | +| hash_flow.rb:762:5:762:8 | hash : Hash [element :a] | hash_flow.rb:769:10:769:13 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:762:5:762:8 | hash : Hash [element :c] | hash_flow.rb:771:10:771:13 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:762:5:762:8 | hash : Hash [element :c] | hash_flow.rb:774:9:774:12 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:762:5:762:8 | hash : Hash [element :d] | hash_flow.rb:772:10:772:13 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:762:12:767:5 | call to [] : Hash [element :a] | hash_flow.rb:762:5:762:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:762:12:767:5 | call to [] : Hash [element :c] | hash_flow.rb:762:5:762:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:762:12:767:5 | call to [] : Hash [element :d] | hash_flow.rb:762:5:762:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:763:15:763:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:765:15:765:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:766:15:766:25 | call to taint | hash_flow.rb:762:12:767:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:769:10:769:13 | hash : Hash [element :a] | hash_flow.rb:769:10:769:17 | ...[...] | provenance | | +| hash_flow.rb:771:10:771:13 | hash : Hash [element :c] | hash_flow.rb:771:10:771:17 | ...[...] | provenance | | +| hash_flow.rb:772:10:772:13 | hash : Hash [element :d] | hash_flow.rb:772:10:772:17 | ...[...] | provenance | | +| hash_flow.rb:774:5:774:5 | x : Hash [element :c] | hash_flow.rb:778:10:778:10 | x : Hash [element :c] | provenance | | +| hash_flow.rb:774:9:774:12 | [post] hash : Hash [element :c] | hash_flow.rb:783:10:783:13 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:774:9:774:12 | hash : Hash [element :c] | hash_flow.rb:774:9:774:12 | [post] hash : Hash [element :c] | provenance | | +| hash_flow.rb:774:9:774:12 | hash : Hash [element :c] | hash_flow.rb:774:9:774:31 | call to except! : Hash [element :c] | provenance | | +| hash_flow.rb:774:9:774:31 | call to except! : Hash [element :c] | hash_flow.rb:774:5:774:5 | x : Hash [element :c] | provenance | | +| hash_flow.rb:778:10:778:10 | x : Hash [element :c] | hash_flow.rb:778:10:778:14 | ...[...] | provenance | | +| hash_flow.rb:783:10:783:13 | hash : Hash [element :c] | hash_flow.rb:783:10:783:17 | ...[...] | provenance | | +| hash_flow.rb:790:5:790:9 | hash1 : Hash [element :a] | hash_flow.rb:800:12:800:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:790:5:790:9 | hash1 : Hash [element :c] | hash_flow.rb:800:12:800:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:790:13:794:5 | call to [] : Hash [element :a] | hash_flow.rb:790:5:790:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:790:13:794:5 | call to [] : Hash [element :c] | hash_flow.rb:790:5:790:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:791:15:791:25 | call to taint | hash_flow.rb:790:13:794:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:793:15:793:25 | call to taint | hash_flow.rb:790:13:794:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:795:5:795:9 | hash2 : Hash [element :d] | hash_flow.rb:800:29:800:33 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:795:5:795:9 | hash2 : Hash [element :f] | hash_flow.rb:800:29:800:33 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:795:13:799:5 | call to [] : Hash [element :d] | hash_flow.rb:795:5:795:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:795:13:799:5 | call to [] : Hash [element :f] | hash_flow.rb:795:5:795:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:796:15:796:25 | call to taint | hash_flow.rb:795:13:799:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:798:15:798:25 | call to taint | hash_flow.rb:795:13:799:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :a] | hash_flow.rb:805:11:805:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :c] | hash_flow.rb:807:11:807:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :d] | hash_flow.rb:808:11:808:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :f] | hash_flow.rb:810:11:810:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :a] | hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :a] | provenance | | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :a] | hash_flow.rb:800:45:800:53 | old_value | provenance | | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :a] | hash_flow.rb:800:56:800:64 | new_value | provenance | | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :c] | hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :c] | provenance | | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :c] | hash_flow.rb:800:45:800:53 | old_value | provenance | | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :c] | hash_flow.rb:800:56:800:64 | new_value | provenance | | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :a] | hash_flow.rb:800:5:800:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :c] | hash_flow.rb:800:5:800:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :d] | hash_flow.rb:800:5:800:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :f] | hash_flow.rb:800:5:800:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :d] | hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :d] | provenance | | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :d] | hash_flow.rb:800:45:800:53 | old_value | provenance | | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :d] | hash_flow.rb:800:56:800:64 | new_value | provenance | | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :f] | hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :f] | provenance | | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :f] | hash_flow.rb:800:45:800:53 | old_value | provenance | | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :f] | hash_flow.rb:800:56:800:64 | new_value | provenance | | | hash_flow.rb:800:45:800:53 | old_value | hash_flow.rb:802:14:802:22 | old_value | provenance | | | hash_flow.rb:800:56:800:64 | new_value | hash_flow.rb:803:14:803:22 | new_value | provenance | | -| hash_flow.rb:805:11:805:14 | hash [element :a] | hash_flow.rb:805:11:805:18 | ...[...] | provenance | | +| hash_flow.rb:805:11:805:14 | hash : Hash [element :a] | hash_flow.rb:805:11:805:18 | ...[...] | provenance | | | hash_flow.rb:805:11:805:18 | ...[...] | hash_flow.rb:805:10:805:19 | ( ... ) | provenance | | -| hash_flow.rb:807:11:807:14 | hash [element :c] | hash_flow.rb:807:11:807:18 | ...[...] | provenance | | +| hash_flow.rb:807:11:807:14 | hash : Hash [element :c] | hash_flow.rb:807:11:807:18 | ...[...] | provenance | | | hash_flow.rb:807:11:807:18 | ...[...] | hash_flow.rb:807:10:807:19 | ( ... ) | provenance | | -| hash_flow.rb:808:11:808:14 | hash [element :d] | hash_flow.rb:808:11:808:18 | ...[...] | provenance | | +| hash_flow.rb:808:11:808:14 | hash : Hash [element :d] | hash_flow.rb:808:11:808:18 | ...[...] | provenance | | | hash_flow.rb:808:11:808:18 | ...[...] | hash_flow.rb:808:10:808:19 | ( ... ) | provenance | | -| hash_flow.rb:810:11:810:14 | hash [element :f] | hash_flow.rb:810:11:810:18 | ...[...] | provenance | | +| hash_flow.rb:810:11:810:14 | hash : Hash [element :f] | hash_flow.rb:810:11:810:18 | ...[...] | provenance | | | hash_flow.rb:810:11:810:18 | ...[...] | hash_flow.rb:810:10:810:19 | ( ... ) | provenance | | -| hash_flow.rb:816:5:816:9 | hash1 [element :a] | hash_flow.rb:826:12:826:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:816:5:816:9 | hash1 [element :c] | hash_flow.rb:826:12:826:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:816:13:820:5 | call to [] [element :a] | hash_flow.rb:816:5:816:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:816:13:820:5 | call to [] [element :c] | hash_flow.rb:816:5:816:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:816:13:820:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:816:13:820:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:821:5:821:9 | hash2 [element :d] | hash_flow.rb:826:30:826:34 | hash2 [element :d] | provenance | | -| hash_flow.rb:821:5:821:9 | hash2 [element :f] | hash_flow.rb:826:30:826:34 | hash2 [element :f] | provenance | | -| hash_flow.rb:821:13:825:5 | call to [] [element :d] | hash_flow.rb:821:5:821:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:821:13:825:5 | call to [] [element :f] | hash_flow.rb:821:5:821:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:821:13:825:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:821:13:825:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:826:5:826:8 | hash [element :a] | hash_flow.rb:831:11:831:14 | hash [element :a] | provenance | | -| hash_flow.rb:826:5:826:8 | hash [element :c] | hash_flow.rb:833:11:833:14 | hash [element :c] | provenance | | -| hash_flow.rb:826:5:826:8 | hash [element :d] | hash_flow.rb:834:11:834:14 | hash [element :d] | provenance | | -| hash_flow.rb:826:5:826:8 | hash [element :f] | hash_flow.rb:836:11:836:14 | hash [element :f] | provenance | | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] | hash_flow.rb:838:11:838:15 | hash1 [element :a] | provenance | | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] | hash_flow.rb:840:11:840:15 | hash1 [element :c] | provenance | | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] | hash_flow.rb:841:11:841:15 | hash1 [element :d] | provenance | | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] | hash_flow.rb:843:11:843:15 | hash1 [element :f] | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:46:826:54 | old_value | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] | hash_flow.rb:826:57:826:65 | new_value | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:46:826:54 | old_value | provenance | | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] | hash_flow.rb:826:57:826:65 | new_value | provenance | | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] | hash_flow.rb:826:5:826:8 | hash [element :a] | provenance | | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] | hash_flow.rb:826:5:826:8 | hash [element :c] | provenance | | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] | hash_flow.rb:826:5:826:8 | hash [element :d] | provenance | | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] | hash_flow.rb:826:5:826:8 | hash [element :f] | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:46:826:54 | old_value | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] | hash_flow.rb:826:57:826:65 | new_value | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:46:826:54 | old_value | provenance | | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] | hash_flow.rb:826:57:826:65 | new_value | provenance | | +| hash_flow.rb:816:5:816:9 | hash1 : Hash [element :a] | hash_flow.rb:826:12:826:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:816:5:816:9 | hash1 : Hash [element :c] | hash_flow.rb:826:12:826:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:816:13:820:5 | call to [] : Hash [element :a] | hash_flow.rb:816:5:816:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:816:13:820:5 | call to [] : Hash [element :c] | hash_flow.rb:816:5:816:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:817:15:817:25 | call to taint | hash_flow.rb:816:13:820:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:819:15:819:25 | call to taint | hash_flow.rb:816:13:820:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:821:5:821:9 | hash2 : Hash [element :d] | hash_flow.rb:826:30:826:34 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:821:5:821:9 | hash2 : Hash [element :f] | hash_flow.rb:826:30:826:34 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:821:13:825:5 | call to [] : Hash [element :d] | hash_flow.rb:821:5:821:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:821:13:825:5 | call to [] : Hash [element :f] | hash_flow.rb:821:5:821:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:822:15:822:25 | call to taint | hash_flow.rb:821:13:825:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:824:15:824:25 | call to taint | hash_flow.rb:821:13:825:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :a] | hash_flow.rb:831:11:831:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :c] | hash_flow.rb:833:11:833:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :d] | hash_flow.rb:834:11:834:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :f] | hash_flow.rb:836:11:836:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :a] | hash_flow.rb:838:11:838:15 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :c] | hash_flow.rb:840:11:840:15 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :d] | hash_flow.rb:841:11:841:15 | hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :f] | hash_flow.rb:843:11:843:15 | hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :a] | hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :a] | hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :a] | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :a] | hash_flow.rb:826:46:826:54 | old_value | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :a] | hash_flow.rb:826:57:826:65 | new_value | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :c] | hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :c] | hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :c] | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :c] | hash_flow.rb:826:46:826:54 | old_value | provenance | | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :c] | hash_flow.rb:826:57:826:65 | new_value | provenance | | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :a] | hash_flow.rb:826:5:826:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :c] | hash_flow.rb:826:5:826:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :d] | hash_flow.rb:826:5:826:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :f] | hash_flow.rb:826:5:826:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :d] | hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :d] | hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :d] | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :d] | hash_flow.rb:826:46:826:54 | old_value | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :d] | hash_flow.rb:826:57:826:65 | new_value | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :f] | hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :f] | hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :f] | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :f] | hash_flow.rb:826:46:826:54 | old_value | provenance | | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :f] | hash_flow.rb:826:57:826:65 | new_value | provenance | | | hash_flow.rb:826:46:826:54 | old_value | hash_flow.rb:828:14:828:22 | old_value | provenance | | | hash_flow.rb:826:57:826:65 | new_value | hash_flow.rb:829:14:829:22 | new_value | provenance | | -| hash_flow.rb:831:11:831:14 | hash [element :a] | hash_flow.rb:831:11:831:18 | ...[...] | provenance | | +| hash_flow.rb:831:11:831:14 | hash : Hash [element :a] | hash_flow.rb:831:11:831:18 | ...[...] | provenance | | | hash_flow.rb:831:11:831:18 | ...[...] | hash_flow.rb:831:10:831:19 | ( ... ) | provenance | | -| hash_flow.rb:833:11:833:14 | hash [element :c] | hash_flow.rb:833:11:833:18 | ...[...] | provenance | | +| hash_flow.rb:833:11:833:14 | hash : Hash [element :c] | hash_flow.rb:833:11:833:18 | ...[...] | provenance | | | hash_flow.rb:833:11:833:18 | ...[...] | hash_flow.rb:833:10:833:19 | ( ... ) | provenance | | -| hash_flow.rb:834:11:834:14 | hash [element :d] | hash_flow.rb:834:11:834:18 | ...[...] | provenance | | +| hash_flow.rb:834:11:834:14 | hash : Hash [element :d] | hash_flow.rb:834:11:834:18 | ...[...] | provenance | | | hash_flow.rb:834:11:834:18 | ...[...] | hash_flow.rb:834:10:834:19 | ( ... ) | provenance | | -| hash_flow.rb:836:11:836:14 | hash [element :f] | hash_flow.rb:836:11:836:18 | ...[...] | provenance | | +| hash_flow.rb:836:11:836:14 | hash : Hash [element :f] | hash_flow.rb:836:11:836:18 | ...[...] | provenance | | | hash_flow.rb:836:11:836:18 | ...[...] | hash_flow.rb:836:10:836:19 | ( ... ) | provenance | | -| hash_flow.rb:838:11:838:15 | hash1 [element :a] | hash_flow.rb:838:11:838:19 | ...[...] | provenance | | +| hash_flow.rb:838:11:838:15 | hash1 : Hash [element :a] | hash_flow.rb:838:11:838:19 | ...[...] | provenance | | | hash_flow.rb:838:11:838:19 | ...[...] | hash_flow.rb:838:10:838:20 | ( ... ) | provenance | | -| hash_flow.rb:840:11:840:15 | hash1 [element :c] | hash_flow.rb:840:11:840:19 | ...[...] | provenance | | +| hash_flow.rb:840:11:840:15 | hash1 : Hash [element :c] | hash_flow.rb:840:11:840:19 | ...[...] | provenance | | | hash_flow.rb:840:11:840:19 | ...[...] | hash_flow.rb:840:10:840:20 | ( ... ) | provenance | | -| hash_flow.rb:841:11:841:15 | hash1 [element :d] | hash_flow.rb:841:11:841:19 | ...[...] | provenance | | +| hash_flow.rb:841:11:841:15 | hash1 : Hash [element :d] | hash_flow.rb:841:11:841:19 | ...[...] | provenance | | | hash_flow.rb:841:11:841:19 | ...[...] | hash_flow.rb:841:10:841:20 | ( ... ) | provenance | | -| hash_flow.rb:843:11:843:15 | hash1 [element :f] | hash_flow.rb:843:11:843:19 | ...[...] | provenance | | +| hash_flow.rb:843:11:843:15 | hash1 : Hash [element :f] | hash_flow.rb:843:11:843:19 | ...[...] | provenance | | | hash_flow.rb:843:11:843:19 | ...[...] | hash_flow.rb:843:10:843:20 | ( ... ) | provenance | | -| hash_flow.rb:849:5:849:9 | hash1 [element :a] | hash_flow.rb:860:13:860:17 | hash1 [element :a] | provenance | | -| hash_flow.rb:849:5:849:9 | hash1 [element :a] | hash_flow.rb:869:13:869:17 | hash1 [element :a] | provenance | | -| hash_flow.rb:849:5:849:9 | hash1 [element :c] | hash_flow.rb:860:13:860:17 | hash1 [element :c] | provenance | | -| hash_flow.rb:849:5:849:9 | hash1 [element :c] | hash_flow.rb:869:13:869:17 | hash1 [element :c] | provenance | | -| hash_flow.rb:849:13:853:5 | call to [] [element :a] | hash_flow.rb:849:5:849:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:849:13:853:5 | call to [] [element :c] | hash_flow.rb:849:5:849:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:850:12:850:22 | call to taint | hash_flow.rb:849:13:853:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:852:12:852:22 | call to taint | hash_flow.rb:849:13:853:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:854:5:854:9 | hash2 [element :d] | hash_flow.rb:860:33:860:37 | hash2 [element :d] | provenance | | -| hash_flow.rb:854:5:854:9 | hash2 [element :d] | hash_flow.rb:869:33:869:37 | hash2 [element :d] | provenance | | -| hash_flow.rb:854:5:854:9 | hash2 [element :f] | hash_flow.rb:860:33:860:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:854:5:854:9 | hash2 [element :f] | hash_flow.rb:869:33:869:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:854:13:858:5 | call to [] [element :d] | hash_flow.rb:854:5:854:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:854:13:858:5 | call to [] [element :f] | hash_flow.rb:854:5:854:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:855:12:855:22 | call to taint | hash_flow.rb:854:13:858:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:857:12:857:22 | call to taint | hash_flow.rb:854:13:858:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:860:5:860:9 | hash3 [element :a] | hash_flow.rb:861:11:861:15 | hash3 [element :a] | provenance | | -| hash_flow.rb:860:5:860:9 | hash3 [element :c] | hash_flow.rb:863:11:863:15 | hash3 [element :c] | provenance | | -| hash_flow.rb:860:5:860:9 | hash3 [element :d] | hash_flow.rb:864:11:864:15 | hash3 [element :d] | provenance | | -| hash_flow.rb:860:5:860:9 | hash3 [element :f] | hash_flow.rb:866:11:866:15 | hash3 [element :f] | provenance | | -| hash_flow.rb:860:13:860:17 | hash1 [element :a] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] | provenance | | -| hash_flow.rb:860:13:860:17 | hash1 [element :c] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] | provenance | | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] | hash_flow.rb:860:5:860:9 | hash3 [element :a] | provenance | | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] | hash_flow.rb:860:5:860:9 | hash3 [element :c] | provenance | | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] | hash_flow.rb:860:5:860:9 | hash3 [element :d] | provenance | | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] | hash_flow.rb:860:5:860:9 | hash3 [element :f] | provenance | | -| hash_flow.rb:860:33:860:37 | hash2 [element :d] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] | provenance | | -| hash_flow.rb:860:33:860:37 | hash2 [element :f] | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] | provenance | | -| hash_flow.rb:861:11:861:15 | hash3 [element :a] | hash_flow.rb:861:11:861:19 | ...[...] | provenance | | +| hash_flow.rb:849:5:849:9 | hash1 : Hash [element :a] | hash_flow.rb:860:13:860:17 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:849:5:849:9 | hash1 : Hash [element :a] | hash_flow.rb:869:13:869:17 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:849:5:849:9 | hash1 : Hash [element :c] | hash_flow.rb:860:13:860:17 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:849:5:849:9 | hash1 : Hash [element :c] | hash_flow.rb:869:13:869:17 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:849:13:853:5 | call to [] : Hash [element :a] | hash_flow.rb:849:5:849:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:849:13:853:5 | call to [] : Hash [element :c] | hash_flow.rb:849:5:849:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:850:12:850:22 | call to taint | hash_flow.rb:849:13:853:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:852:12:852:22 | call to taint | hash_flow.rb:849:13:853:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:854:5:854:9 | hash2 : Hash [element :d] | hash_flow.rb:860:33:860:37 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:854:5:854:9 | hash2 : Hash [element :d] | hash_flow.rb:869:33:869:37 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:854:5:854:9 | hash2 : Hash [element :f] | hash_flow.rb:860:33:860:37 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:854:5:854:9 | hash2 : Hash [element :f] | hash_flow.rb:869:33:869:37 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:854:13:858:5 | call to [] : Hash [element :d] | hash_flow.rb:854:5:854:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:854:13:858:5 | call to [] : Hash [element :f] | hash_flow.rb:854:5:854:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:855:12:855:22 | call to taint | hash_flow.rb:854:13:858:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:857:12:857:22 | call to taint | hash_flow.rb:854:13:858:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :a] | hash_flow.rb:861:11:861:15 | hash3 : Hash [element :a] | provenance | | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :c] | hash_flow.rb:863:11:863:15 | hash3 : Hash [element :c] | provenance | | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :d] | hash_flow.rb:864:11:864:15 | hash3 : Hash [element :d] | provenance | | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :f] | hash_flow.rb:866:11:866:15 | hash3 : Hash [element :f] | provenance | | +| hash_flow.rb:860:13:860:17 | hash1 : Hash [element :a] | hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :a] | provenance | | +| hash_flow.rb:860:13:860:17 | hash1 : Hash [element :c] | hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :c] | provenance | | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :a] | hash_flow.rb:860:5:860:9 | hash3 : Hash [element :a] | provenance | | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :c] | hash_flow.rb:860:5:860:9 | hash3 : Hash [element :c] | provenance | | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :d] | hash_flow.rb:860:5:860:9 | hash3 : Hash [element :d] | provenance | | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :f] | hash_flow.rb:860:5:860:9 | hash3 : Hash [element :f] | provenance | | +| hash_flow.rb:860:33:860:37 | hash2 : Hash [element :d] | hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :d] | provenance | | +| hash_flow.rb:860:33:860:37 | hash2 : Hash [element :f] | hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :f] | provenance | | +| hash_flow.rb:861:11:861:15 | hash3 : Hash [element :a] | hash_flow.rb:861:11:861:19 | ...[...] | provenance | | | hash_flow.rb:861:11:861:19 | ...[...] | hash_flow.rb:861:10:861:20 | ( ... ) | provenance | | -| hash_flow.rb:863:11:863:15 | hash3 [element :c] | hash_flow.rb:863:11:863:19 | ...[...] | provenance | | +| hash_flow.rb:863:11:863:15 | hash3 : Hash [element :c] | hash_flow.rb:863:11:863:19 | ...[...] | provenance | | | hash_flow.rb:863:11:863:19 | ...[...] | hash_flow.rb:863:10:863:20 | ( ... ) | provenance | | -| hash_flow.rb:864:11:864:15 | hash3 [element :d] | hash_flow.rb:864:11:864:19 | ...[...] | provenance | | +| hash_flow.rb:864:11:864:15 | hash3 : Hash [element :d] | hash_flow.rb:864:11:864:19 | ...[...] | provenance | | | hash_flow.rb:864:11:864:19 | ...[...] | hash_flow.rb:864:10:864:20 | ( ... ) | provenance | | -| hash_flow.rb:866:11:866:15 | hash3 [element :f] | hash_flow.rb:866:11:866:19 | ...[...] | provenance | | +| hash_flow.rb:866:11:866:15 | hash3 : Hash [element :f] | hash_flow.rb:866:11:866:19 | ...[...] | provenance | | | hash_flow.rb:866:11:866:19 | ...[...] | hash_flow.rb:866:10:866:20 | ( ... ) | provenance | | -| hash_flow.rb:869:5:869:9 | hash4 [element :a] | hash_flow.rb:870:11:870:15 | hash4 [element :a] | provenance | | -| hash_flow.rb:869:5:869:9 | hash4 [element :c] | hash_flow.rb:872:11:872:15 | hash4 [element :c] | provenance | | -| hash_flow.rb:869:5:869:9 | hash4 [element :d] | hash_flow.rb:873:11:873:15 | hash4 [element :d] | provenance | | -| hash_flow.rb:869:5:869:9 | hash4 [element :f] | hash_flow.rb:875:11:875:15 | hash4 [element :f] | provenance | | -| hash_flow.rb:869:13:869:17 | hash1 [element :a] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] | provenance | | -| hash_flow.rb:869:13:869:17 | hash1 [element :c] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] | provenance | | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] | hash_flow.rb:869:5:869:9 | hash4 [element :a] | provenance | | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] | hash_flow.rb:869:5:869:9 | hash4 [element :c] | provenance | | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] | hash_flow.rb:869:5:869:9 | hash4 [element :d] | provenance | | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] | hash_flow.rb:869:5:869:9 | hash4 [element :f] | provenance | | -| hash_flow.rb:869:33:869:37 | hash2 [element :d] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] | provenance | | -| hash_flow.rb:869:33:869:37 | hash2 [element :f] | hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] | provenance | | -| hash_flow.rb:870:11:870:15 | hash4 [element :a] | hash_flow.rb:870:11:870:19 | ...[...] | provenance | | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :a] | hash_flow.rb:870:11:870:15 | hash4 : Hash [element :a] | provenance | | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :c] | hash_flow.rb:872:11:872:15 | hash4 : Hash [element :c] | provenance | | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :d] | hash_flow.rb:873:11:873:15 | hash4 : Hash [element :d] | provenance | | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :f] | hash_flow.rb:875:11:875:15 | hash4 : Hash [element :f] | provenance | | +| hash_flow.rb:869:13:869:17 | hash1 : Hash [element :a] | hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :a] | provenance | | +| hash_flow.rb:869:13:869:17 | hash1 : Hash [element :c] | hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :c] | provenance | | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :a] | hash_flow.rb:869:5:869:9 | hash4 : Hash [element :a] | provenance | | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :c] | hash_flow.rb:869:5:869:9 | hash4 : Hash [element :c] | provenance | | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :d] | hash_flow.rb:869:5:869:9 | hash4 : Hash [element :d] | provenance | | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :f] | hash_flow.rb:869:5:869:9 | hash4 : Hash [element :f] | provenance | | +| hash_flow.rb:869:33:869:37 | hash2 : Hash [element :d] | hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :d] | provenance | | +| hash_flow.rb:869:33:869:37 | hash2 : Hash [element :f] | hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :f] | provenance | | +| hash_flow.rb:870:11:870:15 | hash4 : Hash [element :a] | hash_flow.rb:870:11:870:19 | ...[...] | provenance | | | hash_flow.rb:870:11:870:19 | ...[...] | hash_flow.rb:870:10:870:20 | ( ... ) | provenance | | -| hash_flow.rb:872:11:872:15 | hash4 [element :c] | hash_flow.rb:872:11:872:19 | ...[...] | provenance | | +| hash_flow.rb:872:11:872:15 | hash4 : Hash [element :c] | hash_flow.rb:872:11:872:19 | ...[...] | provenance | | | hash_flow.rb:872:11:872:19 | ...[...] | hash_flow.rb:872:10:872:20 | ( ... ) | provenance | | -| hash_flow.rb:873:11:873:15 | hash4 [element :d] | hash_flow.rb:873:11:873:19 | ...[...] | provenance | | +| hash_flow.rb:873:11:873:15 | hash4 : Hash [element :d] | hash_flow.rb:873:11:873:19 | ...[...] | provenance | | | hash_flow.rb:873:11:873:19 | ...[...] | hash_flow.rb:873:10:873:20 | ( ... ) | provenance | | -| hash_flow.rb:875:11:875:15 | hash4 [element :f] | hash_flow.rb:875:11:875:19 | ...[...] | provenance | | +| hash_flow.rb:875:11:875:15 | hash4 : Hash [element :f] | hash_flow.rb:875:11:875:19 | ...[...] | provenance | | | hash_flow.rb:875:11:875:19 | ...[...] | hash_flow.rb:875:10:875:20 | ( ... ) | provenance | | -| hash_flow.rb:881:5:881:9 | hash1 [element :a] | hash_flow.rb:892:12:892:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:881:5:881:9 | hash1 [element :c] | hash_flow.rb:892:12:892:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:881:13:885:5 | call to [] [element :a] | hash_flow.rb:881:5:881:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:881:13:885:5 | call to [] [element :c] | hash_flow.rb:881:5:881:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:882:12:882:22 | call to taint | hash_flow.rb:881:13:885:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:884:12:884:22 | call to taint | hash_flow.rb:881:13:885:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:886:5:886:9 | hash2 [element :d] | hash_flow.rb:892:33:892:37 | hash2 [element :d] | provenance | | -| hash_flow.rb:886:5:886:9 | hash2 [element :f] | hash_flow.rb:892:33:892:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:886:13:890:5 | call to [] [element :d] | hash_flow.rb:886:5:886:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:886:13:890:5 | call to [] [element :f] | hash_flow.rb:886:5:886:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:887:12:887:22 | call to taint | hash_flow.rb:886:13:890:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:889:12:889:22 | call to taint | hash_flow.rb:886:13:890:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:892:5:892:8 | hash [element :a] | hash_flow.rb:893:11:893:14 | hash [element :a] | provenance | | -| hash_flow.rb:892:5:892:8 | hash [element :c] | hash_flow.rb:895:11:895:14 | hash [element :c] | provenance | | -| hash_flow.rb:892:5:892:8 | hash [element :d] | hash_flow.rb:896:11:896:14 | hash [element :d] | provenance | | -| hash_flow.rb:892:5:892:8 | hash [element :f] | hash_flow.rb:898:11:898:14 | hash [element :f] | provenance | | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] | hash_flow.rb:900:11:900:15 | hash1 [element :a] | provenance | | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] | hash_flow.rb:902:11:902:15 | hash1 [element :c] | provenance | | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] | hash_flow.rb:903:11:903:15 | hash1 [element :d] | provenance | | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] | hash_flow.rb:905:11:905:15 | hash1 [element :f] | provenance | | -| hash_flow.rb:892:12:892:16 | hash1 [element :a] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] | provenance | | -| hash_flow.rb:892:12:892:16 | hash1 [element :a] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] | provenance | | -| hash_flow.rb:892:12:892:16 | hash1 [element :c] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] | provenance | | -| hash_flow.rb:892:12:892:16 | hash1 [element :c] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] | provenance | | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] | hash_flow.rb:892:5:892:8 | hash [element :a] | provenance | | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] | hash_flow.rb:892:5:892:8 | hash [element :c] | provenance | | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] | hash_flow.rb:892:5:892:8 | hash [element :d] | provenance | | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] | hash_flow.rb:892:5:892:8 | hash [element :f] | provenance | | -| hash_flow.rb:892:33:892:37 | hash2 [element :d] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] | provenance | | -| hash_flow.rb:892:33:892:37 | hash2 [element :d] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] | provenance | | -| hash_flow.rb:892:33:892:37 | hash2 [element :f] | hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] | provenance | | -| hash_flow.rb:892:33:892:37 | hash2 [element :f] | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] | provenance | | -| hash_flow.rb:893:11:893:14 | hash [element :a] | hash_flow.rb:893:11:893:18 | ...[...] | provenance | | +| hash_flow.rb:881:5:881:9 | hash1 : Hash [element :a] | hash_flow.rb:892:12:892:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:881:5:881:9 | hash1 : Hash [element :c] | hash_flow.rb:892:12:892:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:881:13:885:5 | call to [] : Hash [element :a] | hash_flow.rb:881:5:881:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:881:13:885:5 | call to [] : Hash [element :c] | hash_flow.rb:881:5:881:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:882:12:882:22 | call to taint | hash_flow.rb:881:13:885:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:884:12:884:22 | call to taint | hash_flow.rb:881:13:885:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:886:5:886:9 | hash2 : Hash [element :d] | hash_flow.rb:892:33:892:37 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:886:5:886:9 | hash2 : Hash [element :f] | hash_flow.rb:892:33:892:37 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:886:13:890:5 | call to [] : Hash [element :d] | hash_flow.rb:886:5:886:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:886:13:890:5 | call to [] : Hash [element :f] | hash_flow.rb:886:5:886:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:887:12:887:22 | call to taint | hash_flow.rb:886:13:890:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:889:12:889:22 | call to taint | hash_flow.rb:886:13:890:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :a] | hash_flow.rb:893:11:893:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :c] | hash_flow.rb:895:11:895:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :d] | hash_flow.rb:896:11:896:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :f] | hash_flow.rb:898:11:898:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :a] | hash_flow.rb:900:11:900:15 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :c] | hash_flow.rb:902:11:902:15 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :d] | hash_flow.rb:903:11:903:15 | hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :f] | hash_flow.rb:905:11:905:15 | hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:892:12:892:16 | hash1 : Hash [element :a] | hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:892:12:892:16 | hash1 : Hash [element :a] | hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :a] | provenance | | +| hash_flow.rb:892:12:892:16 | hash1 : Hash [element :c] | hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:892:12:892:16 | hash1 : Hash [element :c] | hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :c] | provenance | | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :a] | hash_flow.rb:892:5:892:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :c] | hash_flow.rb:892:5:892:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :d] | hash_flow.rb:892:5:892:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :f] | hash_flow.rb:892:5:892:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:892:33:892:37 | hash2 : Hash [element :d] | hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:892:33:892:37 | hash2 : Hash [element :d] | hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :d] | provenance | | +| hash_flow.rb:892:33:892:37 | hash2 : Hash [element :f] | hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:892:33:892:37 | hash2 : Hash [element :f] | hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :f] | provenance | | +| hash_flow.rb:893:11:893:14 | hash : Hash [element :a] | hash_flow.rb:893:11:893:18 | ...[...] | provenance | | | hash_flow.rb:893:11:893:18 | ...[...] | hash_flow.rb:893:10:893:19 | ( ... ) | provenance | | -| hash_flow.rb:895:11:895:14 | hash [element :c] | hash_flow.rb:895:11:895:18 | ...[...] | provenance | | +| hash_flow.rb:895:11:895:14 | hash : Hash [element :c] | hash_flow.rb:895:11:895:18 | ...[...] | provenance | | | hash_flow.rb:895:11:895:18 | ...[...] | hash_flow.rb:895:10:895:19 | ( ... ) | provenance | | -| hash_flow.rb:896:11:896:14 | hash [element :d] | hash_flow.rb:896:11:896:18 | ...[...] | provenance | | +| hash_flow.rb:896:11:896:14 | hash : Hash [element :d] | hash_flow.rb:896:11:896:18 | ...[...] | provenance | | | hash_flow.rb:896:11:896:18 | ...[...] | hash_flow.rb:896:10:896:19 | ( ... ) | provenance | | -| hash_flow.rb:898:11:898:14 | hash [element :f] | hash_flow.rb:898:11:898:18 | ...[...] | provenance | | +| hash_flow.rb:898:11:898:14 | hash : Hash [element :f] | hash_flow.rb:898:11:898:18 | ...[...] | provenance | | | hash_flow.rb:898:11:898:18 | ...[...] | hash_flow.rb:898:10:898:19 | ( ... ) | provenance | | -| hash_flow.rb:900:11:900:15 | hash1 [element :a] | hash_flow.rb:900:11:900:19 | ...[...] | provenance | | +| hash_flow.rb:900:11:900:15 | hash1 : Hash [element :a] | hash_flow.rb:900:11:900:19 | ...[...] | provenance | | | hash_flow.rb:900:11:900:19 | ...[...] | hash_flow.rb:900:10:900:20 | ( ... ) | provenance | | -| hash_flow.rb:902:11:902:15 | hash1 [element :c] | hash_flow.rb:902:11:902:19 | ...[...] | provenance | | +| hash_flow.rb:902:11:902:15 | hash1 : Hash [element :c] | hash_flow.rb:902:11:902:19 | ...[...] | provenance | | | hash_flow.rb:902:11:902:19 | ...[...] | hash_flow.rb:902:10:902:20 | ( ... ) | provenance | | -| hash_flow.rb:903:11:903:15 | hash1 [element :d] | hash_flow.rb:903:11:903:19 | ...[...] | provenance | | +| hash_flow.rb:903:11:903:15 | hash1 : Hash [element :d] | hash_flow.rb:903:11:903:19 | ...[...] | provenance | | | hash_flow.rb:903:11:903:19 | ...[...] | hash_flow.rb:903:10:903:20 | ( ... ) | provenance | | -| hash_flow.rb:905:11:905:15 | hash1 [element :f] | hash_flow.rb:905:11:905:19 | ...[...] | provenance | | +| hash_flow.rb:905:11:905:15 | hash1 : Hash [element :f] | hash_flow.rb:905:11:905:19 | ...[...] | provenance | | | hash_flow.rb:905:11:905:19 | ...[...] | hash_flow.rb:905:10:905:20 | ( ... ) | provenance | | -| hash_flow.rb:911:5:911:9 | hash1 [element :a] | hash_flow.rb:922:12:922:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:911:5:911:9 | hash1 [element :c] | hash_flow.rb:922:12:922:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:911:13:915:5 | call to [] [element :a] | hash_flow.rb:911:5:911:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:911:13:915:5 | call to [] [element :c] | hash_flow.rb:911:5:911:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:912:12:912:22 | call to taint | hash_flow.rb:911:13:915:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:914:12:914:22 | call to taint | hash_flow.rb:911:13:915:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:916:5:916:9 | hash2 [element :d] | hash_flow.rb:922:33:922:37 | hash2 [element :d] | provenance | | -| hash_flow.rb:916:5:916:9 | hash2 [element :f] | hash_flow.rb:922:33:922:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:916:13:920:5 | call to [] [element :d] | hash_flow.rb:916:5:916:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:916:13:920:5 | call to [] [element :f] | hash_flow.rb:916:5:916:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:917:12:917:22 | call to taint | hash_flow.rb:916:13:920:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:919:12:919:22 | call to taint | hash_flow.rb:916:13:920:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:922:5:922:8 | hash [element :a] | hash_flow.rb:923:11:923:14 | hash [element :a] | provenance | | -| hash_flow.rb:922:5:922:8 | hash [element :c] | hash_flow.rb:925:11:925:14 | hash [element :c] | provenance | | -| hash_flow.rb:922:5:922:8 | hash [element :d] | hash_flow.rb:926:11:926:14 | hash [element :d] | provenance | | -| hash_flow.rb:922:5:922:8 | hash [element :f] | hash_flow.rb:928:11:928:14 | hash [element :f] | provenance | | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] | hash_flow.rb:930:11:930:15 | hash1 [element :a] | provenance | | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] | hash_flow.rb:932:11:932:15 | hash1 [element :c] | provenance | | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] | hash_flow.rb:933:11:933:15 | hash1 [element :d] | provenance | | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] | hash_flow.rb:935:11:935:15 | hash1 [element :f] | provenance | | -| hash_flow.rb:922:12:922:16 | hash1 [element :a] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] | provenance | | -| hash_flow.rb:922:12:922:16 | hash1 [element :a] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] | provenance | | -| hash_flow.rb:922:12:922:16 | hash1 [element :c] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] | provenance | | -| hash_flow.rb:922:12:922:16 | hash1 [element :c] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] | provenance | | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] | hash_flow.rb:922:5:922:8 | hash [element :a] | provenance | | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] | hash_flow.rb:922:5:922:8 | hash [element :c] | provenance | | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] | hash_flow.rb:922:5:922:8 | hash [element :d] | provenance | | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] | hash_flow.rb:922:5:922:8 | hash [element :f] | provenance | | -| hash_flow.rb:922:33:922:37 | hash2 [element :d] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] | provenance | | -| hash_flow.rb:922:33:922:37 | hash2 [element :d] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] | provenance | | -| hash_flow.rb:922:33:922:37 | hash2 [element :f] | hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] | provenance | | -| hash_flow.rb:922:33:922:37 | hash2 [element :f] | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] | provenance | | -| hash_flow.rb:923:11:923:14 | hash [element :a] | hash_flow.rb:923:11:923:18 | ...[...] | provenance | | +| hash_flow.rb:911:5:911:9 | hash1 : Hash [element :a] | hash_flow.rb:922:12:922:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:911:5:911:9 | hash1 : Hash [element :c] | hash_flow.rb:922:12:922:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:911:13:915:5 | call to [] : Hash [element :a] | hash_flow.rb:911:5:911:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:911:13:915:5 | call to [] : Hash [element :c] | hash_flow.rb:911:5:911:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:912:12:912:22 | call to taint | hash_flow.rb:911:13:915:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:914:12:914:22 | call to taint | hash_flow.rb:911:13:915:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:916:5:916:9 | hash2 : Hash [element :d] | hash_flow.rb:922:33:922:37 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:916:5:916:9 | hash2 : Hash [element :f] | hash_flow.rb:922:33:922:37 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:916:13:920:5 | call to [] : Hash [element :d] | hash_flow.rb:916:5:916:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:916:13:920:5 | call to [] : Hash [element :f] | hash_flow.rb:916:5:916:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:917:12:917:22 | call to taint | hash_flow.rb:916:13:920:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:919:12:919:22 | call to taint | hash_flow.rb:916:13:920:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :a] | hash_flow.rb:923:11:923:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :c] | hash_flow.rb:925:11:925:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :d] | hash_flow.rb:926:11:926:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :f] | hash_flow.rb:928:11:928:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :a] | hash_flow.rb:930:11:930:15 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :c] | hash_flow.rb:932:11:932:15 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :d] | hash_flow.rb:933:11:933:15 | hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :f] | hash_flow.rb:935:11:935:15 | hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:922:12:922:16 | hash1 : Hash [element :a] | hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:922:12:922:16 | hash1 : Hash [element :a] | hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :a] | provenance | | +| hash_flow.rb:922:12:922:16 | hash1 : Hash [element :c] | hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:922:12:922:16 | hash1 : Hash [element :c] | hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :c] | provenance | | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :a] | hash_flow.rb:922:5:922:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :c] | hash_flow.rb:922:5:922:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :d] | hash_flow.rb:922:5:922:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :f] | hash_flow.rb:922:5:922:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:922:33:922:37 | hash2 : Hash [element :d] | hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:922:33:922:37 | hash2 : Hash [element :d] | hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :d] | provenance | | +| hash_flow.rb:922:33:922:37 | hash2 : Hash [element :f] | hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:922:33:922:37 | hash2 : Hash [element :f] | hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :f] | provenance | | +| hash_flow.rb:923:11:923:14 | hash : Hash [element :a] | hash_flow.rb:923:11:923:18 | ...[...] | provenance | | | hash_flow.rb:923:11:923:18 | ...[...] | hash_flow.rb:923:10:923:19 | ( ... ) | provenance | | -| hash_flow.rb:925:11:925:14 | hash [element :c] | hash_flow.rb:925:11:925:18 | ...[...] | provenance | | +| hash_flow.rb:925:11:925:14 | hash : Hash [element :c] | hash_flow.rb:925:11:925:18 | ...[...] | provenance | | | hash_flow.rb:925:11:925:18 | ...[...] | hash_flow.rb:925:10:925:19 | ( ... ) | provenance | | -| hash_flow.rb:926:11:926:14 | hash [element :d] | hash_flow.rb:926:11:926:18 | ...[...] | provenance | | +| hash_flow.rb:926:11:926:14 | hash : Hash [element :d] | hash_flow.rb:926:11:926:18 | ...[...] | provenance | | | hash_flow.rb:926:11:926:18 | ...[...] | hash_flow.rb:926:10:926:19 | ( ... ) | provenance | | -| hash_flow.rb:928:11:928:14 | hash [element :f] | hash_flow.rb:928:11:928:18 | ...[...] | provenance | | +| hash_flow.rb:928:11:928:14 | hash : Hash [element :f] | hash_flow.rb:928:11:928:18 | ...[...] | provenance | | | hash_flow.rb:928:11:928:18 | ...[...] | hash_flow.rb:928:10:928:19 | ( ... ) | provenance | | -| hash_flow.rb:930:11:930:15 | hash1 [element :a] | hash_flow.rb:930:11:930:19 | ...[...] | provenance | | +| hash_flow.rb:930:11:930:15 | hash1 : Hash [element :a] | hash_flow.rb:930:11:930:19 | ...[...] | provenance | | | hash_flow.rb:930:11:930:19 | ...[...] | hash_flow.rb:930:10:930:20 | ( ... ) | provenance | | -| hash_flow.rb:932:11:932:15 | hash1 [element :c] | hash_flow.rb:932:11:932:19 | ...[...] | provenance | | +| hash_flow.rb:932:11:932:15 | hash1 : Hash [element :c] | hash_flow.rb:932:11:932:19 | ...[...] | provenance | | | hash_flow.rb:932:11:932:19 | ...[...] | hash_flow.rb:932:10:932:20 | ( ... ) | provenance | | -| hash_flow.rb:933:11:933:15 | hash1 [element :d] | hash_flow.rb:933:11:933:19 | ...[...] | provenance | | +| hash_flow.rb:933:11:933:15 | hash1 : Hash [element :d] | hash_flow.rb:933:11:933:19 | ...[...] | provenance | | | hash_flow.rb:933:11:933:19 | ...[...] | hash_flow.rb:933:10:933:20 | ( ... ) | provenance | | -| hash_flow.rb:935:11:935:15 | hash1 [element :f] | hash_flow.rb:935:11:935:19 | ...[...] | provenance | | +| hash_flow.rb:935:11:935:15 | hash1 : Hash [element :f] | hash_flow.rb:935:11:935:19 | ...[...] | provenance | | | hash_flow.rb:935:11:935:19 | ...[...] | hash_flow.rb:935:10:935:20 | ( ... ) | provenance | | -| hash_flow.rb:941:5:941:9 | hash1 [element :a] | hash_flow.rb:952:12:952:16 | hash1 [element :a] | provenance | | -| hash_flow.rb:941:5:941:9 | hash1 [element :c] | hash_flow.rb:952:12:952:16 | hash1 [element :c] | provenance | | -| hash_flow.rb:941:13:945:5 | call to [] [element :a] | hash_flow.rb:941:5:941:9 | hash1 [element :a] | provenance | | -| hash_flow.rb:941:13:945:5 | call to [] [element :c] | hash_flow.rb:941:5:941:9 | hash1 [element :c] | provenance | | -| hash_flow.rb:942:12:942:22 | call to taint | hash_flow.rb:941:13:945:5 | call to [] [element :a] | provenance | | -| hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:941:13:945:5 | call to [] [element :c] | provenance | | -| hash_flow.rb:946:5:946:9 | hash2 [element :d] | hash_flow.rb:952:33:952:37 | hash2 [element :d] | provenance | | -| hash_flow.rb:946:5:946:9 | hash2 [element :f] | hash_flow.rb:952:33:952:37 | hash2 [element :f] | provenance | | -| hash_flow.rb:946:13:950:5 | call to [] [element :d] | hash_flow.rb:946:5:946:9 | hash2 [element :d] | provenance | | -| hash_flow.rb:946:13:950:5 | call to [] [element :f] | hash_flow.rb:946:5:946:9 | hash2 [element :f] | provenance | | -| hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:946:13:950:5 | call to [] [element :d] | provenance | | -| hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:946:13:950:5 | call to [] [element :f] | provenance | | -| hash_flow.rb:952:5:952:8 | hash [element :a] | hash_flow.rb:953:11:953:14 | hash [element :a] | provenance | | -| hash_flow.rb:952:5:952:8 | hash [element :c] | hash_flow.rb:955:11:955:14 | hash [element :c] | provenance | | -| hash_flow.rb:952:5:952:8 | hash [element :d] | hash_flow.rb:956:11:956:14 | hash [element :d] | provenance | | -| hash_flow.rb:952:5:952:8 | hash [element :f] | hash_flow.rb:958:11:958:14 | hash [element :f] | provenance | | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] | hash_flow.rb:960:11:960:15 | hash1 [element :a] | provenance | | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] | hash_flow.rb:962:11:962:15 | hash1 [element :c] | provenance | | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] | hash_flow.rb:963:11:963:15 | hash1 [element :d] | provenance | | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] | hash_flow.rb:965:11:965:15 | hash1 [element :f] | provenance | | -| hash_flow.rb:952:12:952:16 | hash1 [element :a] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] | provenance | | -| hash_flow.rb:952:12:952:16 | hash1 [element :a] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] | provenance | | -| hash_flow.rb:952:12:952:16 | hash1 [element :c] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] | provenance | | -| hash_flow.rb:952:12:952:16 | hash1 [element :c] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] | provenance | | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] | hash_flow.rb:952:5:952:8 | hash [element :a] | provenance | | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] | hash_flow.rb:952:5:952:8 | hash [element :c] | provenance | | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] | hash_flow.rb:952:5:952:8 | hash [element :d] | provenance | | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] | hash_flow.rb:952:5:952:8 | hash [element :f] | provenance | | -| hash_flow.rb:952:33:952:37 | hash2 [element :d] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] | provenance | | -| hash_flow.rb:952:33:952:37 | hash2 [element :d] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] | provenance | | -| hash_flow.rb:952:33:952:37 | hash2 [element :f] | hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] | provenance | | -| hash_flow.rb:952:33:952:37 | hash2 [element :f] | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] | provenance | | -| hash_flow.rb:953:11:953:14 | hash [element :a] | hash_flow.rb:953:11:953:18 | ...[...] | provenance | | +| hash_flow.rb:941:5:941:9 | hash1 : Hash [element :a] | hash_flow.rb:952:12:952:16 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:941:5:941:9 | hash1 : Hash [element :c] | hash_flow.rb:952:12:952:16 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:941:13:945:5 | call to [] : Hash [element :a] | hash_flow.rb:941:5:941:9 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:941:13:945:5 | call to [] : Hash [element :c] | hash_flow.rb:941:5:941:9 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:942:12:942:22 | call to taint | hash_flow.rb:941:13:945:5 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:941:13:945:5 | call to [] : Hash [element :c] | provenance | | +| hash_flow.rb:946:5:946:9 | hash2 : Hash [element :d] | hash_flow.rb:952:33:952:37 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:946:5:946:9 | hash2 : Hash [element :f] | hash_flow.rb:952:33:952:37 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:946:13:950:5 | call to [] : Hash [element :d] | hash_flow.rb:946:5:946:9 | hash2 : Hash [element :d] | provenance | | +| hash_flow.rb:946:13:950:5 | call to [] : Hash [element :f] | hash_flow.rb:946:5:946:9 | hash2 : Hash [element :f] | provenance | | +| hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:946:13:950:5 | call to [] : Hash [element :d] | provenance | | +| hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:946:13:950:5 | call to [] : Hash [element :f] | provenance | | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :a] | hash_flow.rb:953:11:953:14 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :c] | hash_flow.rb:955:11:955:14 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :d] | hash_flow.rb:956:11:956:14 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :f] | hash_flow.rb:958:11:958:14 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :a] | hash_flow.rb:960:11:960:15 | hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :c] | hash_flow.rb:962:11:962:15 | hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :d] | hash_flow.rb:963:11:963:15 | hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :f] | hash_flow.rb:965:11:965:15 | hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:952:12:952:16 | hash1 : Hash [element :a] | hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :a] | provenance | | +| hash_flow.rb:952:12:952:16 | hash1 : Hash [element :a] | hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :a] | provenance | | +| hash_flow.rb:952:12:952:16 | hash1 : Hash [element :c] | hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :c] | provenance | | +| hash_flow.rb:952:12:952:16 | hash1 : Hash [element :c] | hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :c] | provenance | | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :a] | hash_flow.rb:952:5:952:8 | hash : Hash [element :a] | provenance | | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :c] | hash_flow.rb:952:5:952:8 | hash : Hash [element :c] | provenance | | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :d] | hash_flow.rb:952:5:952:8 | hash : Hash [element :d] | provenance | | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :f] | hash_flow.rb:952:5:952:8 | hash : Hash [element :f] | provenance | | +| hash_flow.rb:952:33:952:37 | hash2 : Hash [element :d] | hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :d] | provenance | | +| hash_flow.rb:952:33:952:37 | hash2 : Hash [element :d] | hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :d] | provenance | | +| hash_flow.rb:952:33:952:37 | hash2 : Hash [element :f] | hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :f] | provenance | | +| hash_flow.rb:952:33:952:37 | hash2 : Hash [element :f] | hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :f] | provenance | | +| hash_flow.rb:953:11:953:14 | hash : Hash [element :a] | hash_flow.rb:953:11:953:18 | ...[...] | provenance | | | hash_flow.rb:953:11:953:18 | ...[...] | hash_flow.rb:953:10:953:19 | ( ... ) | provenance | | -| hash_flow.rb:955:11:955:14 | hash [element :c] | hash_flow.rb:955:11:955:18 | ...[...] | provenance | | +| hash_flow.rb:955:11:955:14 | hash : Hash [element :c] | hash_flow.rb:955:11:955:18 | ...[...] | provenance | | | hash_flow.rb:955:11:955:18 | ...[...] | hash_flow.rb:955:10:955:19 | ( ... ) | provenance | | -| hash_flow.rb:956:11:956:14 | hash [element :d] | hash_flow.rb:956:11:956:18 | ...[...] | provenance | | +| hash_flow.rb:956:11:956:14 | hash : Hash [element :d] | hash_flow.rb:956:11:956:18 | ...[...] | provenance | | | hash_flow.rb:956:11:956:18 | ...[...] | hash_flow.rb:956:10:956:19 | ( ... ) | provenance | | -| hash_flow.rb:958:11:958:14 | hash [element :f] | hash_flow.rb:958:11:958:18 | ...[...] | provenance | | +| hash_flow.rb:958:11:958:14 | hash : Hash [element :f] | hash_flow.rb:958:11:958:18 | ...[...] | provenance | | | hash_flow.rb:958:11:958:18 | ...[...] | hash_flow.rb:958:10:958:19 | ( ... ) | provenance | | -| hash_flow.rb:960:11:960:15 | hash1 [element :a] | hash_flow.rb:960:11:960:19 | ...[...] | provenance | | +| hash_flow.rb:960:11:960:15 | hash1 : Hash [element :a] | hash_flow.rb:960:11:960:19 | ...[...] | provenance | | | hash_flow.rb:960:11:960:19 | ...[...] | hash_flow.rb:960:10:960:20 | ( ... ) | provenance | | -| hash_flow.rb:962:11:962:15 | hash1 [element :c] | hash_flow.rb:962:11:962:19 | ...[...] | provenance | | +| hash_flow.rb:962:11:962:15 | hash1 : Hash [element :c] | hash_flow.rb:962:11:962:19 | ...[...] | provenance | | | hash_flow.rb:962:11:962:19 | ...[...] | hash_flow.rb:962:10:962:20 | ( ... ) | provenance | | -| hash_flow.rb:963:11:963:15 | hash1 [element :d] | hash_flow.rb:963:11:963:19 | ...[...] | provenance | | +| hash_flow.rb:963:11:963:15 | hash1 : Hash [element :d] | hash_flow.rb:963:11:963:19 | ...[...] | provenance | | | hash_flow.rb:963:11:963:19 | ...[...] | hash_flow.rb:963:10:963:20 | ( ... ) | provenance | | -| hash_flow.rb:965:11:965:15 | hash1 [element :f] | hash_flow.rb:965:11:965:19 | ...[...] | provenance | | +| hash_flow.rb:965:11:965:15 | hash1 : Hash [element :f] | hash_flow.rb:965:11:965:19 | ...[...] | provenance | | | hash_flow.rb:965:11:965:19 | ...[...] | hash_flow.rb:965:10:965:20 | ( ... ) | provenance | | -| hash_flow.rb:971:5:971:5 | h [element :b] | hash_flow.rb:973:10:973:10 | h [element :b] | provenance | | -| hash_flow.rb:971:5:971:5 | h [element :b] | hash_flow.rb:975:10:975:10 | h [element :b] | provenance | | -| hash_flow.rb:971:9:971:38 | ...[...] [element :b] | hash_flow.rb:971:5:971:5 | h [element :b] | provenance | | -| hash_flow.rb:971:23:971:31 | call to taint | hash_flow.rb:971:9:971:38 | ...[...] [element :b] | provenance | | -| hash_flow.rb:973:10:973:10 | h [element :b] | hash_flow.rb:973:10:973:14 | ...[...] | provenance | | -| hash_flow.rb:975:10:975:10 | h [element :b] | hash_flow.rb:975:10:975:13 | ...[...] | provenance | | -| hash_flow.rb:994:9:994:10 | h2 [element :b] | hash_flow.rb:996:14:996:15 | h2 [element :b] | provenance | | -| hash_flow.rb:994:9:994:10 | h2 [element :b] | hash_flow.rb:998:14:998:15 | h2 [element :b] | provenance | | -| hash_flow.rb:994:14:994:47 | ...[...] [element :b] | hash_flow.rb:994:9:994:10 | h2 [element :b] | provenance | | -| hash_flow.rb:994:30:994:40 | call to taint | hash_flow.rb:994:14:994:47 | ...[...] [element :b] | provenance | | -| hash_flow.rb:996:14:996:15 | h2 [element :b] | hash_flow.rb:996:14:996:19 | ...[...] | provenance | | -| hash_flow.rb:998:14:998:15 | h2 [element :b] | hash_flow.rb:998:14:998:18 | ...[...] | provenance | | -| hash_flow.rb:1011:5:1011:5 | h [element :a] | hash_flow.rb:1012:5:1012:5 | h [element :a] | provenance | | -| hash_flow.rb:1011:9:1011:45 | call to [] [element :a] | hash_flow.rb:1011:5:1011:5 | h [element :a] | provenance | | -| hash_flow.rb:1011:14:1011:24 | call to taint | hash_flow.rb:1011:9:1011:45 | call to [] [element :a] | provenance | | -| hash_flow.rb:1012:5:1012:5 | h [element :a] | hash_flow.rb:1012:15:1012:15 | k | provenance | | -| hash_flow.rb:1012:5:1012:5 | h [element :a] | hash_flow.rb:1012:18:1012:18 | v | provenance | | +| hash_flow.rb:971:5:971:5 | h : Hash [element :b] | hash_flow.rb:973:10:973:10 | h : Hash [element :b] | provenance | | +| hash_flow.rb:971:5:971:5 | h : Hash [element :b] | hash_flow.rb:975:10:975:10 | h : Hash [element :b] | provenance | | +| hash_flow.rb:971:9:971:38 | ...[...] : Hash [element :b] | hash_flow.rb:971:5:971:5 | h : Hash [element :b] | provenance | | +| hash_flow.rb:971:23:971:31 | call to taint | hash_flow.rb:971:9:971:38 | ...[...] : Hash [element :b] | provenance | | +| hash_flow.rb:973:10:973:10 | h : Hash [element :b] | hash_flow.rb:973:10:973:14 | ...[...] | provenance | | +| hash_flow.rb:975:10:975:10 | h : Hash [element :b] | hash_flow.rb:975:10:975:13 | ...[...] | provenance | | +| hash_flow.rb:994:9:994:10 | h2 : Hash [element :b] | hash_flow.rb:996:14:996:15 | h2 : Hash [element :b] | provenance | | +| hash_flow.rb:994:9:994:10 | h2 : Hash [element :b] | hash_flow.rb:998:14:998:15 | h2 : Hash [element :b] | provenance | | +| hash_flow.rb:994:14:994:47 | ...[...] : Hash [element :b] | hash_flow.rb:994:9:994:10 | h2 : Hash [element :b] | provenance | | +| hash_flow.rb:994:30:994:40 | call to taint | hash_flow.rb:994:14:994:47 | ...[...] : Hash [element :b] | provenance | | +| hash_flow.rb:996:14:996:15 | h2 : Hash [element :b] | hash_flow.rb:996:14:996:19 | ...[...] | provenance | | +| hash_flow.rb:998:14:998:15 | h2 : Hash [element :b] | hash_flow.rb:998:14:998:18 | ...[...] | provenance | | +| hash_flow.rb:1011:5:1011:5 | h : Hash [element :a] | hash_flow.rb:1012:5:1012:5 | h : Hash [element :a] | provenance | | +| hash_flow.rb:1011:9:1011:45 | call to [] : Hash [element :a] | hash_flow.rb:1011:5:1011:5 | h : Hash [element :a] | provenance | | +| hash_flow.rb:1011:14:1011:24 | call to taint | hash_flow.rb:1011:9:1011:45 | call to [] : Hash [element :a] | provenance | | +| hash_flow.rb:1012:5:1012:5 | h : Hash [element :a] | hash_flow.rb:1012:15:1012:15 | k | provenance | | +| hash_flow.rb:1012:5:1012:5 | h : Hash [element :a] | hash_flow.rb:1012:18:1012:18 | v | provenance | | | hash_flow.rb:1012:15:1012:15 | k | hash_flow.rb:1014:14:1014:14 | k | provenance | | | hash_flow.rb:1012:18:1012:18 | v | hash_flow.rb:1013:14:1013:14 | v | provenance | | nodes -| hash_flow.rb:10:5:10:8 | hash [element 0] | semmle.label | hash [element 0] | -| hash_flow.rb:10:5:10:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:10:5:10:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:10:5:10:8 | hash [element e] | semmle.label | hash [element e] | -| hash_flow.rb:10:5:10:8 | hash [element g] | semmle.label | hash [element g] | -| hash_flow.rb:10:12:21:5 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| hash_flow.rb:10:12:21:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:10:12:21:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | -| hash_flow.rb:10:12:21:5 | call to [] [element e] | semmle.label | call to [] [element e] | -| hash_flow.rb:10:12:21:5 | call to [] [element g] | semmle.label | call to [] [element g] | +| hash_flow.rb:10:5:10:8 | hash : Hash [element 0] | semmle.label | hash : Hash [element 0] | +| hash_flow.rb:10:5:10:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:10:5:10:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:10:5:10:8 | hash : Hash [element e] | semmle.label | hash : Hash [element e] | +| hash_flow.rb:10:5:10:8 | hash : Hash [element g] | semmle.label | hash : Hash [element g] | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element 0] | semmle.label | call to [] : Hash [element 0] | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element e] | semmle.label | call to [] : Hash [element e] | +| hash_flow.rb:10:12:21:5 | call to [] : Hash [element g] | semmle.label | call to [] : Hash [element g] | | hash_flow.rb:11:15:11:24 | call to taint | semmle.label | call to taint | | hash_flow.rb:13:12:13:21 | call to taint | semmle.label | call to taint | | hash_flow.rb:15:14:15:23 | call to taint | semmle.label | call to taint | | hash_flow.rb:17:16:17:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:19:14:19:23 | call to taint | semmle.label | call to taint | -| hash_flow.rb:22:10:22:13 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:22:10:22:13 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:22:10:22:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:24:10:24:13 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:24:10:24:13 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:24:10:24:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:26:10:26:13 | hash [element e] | semmle.label | hash [element e] | +| hash_flow.rb:26:10:26:13 | hash : Hash [element e] | semmle.label | hash : Hash [element e] | | hash_flow.rb:26:10:26:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:28:10:28:13 | hash [element g] | semmle.label | hash [element g] | +| hash_flow.rb:28:10:28:13 | hash : Hash [element g] | semmle.label | hash : Hash [element g] | | hash_flow.rb:28:10:28:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:30:10:30:13 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:30:10:30:13 | hash : Hash [element 0] | semmle.label | hash : Hash [element 0] | | hash_flow.rb:30:10:30:16 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:38:5:38:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | +| hash_flow.rb:38:5:38:8 | [post] hash : [collection] [element 0] | semmle.label | [post] hash : [collection] [element 0] | | hash_flow.rb:38:15:38:24 | call to taint | semmle.label | call to taint | -| hash_flow.rb:39:5:39:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | -| hash_flow.rb:39:5:39:8 | hash [element 0] | semmle.label | hash [element 0] | -| hash_flow.rb:40:5:40:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | -| hash_flow.rb:40:5:40:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:40:5:40:8 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:39:5:39:8 | [post] hash : [collection] [element 0] | semmle.label | [post] hash : [collection] [element 0] | +| hash_flow.rb:39:5:39:8 | hash : [collection] [element 0] | semmle.label | hash : [collection] [element 0] | +| hash_flow.rb:40:5:40:8 | [post] hash : [collection] [element 0] | semmle.label | [post] hash : [collection] [element 0] | +| hash_flow.rb:40:5:40:8 | [post] hash : [collection] [element :a] | semmle.label | [post] hash : [collection] [element :a] | +| hash_flow.rb:40:5:40:8 | hash : [collection] [element 0] | semmle.label | hash : [collection] [element 0] | | hash_flow.rb:40:16:40:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:41:5:41:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | -| hash_flow.rb:41:5:41:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:41:5:41:8 | hash [element 0] | semmle.label | hash [element 0] | -| hash_flow.rb:41:5:41:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:42:5:42:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | -| hash_flow.rb:42:5:42:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:42:5:42:8 | [post] hash [element a] | semmle.label | [post] hash [element a] | -| hash_flow.rb:42:5:42:8 | hash [element 0] | semmle.label | hash [element 0] | -| hash_flow.rb:42:5:42:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:41:5:41:8 | [post] hash : [collection] [element 0] | semmle.label | [post] hash : [collection] [element 0] | +| hash_flow.rb:41:5:41:8 | [post] hash : [collection] [element :a] | semmle.label | [post] hash : [collection] [element :a] | +| hash_flow.rb:41:5:41:8 | hash : [collection] [element 0] | semmle.label | hash : [collection] [element 0] | +| hash_flow.rb:41:5:41:8 | hash : [collection] [element :a] | semmle.label | hash : [collection] [element :a] | +| hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element 0] | semmle.label | [post] hash : [collection] [element 0] | +| hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element :a] | semmle.label | [post] hash : [collection] [element :a] | +| hash_flow.rb:42:5:42:8 | [post] hash : [collection] [element a] | semmle.label | [post] hash : [collection] [element a] | +| hash_flow.rb:42:5:42:8 | hash : [collection] [element 0] | semmle.label | hash : [collection] [element 0] | +| hash_flow.rb:42:5:42:8 | hash : [collection] [element :a] | semmle.label | hash : [collection] [element :a] | | hash_flow.rb:42:17:42:26 | call to taint | semmle.label | call to taint | -| hash_flow.rb:43:5:43:8 | [post] hash [element 0] | semmle.label | [post] hash [element 0] | -| hash_flow.rb:43:5:43:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:43:5:43:8 | [post] hash [element a] | semmle.label | [post] hash [element a] | -| hash_flow.rb:43:5:43:8 | hash [element 0] | semmle.label | hash [element 0] | -| hash_flow.rb:43:5:43:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:43:5:43:8 | hash [element a] | semmle.label | hash [element a] | -| hash_flow.rb:44:10:44:13 | hash [element 0] | semmle.label | hash [element 0] | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element 0] | semmle.label | [post] hash : [collection] [element 0] | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element :a] | semmle.label | [post] hash : [collection] [element :a] | +| hash_flow.rb:43:5:43:8 | [post] hash : [collection] [element a] | semmle.label | [post] hash : [collection] [element a] | +| hash_flow.rb:43:5:43:8 | hash : [collection] [element 0] | semmle.label | hash : [collection] [element 0] | +| hash_flow.rb:43:5:43:8 | hash : [collection] [element :a] | semmle.label | hash : [collection] [element :a] | +| hash_flow.rb:43:5:43:8 | hash : [collection] [element a] | semmle.label | hash : [collection] [element a] | +| hash_flow.rb:44:10:44:13 | hash : [collection] [element 0] | semmle.label | hash : [collection] [element 0] | | hash_flow.rb:44:10:44:16 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:46:10:46:13 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:46:10:46:13 | hash [element a] | semmle.label | hash [element a] | +| hash_flow.rb:46:10:46:13 | hash : [collection] [element :a] | semmle.label | hash : [collection] [element :a] | +| hash_flow.rb:46:10:46:13 | hash : [collection] [element a] | semmle.label | hash : [collection] [element a] | | hash_flow.rb:46:10:46:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:48:10:48:13 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:48:10:48:13 | hash [element a] | semmle.label | hash [element a] | +| hash_flow.rb:48:10:48:13 | hash : [collection] [element :a] | semmle.label | hash : [collection] [element :a] | +| hash_flow.rb:48:10:48:13 | hash : [collection] [element a] | semmle.label | hash : [collection] [element a] | | hash_flow.rb:48:10:48:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:55:5:55:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:55:13:55:37 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | +| hash_flow.rb:55:5:55:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:55:13:55:37 | ...[...] : Hash [element :a] | semmle.label | ...[...] : Hash [element :a] | | hash_flow.rb:55:21:55:30 | call to taint | semmle.label | call to taint | -| hash_flow.rb:56:10:56:14 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:56:10:56:14 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:56:10:56:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:59:5:59:5 | x [element :a] | semmle.label | x [element :a] | -| hash_flow.rb:59:9:59:29 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:59:5:59:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_flow.rb:59:9:59:29 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:59:13:59:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:60:5:60:9 | hash2 [element :a] | semmle.label | hash2 [element :a] | -| hash_flow.rb:60:13:60:19 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | -| hash_flow.rb:60:18:60:18 | x [element :a] | semmle.label | x [element :a] | -| hash_flow.rb:61:10:61:14 | hash2 [element :a] | semmle.label | hash2 [element :a] | +| hash_flow.rb:60:5:60:9 | hash2 : Hash [element :a] | semmle.label | hash2 : Hash [element :a] | +| hash_flow.rb:60:13:60:19 | ...[...] : Hash [element :a] | semmle.label | ...[...] : Hash [element :a] | +| hash_flow.rb:60:18:60:18 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_flow.rb:61:10:61:14 | hash2 : Hash [element :a] | semmle.label | hash2 : Hash [element :a] | | hash_flow.rb:61:10:61:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:64:5:64:9 | hash3 [element] | semmle.label | hash3 [element] | -| hash_flow.rb:64:13:64:45 | ...[...] [element] | semmle.label | ...[...] [element] | -| hash_flow.rb:64:18:64:44 | call to [] [element 0, element 1] | semmle.label | call to [] [element 0, element 1] | -| hash_flow.rb:64:19:64:34 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| hash_flow.rb:64:5:64:9 | hash3 : [collection] [element] | semmle.label | hash3 : [collection] [element] | +| hash_flow.rb:64:13:64:45 | ...[...] : [collection] [element] | semmle.label | ...[...] : [collection] [element] | +| hash_flow.rb:64:18:64:44 | call to [] : Array [element 0, element 1] | semmle.label | call to [] : Array [element 0, element 1] | +| hash_flow.rb:64:19:64:34 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | hash_flow.rb:64:24:64:33 | call to taint | semmle.label | call to taint | -| hash_flow.rb:65:10:65:14 | hash3 [element] | semmle.label | hash3 [element] | +| hash_flow.rb:65:10:65:14 | hash3 : [collection] [element] | semmle.label | hash3 : [collection] [element] | | hash_flow.rb:65:10:65:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:66:10:66:14 | hash3 [element] | semmle.label | hash3 [element] | +| hash_flow.rb:66:10:66:14 | hash3 : [collection] [element] | semmle.label | hash3 : [collection] [element] | | hash_flow.rb:66:10:66:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:68:5:68:9 | hash4 [element :a] | semmle.label | hash4 [element :a] | -| hash_flow.rb:68:13:68:39 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | +| hash_flow.rb:68:5:68:9 | hash4 : [collection] [element :a] | semmle.label | hash4 : [collection] [element :a] | +| hash_flow.rb:68:13:68:39 | ...[...] : [collection] [element :a] | semmle.label | ...[...] : [collection] [element :a] | | hash_flow.rb:68:22:68:31 | call to taint | semmle.label | call to taint | -| hash_flow.rb:69:10:69:14 | hash4 [element :a] | semmle.label | hash4 [element :a] | +| hash_flow.rb:69:10:69:14 | hash4 : [collection] [element :a] | semmle.label | hash4 : [collection] [element :a] | | hash_flow.rb:69:10:69:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:72:5:72:9 | hash5 [element a] | semmle.label | hash5 [element a] | -| hash_flow.rb:72:13:72:45 | ...[...] [element a] | semmle.label | ...[...] [element a] | +| hash_flow.rb:72:5:72:9 | hash5 : Hash [element a] | semmle.label | hash5 : Hash [element a] | +| hash_flow.rb:72:13:72:45 | ...[...] : Hash [element a] | semmle.label | ...[...] : Hash [element a] | | hash_flow.rb:72:25:72:34 | call to taint | semmle.label | call to taint | -| hash_flow.rb:73:10:73:14 | hash5 [element a] | semmle.label | hash5 [element a] | +| hash_flow.rb:73:10:73:14 | hash5 : Hash [element a] | semmle.label | hash5 : Hash [element a] | | hash_flow.rb:73:10:73:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:76:5:76:9 | hash6 [element a] | semmle.label | hash6 [element a] | -| hash_flow.rb:76:13:76:47 | ...[...] [element a] | semmle.label | ...[...] [element a] | -| hash_flow.rb:76:18:76:46 | call to [] [element a] | semmle.label | call to [] [element a] | +| hash_flow.rb:76:5:76:9 | hash6 : Hash [element a] | semmle.label | hash6 : Hash [element a] | +| hash_flow.rb:76:13:76:47 | ...[...] : Hash [element a] | semmle.label | ...[...] : Hash [element a] | +| hash_flow.rb:76:18:76:46 | call to [] : Hash [element a] | semmle.label | call to [] : Hash [element a] | | hash_flow.rb:76:26:76:35 | call to taint | semmle.label | call to taint | -| hash_flow.rb:77:10:77:14 | hash6 [element a] | semmle.label | hash6 [element a] | +| hash_flow.rb:77:10:77:14 | hash6 : Hash [element a] | semmle.label | hash6 : Hash [element a] | | hash_flow.rb:77:10:77:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:84:5:84:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:84:13:84:42 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:84:5:84:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:84:13:84:42 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:84:26:84:35 | call to taint | semmle.label | call to taint | -| hash_flow.rb:85:10:85:14 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:85:10:85:14 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:85:10:85:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:92:5:92:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:92:12:95:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:92:5:92:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:92:12:95:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:93:15:93:24 | call to taint | semmle.label | call to taint | -| hash_flow.rb:96:5:96:9 | hash2 [element :a] | semmle.label | hash2 [element :a] | -| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | semmle.label | call to try_convert [element :a] | -| hash_flow.rb:96:30:96:33 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:97:10:97:14 | hash2 [element :a] | semmle.label | hash2 [element :a] | +| hash_flow.rb:96:5:96:9 | hash2 : Hash [element :a] | semmle.label | hash2 : Hash [element :a] | +| hash_flow.rb:96:13:96:34 | call to try_convert : Hash [element :a] | semmle.label | call to try_convert : Hash [element :a] | +| hash_flow.rb:96:30:96:33 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:97:10:97:14 | hash2 : Hash [element :a] | semmle.label | hash2 : Hash [element :a] | | hash_flow.rb:97:10:97:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:105:5:105:5 | b | semmle.label | b | | hash_flow.rb:105:21:105:30 | call to taint | semmle.label | call to taint | | hash_flow.rb:106:10:106:10 | b | semmle.label | b | | hash_flow.rb:113:5:113:5 | b | semmle.label | b | -| hash_flow.rb:113:9:113:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | +| hash_flow.rb:113:9:113:12 | [post] hash : [collection] [element :a] | semmle.label | [post] hash : [collection] [element :a] | | hash_flow.rb:113:9:113:34 | call to store | semmle.label | call to store | | hash_flow.rb:113:24:113:33 | call to taint | semmle.label | call to taint | -| hash_flow.rb:114:10:114:13 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:114:10:114:13 | hash : [collection] [element :a] | semmle.label | hash : [collection] [element :a] | | hash_flow.rb:114:10:114:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:115:10:115:10 | b | semmle.label | b | | hash_flow.rb:118:5:118:5 | c | semmle.label | c | -| hash_flow.rb:118:9:118:12 | [post] hash [element] | semmle.label | [post] hash [element] | +| hash_flow.rb:118:9:118:12 | [post] hash : [collection] [element] | semmle.label | [post] hash : [collection] [element] | | hash_flow.rb:118:9:118:33 | call to store | semmle.label | call to store | | hash_flow.rb:118:23:118:32 | call to taint | semmle.label | call to taint | -| hash_flow.rb:119:10:119:13 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:119:10:119:13 | hash : [collection] [element] | semmle.label | hash : [collection] [element] | | hash_flow.rb:119:10:119:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:120:10:120:13 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:120:10:120:13 | hash : [collection] [element] | semmle.label | hash : [collection] [element] | | hash_flow.rb:120:10:120:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:121:10:121:10 | c | semmle.label | c | -| hash_flow.rb:127:5:127:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:127:12:130:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:127:5:127:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:127:12:130:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:128:15:128:24 | call to taint | semmle.label | call to taint | -| hash_flow.rb:131:5:131:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:131:5:131:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:131:18:131:29 | key_or_value | semmle.label | key_or_value | | hash_flow.rb:132:14:132:25 | key_or_value | semmle.label | key_or_value | -| hash_flow.rb:134:5:134:8 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:134:5:134:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:134:22:134:26 | value | semmle.label | value | | hash_flow.rb:136:14:136:18 | value | semmle.label | value | -| hash_flow.rb:143:5:143:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:143:12:146:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:143:5:143:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:143:12:146:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:144:15:144:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:147:5:147:5 | b [element 1] | semmle.label | b [element 1] | -| hash_flow.rb:147:9:147:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:147:9:147:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | -| hash_flow.rb:149:10:149:10 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:147:5:147:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| hash_flow.rb:147:9:147:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:147:9:147:22 | call to assoc : [collection] [element 1] | semmle.label | call to assoc : [collection] [element 1] | +| hash_flow.rb:149:10:149:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | hash_flow.rb:149:10:149:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:150:10:150:10 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:150:10:150:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | hash_flow.rb:150:10:150:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:151:5:151:5 | c [element 1] | semmle.label | c [element 1] | -| hash_flow.rb:151:9:151:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:151:9:151:21 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | -| hash_flow.rb:152:10:152:10 | c [element 1] | semmle.label | c [element 1] | +| hash_flow.rb:151:5:151:5 | c : [collection] [element 1] | semmle.label | c : [collection] [element 1] | +| hash_flow.rb:151:9:151:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:151:9:151:21 | call to assoc : [collection] [element 1] | semmle.label | call to assoc : [collection] [element 1] | +| hash_flow.rb:152:10:152:10 | c : [collection] [element 1] | semmle.label | c : [collection] [element 1] | | hash_flow.rb:152:10:152:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:169:5:169:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:169:12:172:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:169:5:169:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:169:12:172:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:170:15:170:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:173:5:173:5 | a [element :a] | semmle.label | a [element :a] | -| hash_flow.rb:173:9:173:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:173:9:173:20 | call to compact [element :a] | semmle.label | call to compact [element :a] | -| hash_flow.rb:174:10:174:10 | a [element :a] | semmle.label | a [element :a] | +| hash_flow.rb:173:5:173:5 | a : Hash [element :a] | semmle.label | a : Hash [element :a] | +| hash_flow.rb:173:9:173:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:173:9:173:20 | call to compact : Hash [element :a] | semmle.label | call to compact : Hash [element :a] | +| hash_flow.rb:174:10:174:10 | a : Hash [element :a] | semmle.label | a : Hash [element :a] | | hash_flow.rb:174:10:174:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:181:5:181:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:181:12:184:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:181:5:181:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:181:12:184:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:182:15:182:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:185:5:185:5 | a | semmle.label | a | -| hash_flow.rb:185:9:185:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:185:9:185:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:185:9:185:23 | call to delete | semmle.label | call to delete | | hash_flow.rb:186:10:186:10 | a | semmle.label | a | -| hash_flow.rb:193:5:193:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:193:12:196:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:193:5:193:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:193:12:196:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:194:15:194:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:197:5:197:5 | a [element :a] | semmle.label | a [element :a] | -| hash_flow.rb:197:9:197:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:197:9:197:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] | semmle.label | call to delete_if [element :a] | +| hash_flow.rb:197:5:197:5 | a : Hash [element :a] | semmle.label | a : Hash [element :a] | +| hash_flow.rb:197:9:197:12 | [post] hash : Hash [element :a] | semmle.label | [post] hash : Hash [element :a] | +| hash_flow.rb:197:9:197:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:197:9:200:7 | call to delete_if : Hash [element :a] | semmle.label | call to delete_if : Hash [element :a] | | hash_flow.rb:197:33:197:37 | value | semmle.label | value | | hash_flow.rb:199:14:199:18 | value | semmle.label | value | -| hash_flow.rb:201:10:201:10 | a [element :a] | semmle.label | a [element :a] | +| hash_flow.rb:201:10:201:10 | a : Hash [element :a] | semmle.label | a : Hash [element :a] | | hash_flow.rb:201:10:201:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:202:10:202:13 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:202:10:202:13 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:202:10:202:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:209:5:209:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] | semmle.label | hash [element :c, element :d] | -| hash_flow.rb:209:12:216:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:209:12:216:5 | call to [] [element :c, element :d] | semmle.label | call to [] [element :c, element :d] | +| hash_flow.rb:209:5:209:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:209:5:209:8 | hash : Hash [element :c, element :d] | semmle.label | hash : Hash [element :c, element :d] | +| hash_flow.rb:209:12:216:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:209:12:216:5 | call to [] : Hash [element :c, element :d] | semmle.label | call to [] : Hash [element :c, element :d] | | hash_flow.rb:210:15:210:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:212:15:215:9 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:212:15:215:9 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | | hash_flow.rb:213:19:213:29 | call to taint | semmle.label | call to taint | -| hash_flow.rb:217:10:217:13 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:217:10:217:13 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:217:10:217:21 | call to dig | semmle.label | call to dig | -| hash_flow.rb:219:10:219:13 | hash [element :c, element :d] | semmle.label | hash [element :c, element :d] | +| hash_flow.rb:219:10:219:13 | hash : Hash [element :c, element :d] | semmle.label | hash : Hash [element :c, element :d] | | hash_flow.rb:219:10:219:24 | call to dig | semmle.label | call to dig | -| hash_flow.rb:226:5:226:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:226:12:229:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:226:5:226:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:226:12:229:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:227:15:227:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:230:5:230:5 | x [element :a] | semmle.label | x [element :a] | -| hash_flow.rb:230:9:230:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:230:9:233:7 | call to each [element :a] | semmle.label | call to each [element :a] | +| hash_flow.rb:230:5:230:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_flow.rb:230:9:230:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:230:9:233:7 | call to each : Hash [element :a] | semmle.label | call to each : Hash [element :a] | | hash_flow.rb:230:28:230:32 | value | semmle.label | value | | hash_flow.rb:232:14:232:18 | value | semmle.label | value | -| hash_flow.rb:234:10:234:10 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:234:10:234:10 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | | hash_flow.rb:234:10:234:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:241:5:241:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:241:12:244:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:241:5:241:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:241:12:244:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:242:15:242:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:245:5:245:5 | x [element :a] | semmle.label | x [element :a] | -| hash_flow.rb:245:9:245:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:245:9:247:7 | call to each_key [element :a] | semmle.label | call to each_key [element :a] | -| hash_flow.rb:248:10:248:10 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:245:5:245:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_flow.rb:245:9:245:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:245:9:247:7 | call to each_key : Hash [element :a] | semmle.label | call to each_key : Hash [element :a] | +| hash_flow.rb:248:10:248:10 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | | hash_flow.rb:248:10:248:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:255:5:255:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:255:12:258:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:255:5:255:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:255:12:258:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:256:15:256:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:259:5:259:5 | x [element :a] | semmle.label | x [element :a] | -| hash_flow.rb:259:9:259:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] | semmle.label | call to each_pair [element :a] | +| hash_flow.rb:259:5:259:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_flow.rb:259:9:259:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:259:9:262:7 | call to each_pair : Hash [element :a] | semmle.label | call to each_pair : Hash [element :a] | | hash_flow.rb:259:33:259:37 | value | semmle.label | value | | hash_flow.rb:261:14:261:18 | value | semmle.label | value | -| hash_flow.rb:263:10:263:10 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:263:10:263:10 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | | hash_flow.rb:263:10:263:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:270:5:270:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:270:12:273:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:270:5:270:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:270:12:273:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:271:15:271:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:274:5:274:5 | x [element :a] | semmle.label | x [element :a] | -| hash_flow.rb:274:9:274:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:274:9:276:7 | call to each_value [element :a] | semmle.label | call to each_value [element :a] | +| hash_flow.rb:274:5:274:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_flow.rb:274:9:274:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:274:9:276:7 | call to each_value : Hash [element :a] | semmle.label | call to each_value : Hash [element :a] | | hash_flow.rb:274:29:274:33 | value | semmle.label | value | | hash_flow.rb:275:14:275:18 | value | semmle.label | value | -| hash_flow.rb:277:10:277:10 | x [element :a] | semmle.label | x [element :a] | +| hash_flow.rb:277:10:277:10 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | | hash_flow.rb:277:10:277:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:284:5:284:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:284:12:289:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:284:5:284:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:284:12:289:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:287:15:287:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:290:5:290:5 | x [element :c] | semmle.label | x [element :c] | -| hash_flow.rb:290:9:290:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:290:9:290:28 | call to except [element :c] | semmle.label | call to except [element :c] | -| hash_flow.rb:293:10:293:10 | x [element :c] | semmle.label | x [element :c] | +| hash_flow.rb:290:5:290:5 | x : Hash [element :c] | semmle.label | x : Hash [element :c] | +| hash_flow.rb:290:9:290:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:290:9:290:28 | call to except : Hash [element :c] | semmle.label | call to except : Hash [element :c] | +| hash_flow.rb:293:10:293:10 | x : Hash [element :c] | semmle.label | x : Hash [element :c] | | hash_flow.rb:293:10:293:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:300:5:300:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:300:5:300:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:300:12:304:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:300:12:304:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:300:5:300:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:300:12:304:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:300:12:304:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:301:15:301:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:303:15:303:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:305:5:305:5 | b | semmle.label | b | -| hash_flow.rb:305:9:305:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:305:9:305:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:305:9:305:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:305:9:305:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:305:9:307:7 | call to fetch | semmle.label | call to fetch | | hash_flow.rb:305:20:305:30 | call to taint | semmle.label | call to taint | | hash_flow.rb:305:37:305:37 | x | semmle.label | x | | hash_flow.rb:306:14:306:14 | x | semmle.label | x | | hash_flow.rb:308:10:308:10 | b | semmle.label | b | | hash_flow.rb:309:5:309:5 | b | semmle.label | b | -| hash_flow.rb:309:9:309:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:309:9:309:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:309:9:309:22 | call to fetch | semmle.label | call to fetch | | hash_flow.rb:310:10:310:10 | b | semmle.label | b | | hash_flow.rb:311:5:311:5 | b | semmle.label | b | -| hash_flow.rb:311:9:311:12 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:311:9:311:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:311:9:311:35 | call to fetch | semmle.label | call to fetch | | hash_flow.rb:311:24:311:34 | call to taint | semmle.label | call to taint | | hash_flow.rb:312:10:312:10 | b | semmle.label | b | @@ -1369,911 +1369,911 @@ nodes | hash_flow.rb:313:24:313:34 | call to taint | semmle.label | call to taint | | hash_flow.rb:314:10:314:10 | b | semmle.label | b | | hash_flow.rb:315:5:315:5 | b | semmle.label | b | -| hash_flow.rb:315:9:315:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:315:9:315:12 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:315:9:315:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:315:9:315:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:315:9:315:34 | call to fetch | semmle.label | call to fetch | | hash_flow.rb:315:23:315:33 | call to taint | semmle.label | call to taint | | hash_flow.rb:316:10:316:10 | b | semmle.label | b | -| hash_flow.rb:322:5:322:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:322:5:322:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:322:12:326:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:322:12:326:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:322:5:322:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:322:5:322:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:322:12:326:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:322:12:326:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:323:15:323:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:325:15:325:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:327:5:327:5 | b [element] | semmle.label | b [element] | -| hash_flow.rb:327:9:327:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:327:9:327:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:327:9:330:7 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | +| hash_flow.rb:327:5:327:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| hash_flow.rb:327:9:327:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:327:9:327:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:327:9:330:7 | call to fetch_values : [collection] [element] | semmle.label | call to fetch_values : [collection] [element] | | hash_flow.rb:327:27:327:37 | call to taint | semmle.label | call to taint | | hash_flow.rb:327:44:327:44 | x | semmle.label | x | | hash_flow.rb:328:14:328:14 | x | semmle.label | x | | hash_flow.rb:329:9:329:19 | call to taint | semmle.label | call to taint | -| hash_flow.rb:331:10:331:10 | b [element] | semmle.label | b [element] | +| hash_flow.rb:331:10:331:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | hash_flow.rb:331:10:331:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:332:5:332:5 | b [element] | semmle.label | b [element] | -| hash_flow.rb:332:9:332:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:332:9:332:29 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | -| hash_flow.rb:333:10:333:10 | b [element] | semmle.label | b [element] | +| hash_flow.rb:332:5:332:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| hash_flow.rb:332:9:332:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:332:9:332:29 | call to fetch_values : [collection] [element] | semmle.label | call to fetch_values : [collection] [element] | +| hash_flow.rb:333:10:333:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | hash_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:334:5:334:5 | b [element] | semmle.label | b [element] | -| hash_flow.rb:334:9:334:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:334:9:334:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:334:9:334:31 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | -| hash_flow.rb:335:10:335:10 | b [element] | semmle.label | b [element] | +| hash_flow.rb:334:5:334:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| hash_flow.rb:334:9:334:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:334:9:334:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:334:9:334:31 | call to fetch_values : [collection] [element] | semmle.label | call to fetch_values : [collection] [element] | +| hash_flow.rb:335:10:335:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | hash_flow.rb:335:10:335:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:341:5:341:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:341:5:341:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:341:12:345:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:341:12:345:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:341:5:341:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:341:5:341:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:341:12:345:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:341:12:345:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:342:15:342:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:344:15:344:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:346:5:346:5 | b [element :a] | semmle.label | b [element :a] | -| hash_flow.rb:346:9:346:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:346:9:346:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:346:9:350:7 | call to filter [element :a] | semmle.label | call to filter [element :a] | +| hash_flow.rb:346:5:346:5 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | +| hash_flow.rb:346:9:346:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:346:9:346:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:346:9:350:7 | call to filter : Hash [element :a] | semmle.label | call to filter : Hash [element :a] | | hash_flow.rb:346:30:346:34 | value | semmle.label | value | | hash_flow.rb:348:14:348:18 | value | semmle.label | value | | hash_flow.rb:351:10:351:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:351:11:351:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:351:11:351:11 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | | hash_flow.rb:351:11:351:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:357:5:357:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:357:5:357:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:357:12:361:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:357:12:361:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:357:5:357:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:357:5:357:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:357:12:361:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:357:12:361:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:358:15:358:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:360:15:360:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:362:5:362:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:362:5:362:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:362:5:362:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:362:5:362:8 | [post] hash : Hash [element :a] | semmle.label | [post] hash : Hash [element :a] | +| hash_flow.rb:362:5:362:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:362:5:362:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:362:27:362:31 | value | semmle.label | value | | hash_flow.rb:364:14:364:18 | value | semmle.label | value | | hash_flow.rb:367:10:367:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:367:11:367:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:367:11:367:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:367:11:367:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:373:5:373:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:373:5:373:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:373:12:377:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:373:12:377:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:373:5:373:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:373:5:373:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:373:12:377:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:373:12:377:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:374:15:374:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:376:15:376:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:378:5:378:5 | b [element] | semmle.label | b [element] | -| hash_flow.rb:378:9:378:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:378:9:378:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:378:9:378:20 | call to flatten [element] | semmle.label | call to flatten [element] | +| hash_flow.rb:378:5:378:5 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | +| hash_flow.rb:378:9:378:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:378:9:378:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:378:9:378:20 | call to flatten : [collection] [element] : [collection] | semmle.label | call to flatten : [collection] [element] : [collection] | | hash_flow.rb:379:10:379:15 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:379:11:379:11 | b [element] | semmle.label | b [element] | -| hash_flow.rb:379:11:379:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:385:5:385:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:385:5:385:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:385:12:389:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:385:12:389:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:379:11:379:11 | b : [collection] [element] : [collection] | semmle.label | b : [collection] [element] : [collection] | +| hash_flow.rb:379:11:379:14 | ...[...] : [collection] | semmle.label | ...[...] : [collection] | +| hash_flow.rb:385:5:385:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:385:5:385:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:385:12:389:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:385:12:389:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:386:15:386:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:388:15:388:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:390:5:390:5 | b [element :a] | semmle.label | b [element :a] | -| hash_flow.rb:390:9:390:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:390:9:390:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:390:9:390:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] | semmle.label | call to keep_if [element :a] | +| hash_flow.rb:390:5:390:5 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | +| hash_flow.rb:390:9:390:12 | [post] hash : Hash [element :a] | semmle.label | [post] hash : Hash [element :a] | +| hash_flow.rb:390:9:390:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:390:9:390:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:390:9:394:7 | call to keep_if : Hash [element :a] | semmle.label | call to keep_if : Hash [element :a] | | hash_flow.rb:390:31:390:35 | value | semmle.label | value | | hash_flow.rb:392:14:392:18 | value | semmle.label | value | | hash_flow.rb:395:10:395:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:395:11:395:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:395:11:395:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:395:11:395:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:396:10:396:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:396:11:396:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:396:11:396:11 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | | hash_flow.rb:396:11:396:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:402:5:402:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:402:5:402:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:402:13:406:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:402:13:406:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:402:5:402:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:402:5:402:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:402:13:406:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:402:13:406:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:403:15:403:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:405:15:405:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:407:5:407:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:407:5:407:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:407:13:411:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:407:13:411:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:407:5:407:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:407:5:407:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:407:13:411:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:407:13:411:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:408:15:408:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:410:15:410:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:412:5:412:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:412:5:412:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:412:5:412:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:412:5:412:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:412:12:412:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:412:12:412:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:412:12:416:7 | call to merge [element :a] | semmle.label | call to merge [element :a] | -| hash_flow.rb:412:12:416:7 | call to merge [element :c] | semmle.label | call to merge [element :c] | -| hash_flow.rb:412:12:416:7 | call to merge [element :d] | semmle.label | call to merge [element :d] | -| hash_flow.rb:412:12:416:7 | call to merge [element :f] | semmle.label | call to merge [element :f] | -| hash_flow.rb:412:24:412:28 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:412:24:412:28 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:412:5:412:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:412:12:412:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :a] | semmle.label | call to merge : Hash [element :a] | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :c] | semmle.label | call to merge : Hash [element :c] | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :d] | semmle.label | call to merge : Hash [element :d] | +| hash_flow.rb:412:12:416:7 | call to merge : Hash [element :f] | semmle.label | call to merge : Hash [element :f] | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:412:24:412:28 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:412:40:412:48 | old_value | semmle.label | old_value | | hash_flow.rb:412:51:412:59 | new_value | semmle.label | new_value | | hash_flow.rb:414:14:414:22 | old_value | semmle.label | old_value | | hash_flow.rb:415:14:415:22 | new_value | semmle.label | new_value | | hash_flow.rb:417:10:417:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:417:11:417:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:417:11:417:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:417:11:417:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:419:10:419:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:419:11:419:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:419:11:419:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:419:11:419:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:420:10:420:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:420:11:420:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:420:11:420:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:420:11:420:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:422:10:422:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:422:11:422:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:422:11:422:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:422:11:422:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:428:5:428:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:428:5:428:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:428:13:432:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:428:13:432:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:428:5:428:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:428:5:428:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:428:13:432:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:428:13:432:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:429:15:429:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:431:15:431:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:433:5:433:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:433:5:433:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:433:13:437:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:433:13:437:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:433:5:433:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:433:5:433:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:433:13:437:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:433:13:437:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:434:15:434:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:436:15:436:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:438:5:438:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:438:5:438:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:438:5:438:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:438:5:438:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | -| hash_flow.rb:438:12:438:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | -| hash_flow.rb:438:12:438:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:438:12:438:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:438:12:442:7 | call to merge! [element :a] | semmle.label | call to merge! [element :a] | -| hash_flow.rb:438:12:442:7 | call to merge! [element :c] | semmle.label | call to merge! [element :c] | -| hash_flow.rb:438:12:442:7 | call to merge! [element :d] | semmle.label | call to merge! [element :d] | -| hash_flow.rb:438:12:442:7 | call to merge! [element :f] | semmle.label | call to merge! [element :f] | -| hash_flow.rb:438:25:438:29 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:438:25:438:29 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:438:5:438:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :a] | semmle.label | [post] hash1 : Hash [element :a] | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :c] | semmle.label | [post] hash1 : Hash [element :c] | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :d] | semmle.label | [post] hash1 : Hash [element :d] | +| hash_flow.rb:438:12:438:16 | [post] hash1 : Hash [element :f] | semmle.label | [post] hash1 : Hash [element :f] | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:438:12:438:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :a] | semmle.label | call to merge! : Hash [element :a] | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :c] | semmle.label | call to merge! : Hash [element :c] | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :d] | semmle.label | call to merge! : Hash [element :d] | +| hash_flow.rb:438:12:442:7 | call to merge! : Hash [element :f] | semmle.label | call to merge! : Hash [element :f] | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:438:25:438:29 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:438:41:438:49 | old_value | semmle.label | old_value | | hash_flow.rb:438:52:438:60 | new_value | semmle.label | new_value | | hash_flow.rb:440:14:440:22 | old_value | semmle.label | old_value | | hash_flow.rb:441:14:441:22 | new_value | semmle.label | new_value | | hash_flow.rb:443:10:443:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:443:11:443:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:443:11:443:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:443:11:443:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:445:10:445:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:445:11:445:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:445:11:445:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:445:11:445:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:446:10:446:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:446:11:446:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:446:11:446:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:446:11:446:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:448:10:448:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:448:11:448:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:448:11:448:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:448:11:448:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:450:10:450:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:450:11:450:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:450:11:450:15 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:450:11:450:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:452:10:452:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:452:11:452:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:452:11:452:15 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | | hash_flow.rb:452:11:452:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:453:10:453:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:453:11:453:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:453:11:453:15 | hash1 : Hash [element :d] | semmle.label | hash1 : Hash [element :d] | | hash_flow.rb:453:11:453:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:455:10:455:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:455:11:455:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:455:11:455:15 | hash1 : Hash [element :f] | semmle.label | hash1 : Hash [element :f] | | hash_flow.rb:455:11:455:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:461:5:461:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:461:12:464:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:461:5:461:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:461:12:464:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:462:15:462:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:465:5:465:5 | b [element 1] | semmle.label | b [element 1] | -| hash_flow.rb:465:9:465:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] | semmle.label | call to rassoc [element 1] | -| hash_flow.rb:467:10:467:10 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:465:5:465:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| hash_flow.rb:465:9:465:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:465:9:465:22 | call to rassoc : [collection] [element 1] | semmle.label | call to rassoc : [collection] [element 1] | +| hash_flow.rb:467:10:467:10 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | hash_flow.rb:467:10:467:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:473:5:473:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:473:12:476:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:473:5:473:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:473:12:476:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:474:15:474:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:477:5:477:5 | b [element :a] | semmle.label | b [element :a] | -| hash_flow.rb:477:9:477:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:477:9:481:7 | call to reject [element :a] | semmle.label | call to reject [element :a] | +| hash_flow.rb:477:5:477:5 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | +| hash_flow.rb:477:9:477:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:477:9:481:7 | call to reject : Hash [element :a] | semmle.label | call to reject : Hash [element :a] | | hash_flow.rb:477:29:477:33 | value | semmle.label | value | | hash_flow.rb:479:14:479:18 | value | semmle.label | value | -| hash_flow.rb:482:10:482:10 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:482:10:482:10 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | | hash_flow.rb:482:10:482:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:488:5:488:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:488:12:491:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:488:5:488:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:488:12:491:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:489:15:489:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:492:5:492:5 | b [element :a] | semmle.label | b [element :a] | -| hash_flow.rb:492:9:492:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:492:9:492:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:492:9:496:7 | call to reject! [element :a] | semmle.label | call to reject! [element :a] | +| hash_flow.rb:492:5:492:5 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | +| hash_flow.rb:492:9:492:12 | [post] hash : Hash [element :a] | semmle.label | [post] hash : Hash [element :a] | +| hash_flow.rb:492:9:492:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:492:9:496:7 | call to reject! : Hash [element :a] | semmle.label | call to reject! : Hash [element :a] | | hash_flow.rb:492:30:492:34 | value | semmle.label | value | | hash_flow.rb:494:14:494:18 | value | semmle.label | value | -| hash_flow.rb:497:10:497:10 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:497:10:497:10 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | | hash_flow.rb:497:10:497:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:498:10:498:13 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:498:10:498:13 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:498:10:498:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:504:5:504:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:504:5:504:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:504:12:508:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:504:12:508:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:504:5:504:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:504:5:504:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:504:12:508:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:504:12:508:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:505:15:505:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:507:15:507:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] | semmle.label | [post] hash2 [element :a] | -| hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] | semmle.label | [post] hash2 [element :c] | -| hash_flow.rb:512:19:512:22 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:512:19:512:22 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:512:5:512:9 | [post] hash2 : Hash [element :a] | semmle.label | [post] hash2 : Hash [element :a] | +| hash_flow.rb:512:5:512:9 | [post] hash2 : Hash [element :c] | semmle.label | [post] hash2 : Hash [element :c] | +| hash_flow.rb:512:19:512:22 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:512:19:512:22 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:513:10:513:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:513:11:513:15 | hash2 [element :a] | semmle.label | hash2 [element :a] | +| hash_flow.rb:513:11:513:15 | hash2 : Hash [element :a] | semmle.label | hash2 : Hash [element :a] | | hash_flow.rb:513:11:513:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:515:10:515:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:515:11:515:15 | hash2 [element :c] | semmle.label | hash2 [element :c] | +| hash_flow.rb:515:11:515:15 | hash2 : Hash [element :c] | semmle.label | hash2 : Hash [element :c] | | hash_flow.rb:515:11:515:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:519:5:519:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:519:5:519:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:519:12:523:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:519:12:523:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:519:5:519:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:519:5:519:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:519:12:523:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:519:12:523:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:520:15:520:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:522:15:522:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:524:5:524:5 | b [element :a] | semmle.label | b [element :a] | -| hash_flow.rb:524:9:524:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:524:9:524:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:524:9:528:7 | call to select [element :a] | semmle.label | call to select [element :a] | +| hash_flow.rb:524:5:524:5 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | +| hash_flow.rb:524:9:524:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:524:9:524:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:524:9:528:7 | call to select : Hash [element :a] | semmle.label | call to select : Hash [element :a] | | hash_flow.rb:524:30:524:34 | value | semmle.label | value | | hash_flow.rb:526:14:526:18 | value | semmle.label | value | | hash_flow.rb:529:10:529:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:529:11:529:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:529:11:529:11 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | | hash_flow.rb:529:11:529:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:535:5:535:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:535:5:535:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:535:12:539:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:535:12:539:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:535:5:535:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:535:5:535:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:535:12:539:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:535:12:539:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:536:15:536:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:538:15:538:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:540:5:540:8 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:540:5:540:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:540:5:540:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:540:5:540:8 | [post] hash : Hash [element :a] | semmle.label | [post] hash : Hash [element :a] | +| hash_flow.rb:540:5:540:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:540:5:540:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:540:27:540:31 | value | semmle.label | value | | hash_flow.rb:542:14:542:18 | value | semmle.label | value | | hash_flow.rb:545:10:545:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:545:11:545:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:545:11:545:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:545:11:545:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:551:5:551:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:551:5:551:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:551:12:555:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:551:12:555:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:551:5:551:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:551:5:551:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:551:12:555:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:551:12:555:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:552:15:552:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:554:15:554:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:556:5:556:5 | b [element 1] | semmle.label | b [element 1] | -| hash_flow.rb:556:9:556:12 | [post] hash [element :a] | semmle.label | [post] hash [element :a] | -| hash_flow.rb:556:9:556:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:556:9:556:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:556:9:556:18 | call to shift [element 1] | semmle.label | call to shift [element 1] | +| hash_flow.rb:556:5:556:5 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | +| hash_flow.rb:556:9:556:12 | [post] hash : Hash [element :a] | semmle.label | [post] hash : Hash [element :a] | +| hash_flow.rb:556:9:556:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:556:9:556:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:556:9:556:18 | call to shift : [collection] [element 1] | semmle.label | call to shift : [collection] [element 1] | | hash_flow.rb:557:10:557:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:557:11:557:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:557:11:557:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:557:11:557:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:559:10:559:15 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:559:11:559:11 | b [element 1] | semmle.label | b [element 1] | +| hash_flow.rb:559:11:559:11 | b : [collection] [element 1] | semmle.label | b : [collection] [element 1] | | hash_flow.rb:559:11:559:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:565:5:565:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:565:5:565:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:565:12:569:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:565:12:569:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:565:5:565:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:565:5:565:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:565:12:569:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:565:12:569:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:566:15:566:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:568:15:568:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:570:5:570:5 | b [element :a] | semmle.label | b [element :a] | -| hash_flow.rb:570:9:570:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:570:9:570:26 | call to slice [element :a] | semmle.label | call to slice [element :a] | +| hash_flow.rb:570:5:570:5 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | +| hash_flow.rb:570:9:570:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:570:9:570:26 | call to slice : Hash [element :a] | semmle.label | call to slice : Hash [element :a] | | hash_flow.rb:571:10:571:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:571:11:571:11 | b [element :a] | semmle.label | b [element :a] | +| hash_flow.rb:571:11:571:11 | b : Hash [element :a] | semmle.label | b : Hash [element :a] | | hash_flow.rb:571:11:571:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:575:5:575:5 | c [element :a] | semmle.label | c [element :a] | -| hash_flow.rb:575:5:575:5 | c [element :c] | semmle.label | c [element :c] | -| hash_flow.rb:575:9:575:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:575:9:575:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:575:9:575:25 | call to slice [element :a] | semmle.label | call to slice [element :a] | -| hash_flow.rb:575:9:575:25 | call to slice [element :c] | semmle.label | call to slice [element :c] | +| hash_flow.rb:575:5:575:5 | c : Hash [element :a] | semmle.label | c : Hash [element :a] | +| hash_flow.rb:575:5:575:5 | c : Hash [element :c] | semmle.label | c : Hash [element :c] | +| hash_flow.rb:575:9:575:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:575:9:575:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:575:9:575:25 | call to slice : Hash [element :a] | semmle.label | call to slice : Hash [element :a] | +| hash_flow.rb:575:9:575:25 | call to slice : Hash [element :c] | semmle.label | call to slice : Hash [element :c] | | hash_flow.rb:576:10:576:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:576:11:576:11 | c [element :a] | semmle.label | c [element :a] | +| hash_flow.rb:576:11:576:11 | c : Hash [element :a] | semmle.label | c : Hash [element :a] | | hash_flow.rb:576:11:576:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:578:10:578:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:578:11:578:11 | c [element :c] | semmle.label | c [element :c] | +| hash_flow.rb:578:11:578:11 | c : Hash [element :c] | semmle.label | c : Hash [element :c] | | hash_flow.rb:578:11:578:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:584:5:584:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:584:5:584:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:584:12:588:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:584:12:588:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:584:5:584:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:584:5:584:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:584:12:588:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:584:12:588:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:585:15:585:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:587:15:587:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:589:5:589:5 | a [element, element 1] | semmle.label | a [element, element 1] | -| hash_flow.rb:589:9:589:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:589:9:589:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] | semmle.label | call to to_a [element, element 1] | +| hash_flow.rb:589:5:589:5 | a : [collection] [element, element 1] | semmle.label | a : [collection] [element, element 1] | +| hash_flow.rb:589:9:589:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:589:9:589:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:589:9:589:17 | call to to_a : [collection] [element, element 1] | semmle.label | call to to_a : [collection] [element, element 1] | | hash_flow.rb:591:10:591:18 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:591:11:591:11 | a [element, element 1] | semmle.label | a [element, element 1] | +| hash_flow.rb:591:11:591:11 | a : [collection] [element, element 1] | semmle.label | a : [collection] [element, element 1] | | hash_flow.rb:591:11:591:14 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_flow.rb:591:11:591:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:597:5:597:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:597:5:597:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:597:12:601:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:597:12:601:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:597:5:597:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:597:5:597:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:597:12:601:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:597:12:601:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:598:15:598:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:600:15:600:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:602:5:602:5 | a [element :a] | semmle.label | a [element :a] | -| hash_flow.rb:602:5:602:5 | a [element :c] | semmle.label | a [element :c] | -| hash_flow.rb:602:9:602:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:602:9:602:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:602:9:602:17 | call to to_h [element :a] | semmle.label | call to to_h [element :a] | -| hash_flow.rb:602:9:602:17 | call to to_h [element :c] | semmle.label | call to to_h [element :c] | +| hash_flow.rb:602:5:602:5 | a : Hash [element :a] | semmle.label | a : Hash [element :a] | +| hash_flow.rb:602:5:602:5 | a : Hash [element :c] | semmle.label | a : Hash [element :c] | +| hash_flow.rb:602:9:602:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:602:9:602:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:602:9:602:17 | call to to_h : Hash [element :a] | semmle.label | call to to_h : Hash [element :a] | +| hash_flow.rb:602:9:602:17 | call to to_h : Hash [element :c] | semmle.label | call to to_h : Hash [element :c] | | hash_flow.rb:603:10:603:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:603:11:603:11 | a [element :a] | semmle.label | a [element :a] | +| hash_flow.rb:603:11:603:11 | a : Hash [element :a] | semmle.label | a : Hash [element :a] | | hash_flow.rb:603:11:603:15 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:605:10:605:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:605:11:605:11 | a [element :c] | semmle.label | a [element :c] | +| hash_flow.rb:605:11:605:11 | a : Hash [element :c] | semmle.label | a : Hash [element :c] | | hash_flow.rb:605:11:605:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:607:5:607:5 | b [element] | semmle.label | b [element] | -| hash_flow.rb:607:9:607:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:607:9:607:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:607:9:611:7 | call to to_h [element] | semmle.label | call to to_h [element] | +| hash_flow.rb:607:5:607:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| hash_flow.rb:607:9:607:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:607:9:607:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:607:9:611:7 | call to to_h : [collection] [element] | semmle.label | call to to_h : [collection] [element] | | hash_flow.rb:607:28:607:32 | value | semmle.label | value | | hash_flow.rb:609:14:609:18 | value | semmle.label | value | -| hash_flow.rb:610:9:610:25 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| hash_flow.rb:610:9:610:25 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | hash_flow.rb:610:14:610:24 | call to taint | semmle.label | call to taint | | hash_flow.rb:612:10:612:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:612:11:612:11 | b [element] | semmle.label | b [element] | +| hash_flow.rb:612:11:612:11 | b : [collection] [element] | semmle.label | b : [collection] [element] | | hash_flow.rb:612:11:612:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:618:5:618:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:618:5:618:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:618:12:622:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:618:12:622:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:618:5:618:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:618:5:618:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:618:12:622:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:618:12:622:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:619:15:619:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:621:15:621:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:623:5:623:5 | a [element] | semmle.label | a [element] | -| hash_flow.rb:623:9:623:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:623:9:623:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] | semmle.label | call to transform_keys [element] | +| hash_flow.rb:623:5:623:5 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| hash_flow.rb:623:9:623:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:623:9:623:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:623:9:623:45 | call to transform_keys : [collection] [element] | semmle.label | call to transform_keys : [collection] [element] | | hash_flow.rb:624:10:624:17 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:624:11:624:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:624:11:624:11 | a : [collection] [element] | semmle.label | a : [collection] [element] | | hash_flow.rb:624:11:624:16 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:625:10:625:17 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:625:11:625:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:625:11:625:11 | a : [collection] [element] | semmle.label | a : [collection] [element] | | hash_flow.rb:625:11:625:16 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:626:10:626:17 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:626:11:626:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:626:11:626:11 | a : [collection] [element] | semmle.label | a : [collection] [element] | | hash_flow.rb:626:11:626:16 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:632:5:632:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:632:5:632:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:632:12:636:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:632:12:636:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:632:5:632:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:632:5:632:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:632:12:636:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:632:12:636:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:633:15:633:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:635:15:635:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:637:5:637:8 | [post] hash [element] | semmle.label | [post] hash [element] | +| hash_flow.rb:637:5:637:8 | [post] hash : [collection] [element] | semmle.label | [post] hash : [collection] [element] | | hash_flow.rb:637:15:637:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:639:5:639:8 | [post] hash [element] | semmle.label | [post] hash [element] | -| hash_flow.rb:639:5:639:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:639:5:639:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:639:5:639:8 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:639:5:639:8 | [post] hash : [collection] [element] | semmle.label | [post] hash : [collection] [element] | +| hash_flow.rb:639:5:639:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:639:5:639:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:639:5:639:8 | hash : [collection] [element] | semmle.label | hash : [collection] [element] | | hash_flow.rb:640:10:640:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:640:11:640:14 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:640:11:640:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:640:11:640:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:640:11:640:14 | hash : [collection] [element] | semmle.label | hash : [collection] [element] | | hash_flow.rb:640:11:640:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:641:10:641:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:641:11:641:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:641:11:641:14 | hash : [collection] [element] | semmle.label | hash : [collection] [element] | | hash_flow.rb:641:11:641:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:642:10:642:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:642:11:642:14 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:642:11:642:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:642:11:642:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:642:11:642:14 | hash : [collection] [element] | semmle.label | hash : [collection] [element] | | hash_flow.rb:642:11:642:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:648:5:648:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:648:5:648:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:648:12:652:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:648:12:652:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:648:5:648:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:648:5:648:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:648:12:652:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:648:12:652:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:649:15:649:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:651:15:651:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:653:5:653:5 | b [element] | semmle.label | b [element] | -| hash_flow.rb:653:9:653:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:653:9:653:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:653:9:656:7 | call to transform_values [element] | semmle.label | call to transform_values [element] | +| hash_flow.rb:653:5:653:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| hash_flow.rb:653:9:653:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:653:9:653:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:653:9:656:7 | call to transform_values : [collection] [element] | semmle.label | call to transform_values : [collection] [element] | | hash_flow.rb:653:35:653:39 | value | semmle.label | value | | hash_flow.rb:654:14:654:18 | value | semmle.label | value | | hash_flow.rb:655:9:655:19 | call to taint | semmle.label | call to taint | | hash_flow.rb:657:10:657:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:657:11:657:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:657:11:657:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:657:11:657:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:658:10:658:16 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:658:11:658:11 | b [element] | semmle.label | b [element] | +| hash_flow.rb:658:11:658:11 | b : [collection] [element] | semmle.label | b : [collection] [element] | | hash_flow.rb:658:11:658:15 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:664:5:664:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:664:5:664:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:664:12:668:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:664:12:668:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:664:5:664:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:664:5:664:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:664:12:668:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:664:12:668:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:665:15:665:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:667:15:667:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:669:5:669:8 | [post] hash [element] | semmle.label | [post] hash [element] | -| hash_flow.rb:669:5:669:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:669:5:669:8 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:669:5:669:8 | [post] hash : [collection] [element] | semmle.label | [post] hash : [collection] [element] | +| hash_flow.rb:669:5:669:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:669:5:669:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:669:32:669:36 | value | semmle.label | value | | hash_flow.rb:670:14:670:18 | value | semmle.label | value | | hash_flow.rb:671:9:671:19 | call to taint | semmle.label | call to taint | | hash_flow.rb:673:10:673:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:673:11:673:14 | hash [element] | semmle.label | hash [element] | +| hash_flow.rb:673:11:673:14 | hash : [collection] [element] | semmle.label | hash : [collection] [element] | | hash_flow.rb:673:11:673:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:679:5:679:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:679:5:679:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:679:13:683:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:679:13:683:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:679:5:679:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:679:5:679:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:679:13:683:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:679:13:683:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:680:15:680:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:682:15:682:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:684:5:684:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:684:5:684:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:684:13:688:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:684:13:688:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:684:5:684:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:684:5:684:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:684:13:688:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:684:13:688:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:685:15:685:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:687:15:687:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:689:5:689:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:689:5:689:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:689:5:689:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:689:5:689:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | -| hash_flow.rb:689:12:689:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | -| hash_flow.rb:689:12:689:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:689:12:689:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:689:12:693:7 | call to update [element :a] | semmle.label | call to update [element :a] | -| hash_flow.rb:689:12:693:7 | call to update [element :c] | semmle.label | call to update [element :c] | -| hash_flow.rb:689:12:693:7 | call to update [element :d] | semmle.label | call to update [element :d] | -| hash_flow.rb:689:12:693:7 | call to update [element :f] | semmle.label | call to update [element :f] | -| hash_flow.rb:689:25:689:29 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:689:25:689:29 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:689:5:689:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :a] | semmle.label | [post] hash1 : Hash [element :a] | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :c] | semmle.label | [post] hash1 : Hash [element :c] | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :d] | semmle.label | [post] hash1 : Hash [element :d] | +| hash_flow.rb:689:12:689:16 | [post] hash1 : Hash [element :f] | semmle.label | [post] hash1 : Hash [element :f] | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:689:12:689:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :a] | semmle.label | call to update : Hash [element :a] | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :c] | semmle.label | call to update : Hash [element :c] | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :d] | semmle.label | call to update : Hash [element :d] | +| hash_flow.rb:689:12:693:7 | call to update : Hash [element :f] | semmle.label | call to update : Hash [element :f] | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:689:25:689:29 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:689:41:689:49 | old_value | semmle.label | old_value | | hash_flow.rb:689:52:689:60 | new_value | semmle.label | new_value | | hash_flow.rb:691:14:691:22 | old_value | semmle.label | old_value | | hash_flow.rb:692:14:692:22 | new_value | semmle.label | new_value | | hash_flow.rb:694:10:694:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:694:11:694:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:694:11:694:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:694:11:694:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:696:10:696:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:696:11:696:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:696:11:696:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:696:11:696:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:697:10:697:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:697:11:697:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:697:11:697:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:697:11:697:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:699:10:699:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:699:11:699:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:699:11:699:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:699:11:699:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:701:10:701:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:701:11:701:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:701:11:701:15 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:701:11:701:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:703:10:703:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:703:11:703:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:703:11:703:15 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | | hash_flow.rb:703:11:703:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:704:10:704:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:704:11:704:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:704:11:704:15 | hash1 : Hash [element :d] | semmle.label | hash1 : Hash [element :d] | | hash_flow.rb:704:11:704:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:706:10:706:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:706:11:706:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:706:11:706:15 | hash1 : Hash [element :f] | semmle.label | hash1 : Hash [element :f] | | hash_flow.rb:706:11:706:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:712:5:712:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:712:5:712:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:712:12:716:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:712:12:716:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:712:5:712:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:712:5:712:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:712:12:716:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:712:12:716:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:713:15:713:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:715:15:715:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:717:5:717:5 | a [element] | semmle.label | a [element] | -| hash_flow.rb:717:9:717:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:717:9:717:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:717:9:717:19 | call to values [element] | semmle.label | call to values [element] | +| hash_flow.rb:717:5:717:5 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| hash_flow.rb:717:9:717:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:717:9:717:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:717:9:717:19 | call to values : [collection] [element] | semmle.label | call to values : [collection] [element] | | hash_flow.rb:718:10:718:15 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:718:11:718:11 | a [element] | semmle.label | a [element] | +| hash_flow.rb:718:11:718:11 | a : [collection] [element] | semmle.label | a : [collection] [element] | | hash_flow.rb:718:11:718:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:724:5:724:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:724:5:724:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:724:12:728:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:724:12:728:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:724:5:724:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:724:5:724:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:724:12:728:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:724:12:728:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:725:15:725:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:727:15:727:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:729:5:729:5 | b [element 0] | semmle.label | b [element 0] | -| hash_flow.rb:729:9:729:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:729:9:729:26 | call to values_at [element 0] | semmle.label | call to values_at [element 0] | -| hash_flow.rb:730:10:730:10 | b [element 0] | semmle.label | b [element 0] | +| hash_flow.rb:729:5:729:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| hash_flow.rb:729:9:729:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:729:9:729:26 | call to values_at : [collection] [element 0] | semmle.label | call to values_at : [collection] [element 0] | +| hash_flow.rb:730:10:730:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | hash_flow.rb:730:10:730:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:731:5:731:5 | b [element] | semmle.label | b [element] | -| hash_flow.rb:731:9:731:12 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:731:9:731:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:731:9:731:31 | call to fetch_values [element] | semmle.label | call to fetch_values [element] | -| hash_flow.rb:732:10:732:10 | b [element] | semmle.label | b [element] | +| hash_flow.rb:731:5:731:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| hash_flow.rb:731:9:731:12 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:731:9:731:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:731:9:731:31 | call to fetch_values : [collection] [element] | semmle.label | call to fetch_values : [collection] [element] | +| hash_flow.rb:732:10:732:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | hash_flow.rb:732:10:732:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:738:5:738:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:738:5:738:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:738:13:742:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:738:13:742:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:738:5:738:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:738:5:738:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:738:13:742:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:738:13:742:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:739:15:739:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:741:15:741:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:743:5:743:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:743:5:743:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:743:13:747:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:743:13:747:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:743:5:743:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:743:5:743:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:743:13:747:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:743:13:747:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:744:15:744:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:746:15:746:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:748:5:748:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:748:5:748:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:748:5:748:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:748:5:748:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:748:5:748:8 | hash [element :g] | semmle.label | hash [element :g] | -| hash_flow.rb:748:12:748:59 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:748:12:748:59 | call to [] [element :c] | semmle.label | call to [] [element :c] | -| hash_flow.rb:748:12:748:59 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:748:12:748:59 | call to [] [element :f] | semmle.label | call to [] [element :f] | -| hash_flow.rb:748:12:748:59 | call to [] [element :g] | semmle.label | call to [] [element :g] | -| hash_flow.rb:748:14:748:20 | ** ... [element :a] | semmle.label | ** ... [element :a] | -| hash_flow.rb:748:14:748:20 | ** ... [element :c] | semmle.label | ** ... [element :c] | -| hash_flow.rb:748:16:748:20 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:748:16:748:20 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:748:5:748:8 | hash : Hash [element :g] | semmle.label | hash : Hash [element :g] | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | +| hash_flow.rb:748:12:748:59 | call to [] : Hash [element :g] | semmle.label | call to [] : Hash [element :g] | +| hash_flow.rb:748:14:748:20 | ** ... : Hash [element :a] | semmle.label | ** ... : Hash [element :a] | +| hash_flow.rb:748:14:748:20 | ** ... : Hash [element :c] | semmle.label | ** ... : Hash [element :c] | +| hash_flow.rb:748:16:748:20 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:748:16:748:20 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | | hash_flow.rb:748:29:748:39 | call to taint | semmle.label | call to taint | -| hash_flow.rb:748:42:748:48 | ** ... [element :d] | semmle.label | ** ... [element :d] | -| hash_flow.rb:748:42:748:48 | ** ... [element :f] | semmle.label | ** ... [element :f] | -| hash_flow.rb:748:44:748:48 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:748:44:748:48 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:749:10:749:13 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:748:42:748:48 | ** ... : Hash [element :d] | semmle.label | ** ... : Hash [element :d] | +| hash_flow.rb:748:42:748:48 | ** ... : Hash [element :f] | semmle.label | ** ... : Hash [element :f] | +| hash_flow.rb:748:44:748:48 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:748:44:748:48 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:749:10:749:13 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:749:10:749:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:751:10:751:13 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:751:10:751:13 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:751:10:751:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:752:10:752:13 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:752:10:752:13 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:752:10:752:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:754:10:754:13 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:754:10:754:13 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:754:10:754:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:755:10:755:13 | hash [element :g] | semmle.label | hash [element :g] | +| hash_flow.rb:755:10:755:13 | hash : Hash [element :g] | semmle.label | hash : Hash [element :g] | | hash_flow.rb:755:10:755:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:762:5:762:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:762:5:762:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:762:5:762:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:762:12:767:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:762:12:767:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | -| hash_flow.rb:762:12:767:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_flow.rb:762:5:762:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:762:5:762:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:762:5:762:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:762:12:767:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:762:12:767:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | +| hash_flow.rb:762:12:767:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | | hash_flow.rb:763:15:763:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:765:15:765:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:766:15:766:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:769:10:769:13 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:769:10:769:13 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:769:10:769:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:771:10:771:13 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:771:10:771:13 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:771:10:771:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:772:10:772:13 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:772:10:772:13 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:772:10:772:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:774:5:774:5 | x [element :c] | semmle.label | x [element :c] | -| hash_flow.rb:774:9:774:12 | [post] hash [element :c] | semmle.label | [post] hash [element :c] | -| hash_flow.rb:774:9:774:12 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:774:9:774:31 | call to except! [element :c] | semmle.label | call to except! [element :c] | -| hash_flow.rb:778:10:778:10 | x [element :c] | semmle.label | x [element :c] | +| hash_flow.rb:774:5:774:5 | x : Hash [element :c] | semmle.label | x : Hash [element :c] | +| hash_flow.rb:774:9:774:12 | [post] hash : Hash [element :c] | semmle.label | [post] hash : Hash [element :c] | +| hash_flow.rb:774:9:774:12 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:774:9:774:31 | call to except! : Hash [element :c] | semmle.label | call to except! : Hash [element :c] | +| hash_flow.rb:778:10:778:10 | x : Hash [element :c] | semmle.label | x : Hash [element :c] | | hash_flow.rb:778:10:778:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:783:10:783:13 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:783:10:783:13 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:783:10:783:17 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:790:5:790:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:790:5:790:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:790:13:794:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:790:13:794:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:790:5:790:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:790:5:790:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:790:13:794:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:790:13:794:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:791:15:791:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:793:15:793:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:795:5:795:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:795:5:795:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:795:13:799:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:795:13:799:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:795:5:795:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:795:5:795:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:795:13:799:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:795:13:799:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:796:15:796:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:798:15:798:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:800:5:800:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:800:5:800:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:800:5:800:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:800:5:800:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:800:12:800:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:800:12:800:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] | semmle.label | call to deep_merge [element :a] | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] | semmle.label | call to deep_merge [element :c] | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] | semmle.label | call to deep_merge [element :d] | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] | semmle.label | call to deep_merge [element :f] | -| hash_flow.rb:800:29:800:33 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:800:29:800:33 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:800:5:800:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:800:12:800:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :a] | semmle.label | call to deep_merge : Hash [element :a] | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :c] | semmle.label | call to deep_merge : Hash [element :c] | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :d] | semmle.label | call to deep_merge : Hash [element :d] | +| hash_flow.rb:800:12:804:7 | call to deep_merge : Hash [element :f] | semmle.label | call to deep_merge : Hash [element :f] | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:800:29:800:33 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:800:45:800:53 | old_value | semmle.label | old_value | | hash_flow.rb:800:56:800:64 | new_value | semmle.label | new_value | | hash_flow.rb:802:14:802:22 | old_value | semmle.label | old_value | | hash_flow.rb:803:14:803:22 | new_value | semmle.label | new_value | | hash_flow.rb:805:10:805:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:805:11:805:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:805:11:805:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:805:11:805:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:807:10:807:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:807:11:807:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:807:11:807:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:807:11:807:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:808:10:808:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:808:11:808:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:808:11:808:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:808:11:808:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:810:10:810:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:810:11:810:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:810:11:810:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:810:11:810:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:816:5:816:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:816:5:816:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:816:13:820:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:816:13:820:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:816:5:816:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:816:5:816:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:816:13:820:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:816:13:820:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:817:15:817:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:819:15:819:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:821:5:821:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:821:5:821:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:821:13:825:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:821:13:825:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:821:5:821:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:821:5:821:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:821:13:825:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:821:13:825:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:822:15:822:25 | call to taint | semmle.label | call to taint | | hash_flow.rb:824:15:824:25 | call to taint | semmle.label | call to taint | -| hash_flow.rb:826:5:826:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:826:5:826:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:826:5:826:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:826:5:826:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | -| hash_flow.rb:826:12:826:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | -| hash_flow.rb:826:12:826:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:826:12:826:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] | semmle.label | call to deep_merge! [element :a] | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] | semmle.label | call to deep_merge! [element :c] | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] | semmle.label | call to deep_merge! [element :d] | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] | semmle.label | call to deep_merge! [element :f] | -| hash_flow.rb:826:30:826:34 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:826:30:826:34 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:826:5:826:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :a] | semmle.label | [post] hash1 : Hash [element :a] | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :c] | semmle.label | [post] hash1 : Hash [element :c] | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :d] | semmle.label | [post] hash1 : Hash [element :d] | +| hash_flow.rb:826:12:826:16 | [post] hash1 : Hash [element :f] | semmle.label | [post] hash1 : Hash [element :f] | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:826:12:826:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :a] | semmle.label | call to deep_merge! : Hash [element :a] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :c] | semmle.label | call to deep_merge! : Hash [element :c] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :d] | semmle.label | call to deep_merge! : Hash [element :d] | +| hash_flow.rb:826:12:830:7 | call to deep_merge! : Hash [element :f] | semmle.label | call to deep_merge! : Hash [element :f] | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:826:30:826:34 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:826:46:826:54 | old_value | semmle.label | old_value | | hash_flow.rb:826:57:826:65 | new_value | semmle.label | new_value | | hash_flow.rb:828:14:828:22 | old_value | semmle.label | old_value | | hash_flow.rb:829:14:829:22 | new_value | semmle.label | new_value | | hash_flow.rb:831:10:831:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:831:11:831:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:831:11:831:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:831:11:831:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:833:10:833:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:833:11:833:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:833:11:833:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:833:11:833:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:834:10:834:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:834:11:834:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:834:11:834:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:834:11:834:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:836:10:836:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:836:11:836:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:836:11:836:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:836:11:836:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:838:10:838:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:838:11:838:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:838:11:838:15 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:838:11:838:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:840:10:840:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:840:11:840:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:840:11:840:15 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | | hash_flow.rb:840:11:840:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:841:10:841:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:841:11:841:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:841:11:841:15 | hash1 : Hash [element :d] | semmle.label | hash1 : Hash [element :d] | | hash_flow.rb:841:11:841:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:843:10:843:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:843:11:843:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:843:11:843:15 | hash1 : Hash [element :f] | semmle.label | hash1 : Hash [element :f] | | hash_flow.rb:843:11:843:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:849:5:849:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:849:5:849:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:849:13:853:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:849:13:853:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:849:5:849:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:849:5:849:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:849:13:853:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:849:13:853:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:850:12:850:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:852:12:852:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:854:5:854:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:854:5:854:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:854:13:858:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:854:13:858:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:854:5:854:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:854:5:854:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:854:13:858:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:854:13:858:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:855:12:855:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:857:12:857:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:860:5:860:9 | hash3 [element :a] | semmle.label | hash3 [element :a] | -| hash_flow.rb:860:5:860:9 | hash3 [element :c] | semmle.label | hash3 [element :c] | -| hash_flow.rb:860:5:860:9 | hash3 [element :d] | semmle.label | hash3 [element :d] | -| hash_flow.rb:860:5:860:9 | hash3 [element :f] | semmle.label | hash3 [element :f] | -| hash_flow.rb:860:13:860:17 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:860:13:860:17 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] | semmle.label | call to reverse_merge [element :a] | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] | semmle.label | call to reverse_merge [element :c] | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] | semmle.label | call to reverse_merge [element :d] | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] | semmle.label | call to reverse_merge [element :f] | -| hash_flow.rb:860:33:860:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:860:33:860:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :a] | semmle.label | hash3 : Hash [element :a] | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :c] | semmle.label | hash3 : Hash [element :c] | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :d] | semmle.label | hash3 : Hash [element :d] | +| hash_flow.rb:860:5:860:9 | hash3 : Hash [element :f] | semmle.label | hash3 : Hash [element :f] | +| hash_flow.rb:860:13:860:17 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:860:13:860:17 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :a] | semmle.label | call to reverse_merge : Hash [element :a] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :c] | semmle.label | call to reverse_merge : Hash [element :c] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :d] | semmle.label | call to reverse_merge : Hash [element :d] | +| hash_flow.rb:860:13:860:38 | call to reverse_merge : Hash [element :f] | semmle.label | call to reverse_merge : Hash [element :f] | +| hash_flow.rb:860:33:860:37 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:860:33:860:37 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:861:10:861:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:861:11:861:15 | hash3 [element :a] | semmle.label | hash3 [element :a] | +| hash_flow.rb:861:11:861:15 | hash3 : Hash [element :a] | semmle.label | hash3 : Hash [element :a] | | hash_flow.rb:861:11:861:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:863:10:863:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:863:11:863:15 | hash3 [element :c] | semmle.label | hash3 [element :c] | +| hash_flow.rb:863:11:863:15 | hash3 : Hash [element :c] | semmle.label | hash3 : Hash [element :c] | | hash_flow.rb:863:11:863:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:864:10:864:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:864:11:864:15 | hash3 [element :d] | semmle.label | hash3 [element :d] | +| hash_flow.rb:864:11:864:15 | hash3 : Hash [element :d] | semmle.label | hash3 : Hash [element :d] | | hash_flow.rb:864:11:864:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:866:10:866:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:866:11:866:15 | hash3 [element :f] | semmle.label | hash3 [element :f] | +| hash_flow.rb:866:11:866:15 | hash3 : Hash [element :f] | semmle.label | hash3 : Hash [element :f] | | hash_flow.rb:866:11:866:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:869:5:869:9 | hash4 [element :a] | semmle.label | hash4 [element :a] | -| hash_flow.rb:869:5:869:9 | hash4 [element :c] | semmle.label | hash4 [element :c] | -| hash_flow.rb:869:5:869:9 | hash4 [element :d] | semmle.label | hash4 [element :d] | -| hash_flow.rb:869:5:869:9 | hash4 [element :f] | semmle.label | hash4 [element :f] | -| hash_flow.rb:869:13:869:17 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:869:13:869:17 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] | semmle.label | call to with_defaults [element :a] | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] | semmle.label | call to with_defaults [element :c] | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] | semmle.label | call to with_defaults [element :d] | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] | semmle.label | call to with_defaults [element :f] | -| hash_flow.rb:869:33:869:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:869:33:869:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :a] | semmle.label | hash4 : Hash [element :a] | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :c] | semmle.label | hash4 : Hash [element :c] | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :d] | semmle.label | hash4 : Hash [element :d] | +| hash_flow.rb:869:5:869:9 | hash4 : Hash [element :f] | semmle.label | hash4 : Hash [element :f] | +| hash_flow.rb:869:13:869:17 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:869:13:869:17 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :a] | semmle.label | call to with_defaults : Hash [element :a] | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :c] | semmle.label | call to with_defaults : Hash [element :c] | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :d] | semmle.label | call to with_defaults : Hash [element :d] | +| hash_flow.rb:869:13:869:38 | call to with_defaults : Hash [element :f] | semmle.label | call to with_defaults : Hash [element :f] | +| hash_flow.rb:869:33:869:37 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:869:33:869:37 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:870:10:870:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:870:11:870:15 | hash4 [element :a] | semmle.label | hash4 [element :a] | +| hash_flow.rb:870:11:870:15 | hash4 : Hash [element :a] | semmle.label | hash4 : Hash [element :a] | | hash_flow.rb:870:11:870:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:872:10:872:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:872:11:872:15 | hash4 [element :c] | semmle.label | hash4 [element :c] | +| hash_flow.rb:872:11:872:15 | hash4 : Hash [element :c] | semmle.label | hash4 : Hash [element :c] | | hash_flow.rb:872:11:872:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:873:10:873:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:873:11:873:15 | hash4 [element :d] | semmle.label | hash4 [element :d] | +| hash_flow.rb:873:11:873:15 | hash4 : Hash [element :d] | semmle.label | hash4 : Hash [element :d] | | hash_flow.rb:873:11:873:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:875:10:875:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:875:11:875:15 | hash4 [element :f] | semmle.label | hash4 [element :f] | +| hash_flow.rb:875:11:875:15 | hash4 : Hash [element :f] | semmle.label | hash4 : Hash [element :f] | | hash_flow.rb:875:11:875:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:881:5:881:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:881:5:881:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:881:13:885:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:881:13:885:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:881:5:881:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:881:5:881:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:881:13:885:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:881:13:885:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:882:12:882:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:884:12:884:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:886:5:886:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:886:5:886:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:886:13:890:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:886:13:890:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:886:5:886:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:886:5:886:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:886:13:890:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:886:13:890:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:887:12:887:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:889:12:889:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:892:5:892:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:892:5:892:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:892:5:892:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:892:5:892:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | -| hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | -| hash_flow.rb:892:12:892:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:892:12:892:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] | semmle.label | call to reverse_merge! [element :a] | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] | semmle.label | call to reverse_merge! [element :c] | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] | semmle.label | call to reverse_merge! [element :d] | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] | semmle.label | call to reverse_merge! [element :f] | -| hash_flow.rb:892:33:892:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:892:33:892:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:892:5:892:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :a] | semmle.label | [post] hash1 : Hash [element :a] | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :c] | semmle.label | [post] hash1 : Hash [element :c] | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :d] | semmle.label | [post] hash1 : Hash [element :d] | +| hash_flow.rb:892:12:892:16 | [post] hash1 : Hash [element :f] | semmle.label | [post] hash1 : Hash [element :f] | +| hash_flow.rb:892:12:892:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:892:12:892:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :a] | semmle.label | call to reverse_merge! : Hash [element :a] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :c] | semmle.label | call to reverse_merge! : Hash [element :c] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :d] | semmle.label | call to reverse_merge! : Hash [element :d] | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! : Hash [element :f] | semmle.label | call to reverse_merge! : Hash [element :f] | +| hash_flow.rb:892:33:892:37 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:892:33:892:37 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:893:10:893:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:893:11:893:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:893:11:893:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:893:11:893:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:895:10:895:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:895:11:895:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:895:11:895:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:895:11:895:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:896:10:896:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:896:11:896:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:896:11:896:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:896:11:896:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:898:10:898:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:898:11:898:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:898:11:898:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:898:11:898:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:900:10:900:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:900:11:900:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:900:11:900:15 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:900:11:900:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:902:10:902:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:902:11:902:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:902:11:902:15 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | | hash_flow.rb:902:11:902:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:903:10:903:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:903:11:903:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:903:11:903:15 | hash1 : Hash [element :d] | semmle.label | hash1 : Hash [element :d] | | hash_flow.rb:903:11:903:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:905:10:905:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:905:11:905:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:905:11:905:15 | hash1 : Hash [element :f] | semmle.label | hash1 : Hash [element :f] | | hash_flow.rb:905:11:905:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:911:5:911:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:911:5:911:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:911:13:915:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:911:13:915:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:911:5:911:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:911:5:911:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:911:13:915:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:911:13:915:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:912:12:912:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:914:12:914:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:916:5:916:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:916:5:916:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:916:13:920:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:916:13:920:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:916:5:916:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:916:5:916:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:916:13:920:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:916:13:920:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:917:12:917:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:919:12:919:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:922:5:922:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:922:5:922:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:922:5:922:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:922:5:922:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | -| hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | -| hash_flow.rb:922:12:922:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:922:12:922:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] | semmle.label | call to with_defaults! [element :a] | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] | semmle.label | call to with_defaults! [element :c] | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] | semmle.label | call to with_defaults! [element :d] | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] | semmle.label | call to with_defaults! [element :f] | -| hash_flow.rb:922:33:922:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:922:33:922:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:922:5:922:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :a] | semmle.label | [post] hash1 : Hash [element :a] | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :c] | semmle.label | [post] hash1 : Hash [element :c] | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :d] | semmle.label | [post] hash1 : Hash [element :d] | +| hash_flow.rb:922:12:922:16 | [post] hash1 : Hash [element :f] | semmle.label | [post] hash1 : Hash [element :f] | +| hash_flow.rb:922:12:922:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:922:12:922:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :a] | semmle.label | call to with_defaults! : Hash [element :a] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :c] | semmle.label | call to with_defaults! : Hash [element :c] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :d] | semmle.label | call to with_defaults! : Hash [element :d] | +| hash_flow.rb:922:12:922:38 | call to with_defaults! : Hash [element :f] | semmle.label | call to with_defaults! : Hash [element :f] | +| hash_flow.rb:922:33:922:37 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:922:33:922:37 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:923:10:923:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:923:11:923:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:923:11:923:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:923:11:923:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:925:10:925:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:925:11:925:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:925:11:925:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:925:11:925:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:926:10:926:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:926:11:926:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:926:11:926:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:926:11:926:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:928:10:928:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:928:11:928:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:928:11:928:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:928:11:928:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:930:10:930:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:930:11:930:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:930:11:930:15 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:930:11:930:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:932:10:932:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:932:11:932:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:932:11:932:15 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | | hash_flow.rb:932:11:932:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:933:10:933:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:933:11:933:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:933:11:933:15 | hash1 : Hash [element :d] | semmle.label | hash1 : Hash [element :d] | | hash_flow.rb:933:11:933:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:935:10:935:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:935:11:935:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:935:11:935:15 | hash1 : Hash [element :f] | semmle.label | hash1 : Hash [element :f] | | hash_flow.rb:935:11:935:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:941:5:941:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:941:5:941:9 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:941:13:945:5 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_flow.rb:941:13:945:5 | call to [] [element :c] | semmle.label | call to [] [element :c] | +| hash_flow.rb:941:5:941:9 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:941:5:941:9 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:941:13:945:5 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_flow.rb:941:13:945:5 | call to [] : Hash [element :c] | semmle.label | call to [] : Hash [element :c] | | hash_flow.rb:942:12:942:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:944:12:944:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:946:5:946:9 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:946:5:946:9 | hash2 [element :f] | semmle.label | hash2 [element :f] | -| hash_flow.rb:946:13:950:5 | call to [] [element :d] | semmle.label | call to [] [element :d] | -| hash_flow.rb:946:13:950:5 | call to [] [element :f] | semmle.label | call to [] [element :f] | +| hash_flow.rb:946:5:946:9 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:946:5:946:9 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | +| hash_flow.rb:946:13:950:5 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | +| hash_flow.rb:946:13:950:5 | call to [] : Hash [element :f] | semmle.label | call to [] : Hash [element :f] | | hash_flow.rb:947:12:947:22 | call to taint | semmle.label | call to taint | | hash_flow.rb:949:12:949:22 | call to taint | semmle.label | call to taint | -| hash_flow.rb:952:5:952:8 | hash [element :a] | semmle.label | hash [element :a] | -| hash_flow.rb:952:5:952:8 | hash [element :c] | semmle.label | hash [element :c] | -| hash_flow.rb:952:5:952:8 | hash [element :d] | semmle.label | hash [element :d] | -| hash_flow.rb:952:5:952:8 | hash [element :f] | semmle.label | hash [element :f] | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] | semmle.label | [post] hash1 [element :a] | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] | semmle.label | [post] hash1 [element :c] | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] | semmle.label | [post] hash1 [element :d] | -| hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] | semmle.label | [post] hash1 [element :f] | -| hash_flow.rb:952:12:952:16 | hash1 [element :a] | semmle.label | hash1 [element :a] | -| hash_flow.rb:952:12:952:16 | hash1 [element :c] | semmle.label | hash1 [element :c] | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] | semmle.label | call to with_defaults! [element :a] | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] | semmle.label | call to with_defaults! [element :c] | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] | semmle.label | call to with_defaults! [element :d] | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] | semmle.label | call to with_defaults! [element :f] | -| hash_flow.rb:952:33:952:37 | hash2 [element :d] | semmle.label | hash2 [element :d] | -| hash_flow.rb:952:33:952:37 | hash2 [element :f] | semmle.label | hash2 [element :f] | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | +| hash_flow.rb:952:5:952:8 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :a] | semmle.label | [post] hash1 : Hash [element :a] | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :c] | semmle.label | [post] hash1 : Hash [element :c] | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :d] | semmle.label | [post] hash1 : Hash [element :d] | +| hash_flow.rb:952:12:952:16 | [post] hash1 : Hash [element :f] | semmle.label | [post] hash1 : Hash [element :f] | +| hash_flow.rb:952:12:952:16 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | +| hash_flow.rb:952:12:952:16 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :a] | semmle.label | call to with_defaults! : Hash [element :a] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :c] | semmle.label | call to with_defaults! : Hash [element :c] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :d] | semmle.label | call to with_defaults! : Hash [element :d] | +| hash_flow.rb:952:12:952:38 | call to with_defaults! : Hash [element :f] | semmle.label | call to with_defaults! : Hash [element :f] | +| hash_flow.rb:952:33:952:37 | hash2 : Hash [element :d] | semmle.label | hash2 : Hash [element :d] | +| hash_flow.rb:952:33:952:37 | hash2 : Hash [element :f] | semmle.label | hash2 : Hash [element :f] | | hash_flow.rb:953:10:953:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:953:11:953:14 | hash [element :a] | semmle.label | hash [element :a] | +| hash_flow.rb:953:11:953:14 | hash : Hash [element :a] | semmle.label | hash : Hash [element :a] | | hash_flow.rb:953:11:953:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:955:10:955:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:955:11:955:14 | hash [element :c] | semmle.label | hash [element :c] | +| hash_flow.rb:955:11:955:14 | hash : Hash [element :c] | semmle.label | hash : Hash [element :c] | | hash_flow.rb:955:11:955:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:956:10:956:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:956:11:956:14 | hash [element :d] | semmle.label | hash [element :d] | +| hash_flow.rb:956:11:956:14 | hash : Hash [element :d] | semmle.label | hash : Hash [element :d] | | hash_flow.rb:956:11:956:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:958:10:958:19 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:958:11:958:14 | hash [element :f] | semmle.label | hash [element :f] | +| hash_flow.rb:958:11:958:14 | hash : Hash [element :f] | semmle.label | hash : Hash [element :f] | | hash_flow.rb:958:11:958:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:960:10:960:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:960:11:960:15 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:960:11:960:15 | hash1 : Hash [element :a] | semmle.label | hash1 : Hash [element :a] | | hash_flow.rb:960:11:960:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:962:10:962:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:962:11:962:15 | hash1 [element :c] | semmle.label | hash1 [element :c] | +| hash_flow.rb:962:11:962:15 | hash1 : Hash [element :c] | semmle.label | hash1 : Hash [element :c] | | hash_flow.rb:962:11:962:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:963:10:963:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:963:11:963:15 | hash1 [element :d] | semmle.label | hash1 [element :d] | +| hash_flow.rb:963:11:963:15 | hash1 : Hash [element :d] | semmle.label | hash1 : Hash [element :d] | | hash_flow.rb:963:11:963:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:965:10:965:20 | ( ... ) | semmle.label | ( ... ) | -| hash_flow.rb:965:11:965:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | +| hash_flow.rb:965:11:965:15 | hash1 : Hash [element :f] | semmle.label | hash1 : Hash [element :f] | | hash_flow.rb:965:11:965:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:971:5:971:5 | h [element :b] | semmle.label | h [element :b] | -| hash_flow.rb:971:9:971:38 | ...[...] [element :b] | semmle.label | ...[...] [element :b] | +| hash_flow.rb:971:5:971:5 | h : Hash [element :b] | semmle.label | h : Hash [element :b] | +| hash_flow.rb:971:9:971:38 | ...[...] : Hash [element :b] | semmle.label | ...[...] : Hash [element :b] | | hash_flow.rb:971:23:971:31 | call to taint | semmle.label | call to taint | -| hash_flow.rb:973:10:973:10 | h [element :b] | semmle.label | h [element :b] | +| hash_flow.rb:973:10:973:10 | h : Hash [element :b] | semmle.label | h : Hash [element :b] | | hash_flow.rb:973:10:973:14 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:975:10:975:10 | h [element :b] | semmle.label | h [element :b] | +| hash_flow.rb:975:10:975:10 | h : Hash [element :b] | semmle.label | h : Hash [element :b] | | hash_flow.rb:975:10:975:13 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:994:9:994:10 | h2 [element :b] | semmle.label | h2 [element :b] | -| hash_flow.rb:994:14:994:47 | ...[...] [element :b] | semmle.label | ...[...] [element :b] | +| hash_flow.rb:994:9:994:10 | h2 : Hash [element :b] | semmle.label | h2 : Hash [element :b] | +| hash_flow.rb:994:14:994:47 | ...[...] : Hash [element :b] | semmle.label | ...[...] : Hash [element :b] | | hash_flow.rb:994:30:994:40 | call to taint | semmle.label | call to taint | -| hash_flow.rb:996:14:996:15 | h2 [element :b] | semmle.label | h2 [element :b] | +| hash_flow.rb:996:14:996:15 | h2 : Hash [element :b] | semmle.label | h2 : Hash [element :b] | | hash_flow.rb:996:14:996:19 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:998:14:998:15 | h2 [element :b] | semmle.label | h2 [element :b] | +| hash_flow.rb:998:14:998:15 | h2 : Hash [element :b] | semmle.label | h2 : Hash [element :b] | | hash_flow.rb:998:14:998:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:1011:5:1011:5 | h [element :a] | semmle.label | h [element :a] | -| hash_flow.rb:1011:9:1011:45 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_flow.rb:1011:5:1011:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_flow.rb:1011:9:1011:45 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_flow.rb:1011:14:1011:24 | call to taint | semmle.label | call to taint | -| hash_flow.rb:1012:5:1012:5 | h [element :a] | semmle.label | h [element :a] | +| hash_flow.rb:1012:5:1012:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | | hash_flow.rb:1012:15:1012:15 | k | semmle.label | k | | hash_flow.rb:1012:18:1012:18 | v | semmle.label | v | | hash_flow.rb:1013:14:1013:14 | v | semmle.label | v | diff --git a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected index f665080a329..93946da9c11 100644 --- a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected @@ -13,165 +13,167 @@ edges | params_flow.rb:23:16:23:23 | call to taint | params_flow.rb:16:18:16:19 | p2 | provenance | | | params_flow.rb:23:33:23:40 | call to taint | params_flow.rb:16:13:16:14 | p1 | provenance | | | params_flow.rb:25:12:25:13 | p1 | params_flow.rb:26:10:26:11 | p1 | provenance | | -| params_flow.rb:25:17:25:24 | **kwargs [element :p2] | params_flow.rb:28:11:28:16 | kwargs [element :p2] | provenance | | -| params_flow.rb:25:17:25:24 | **kwargs [element :p3] | params_flow.rb:29:11:29:16 | kwargs [element :p3] | provenance | | -| params_flow.rb:28:11:28:16 | kwargs [element :p2] | params_flow.rb:28:11:28:21 | ...[...] | provenance | | +| params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p2] | params_flow.rb:28:11:28:16 | kwargs : Hash [element :p2] | provenance | | +| params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p3] | params_flow.rb:29:11:29:16 | kwargs : Hash [element :p3] | provenance | | +| params_flow.rb:28:11:28:16 | kwargs : Hash [element :p2] | params_flow.rb:28:11:28:21 | ...[...] | provenance | | | params_flow.rb:28:11:28:21 | ...[...] | params_flow.rb:28:10:28:22 | ( ... ) | provenance | | -| params_flow.rb:29:11:29:16 | kwargs [element :p3] | params_flow.rb:29:11:29:21 | ...[...] | provenance | | +| params_flow.rb:29:11:29:16 | kwargs : Hash [element :p3] | params_flow.rb:29:11:29:21 | ...[...] | provenance | | | params_flow.rb:29:11:29:21 | ...[...] | params_flow.rb:29:10:29:22 | ( ... ) | provenance | | | params_flow.rb:33:12:33:19 | call to taint | params_flow.rb:25:12:25:13 | p1 | provenance | | -| params_flow.rb:33:26:33:34 | call to taint | params_flow.rb:25:17:25:24 | **kwargs [element :p2] | provenance | | -| params_flow.rb:33:41:33:49 | call to taint | params_flow.rb:25:17:25:24 | **kwargs [element :p3] | provenance | | -| params_flow.rb:34:1:34:4 | args [element :p3] | params_flow.rb:35:25:35:28 | args [element :p3] | provenance | | -| params_flow.rb:34:8:34:32 | call to [] [element :p3] | params_flow.rb:34:1:34:4 | args [element :p3] | provenance | | -| params_flow.rb:34:14:34:22 | call to taint | params_flow.rb:34:8:34:32 | call to [] [element :p3] | provenance | | +| params_flow.rb:33:26:33:34 | call to taint | params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p2] | provenance | | +| params_flow.rb:33:41:33:49 | call to taint | params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p3] | provenance | | +| params_flow.rb:34:1:34:4 | args : Hash [element :p3] | params_flow.rb:35:25:35:28 | args : Hash [element :p3] | provenance | | +| params_flow.rb:34:8:34:32 | call to [] : Hash [element :p3] | params_flow.rb:34:1:34:4 | args : Hash [element :p3] | provenance | | +| params_flow.rb:34:14:34:22 | call to taint | params_flow.rb:34:8:34:32 | call to [] : Hash [element :p3] | provenance | | | params_flow.rb:35:12:35:20 | call to taint | params_flow.rb:25:12:25:13 | p1 | provenance | | -| params_flow.rb:35:23:35:28 | ** ... [element :p3] | params_flow.rb:25:17:25:24 | **kwargs [element :p3] | provenance | | -| params_flow.rb:35:25:35:28 | args [element :p3] | params_flow.rb:35:23:35:28 | ** ... [element :p3] | provenance | | -| params_flow.rb:37:1:37:4 | args [element :p1] | params_flow.rb:38:10:38:13 | args [element :p1] | provenance | | -| params_flow.rb:37:1:37:4 | args [element :p2] | params_flow.rb:38:10:38:13 | args [element :p2] | provenance | | -| params_flow.rb:37:8:37:44 | call to [] [element :p1] | params_flow.rb:37:1:37:4 | args [element :p1] | provenance | | -| params_flow.rb:37:8:37:44 | call to [] [element :p2] | params_flow.rb:37:1:37:4 | args [element :p2] | provenance | | -| params_flow.rb:37:16:37:24 | call to taint | params_flow.rb:37:8:37:44 | call to [] [element :p1] | provenance | | -| params_flow.rb:37:34:37:42 | call to taint | params_flow.rb:37:8:37:44 | call to [] [element :p2] | provenance | | -| params_flow.rb:38:8:38:13 | ** ... [element :p1] | params_flow.rb:25:12:25:13 | p1 | provenance | | -| params_flow.rb:38:8:38:13 | ** ... [element :p2] | params_flow.rb:25:17:25:24 | **kwargs [element :p2] | provenance | | -| params_flow.rb:38:10:38:13 | args [element :p1] | params_flow.rb:38:8:38:13 | ** ... [element :p1] | provenance | | -| params_flow.rb:38:10:38:13 | args [element :p2] | params_flow.rb:38:8:38:13 | ** ... [element :p2] | provenance | | -| params_flow.rb:40:1:40:4 | args [element :p1] | params_flow.rb:41:26:41:29 | args [element :p1] | provenance | | -| params_flow.rb:40:8:40:26 | call to [] [element :p1] | params_flow.rb:40:1:40:4 | args [element :p1] | provenance | | -| params_flow.rb:40:16:40:24 | call to taint | params_flow.rb:40:8:40:26 | call to [] [element :p1] | provenance | | +| params_flow.rb:35:23:35:28 | ** ... : Hash [element :p3] | params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p3] | provenance | | +| params_flow.rb:35:25:35:28 | args : Hash [element :p3] | params_flow.rb:35:23:35:28 | ** ... : Hash [element :p3] | provenance | | +| params_flow.rb:37:1:37:4 | args : Hash [element :p1] | params_flow.rb:38:10:38:13 | args : Hash [element :p1] | provenance | | +| params_flow.rb:37:1:37:4 | args : Hash [element :p2] | params_flow.rb:38:10:38:13 | args : Hash [element :p2] | provenance | | +| params_flow.rb:37:8:37:44 | call to [] : Hash [element :p1] | params_flow.rb:37:1:37:4 | args : Hash [element :p1] | provenance | | +| params_flow.rb:37:8:37:44 | call to [] : Hash [element :p2] | params_flow.rb:37:1:37:4 | args : Hash [element :p2] | provenance | | +| params_flow.rb:37:16:37:24 | call to taint | params_flow.rb:37:8:37:44 | call to [] : Hash [element :p1] | provenance | | +| params_flow.rb:37:34:37:42 | call to taint | params_flow.rb:37:8:37:44 | call to [] : Hash [element :p2] | provenance | | +| params_flow.rb:38:8:38:13 | ** ... : Hash [element :p1] | params_flow.rb:25:12:25:13 | p1 | provenance | | +| params_flow.rb:38:8:38:13 | ** ... : Hash [element :p2] | params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p2] | provenance | | +| params_flow.rb:38:10:38:13 | args : Hash [element :p1] | params_flow.rb:38:8:38:13 | ** ... : Hash [element :p1] | provenance | | +| params_flow.rb:38:10:38:13 | args : Hash [element :p2] | params_flow.rb:38:8:38:13 | ** ... : Hash [element :p2] | provenance | | +| params_flow.rb:40:1:40:4 | args : Hash [element :p1] | params_flow.rb:41:26:41:29 | args : Hash [element :p1] | provenance | | +| params_flow.rb:40:8:40:26 | call to [] : Hash [element :p1] | params_flow.rb:40:1:40:4 | args : Hash [element :p1] | provenance | | +| params_flow.rb:40:16:40:24 | call to taint | params_flow.rb:40:8:40:26 | call to [] : Hash [element :p1] | provenance | | | params_flow.rb:41:13:41:21 | call to taint | params_flow.rb:16:18:16:19 | p2 | provenance | | -| params_flow.rb:41:24:41:29 | ** ... [element :p1] | params_flow.rb:16:13:16:14 | p1 | provenance | | -| params_flow.rb:41:26:41:29 | args [element :p1] | params_flow.rb:41:24:41:29 | ** ... [element :p1] | provenance | | -| params_flow.rb:43:1:43:4 | args [element 0] | params_flow.rb:44:24:44:27 | args [element 0] | provenance | | -| params_flow.rb:43:8:43:18 | call to [] [element 0] | params_flow.rb:43:1:43:4 | args [element 0] | provenance | | -| params_flow.rb:43:9:43:17 | call to taint | params_flow.rb:43:8:43:18 | call to [] [element 0] | provenance | | +| params_flow.rb:41:24:41:29 | ** ... : Hash [element :p1] | params_flow.rb:16:13:16:14 | p1 | provenance | | +| params_flow.rb:41:26:41:29 | args : Hash [element :p1] | params_flow.rb:41:24:41:29 | ** ... : Hash [element :p1] | provenance | | +| params_flow.rb:43:1:43:4 | args : Array [element 0] | params_flow.rb:44:24:44:27 | args : Array [element 0] | provenance | | +| params_flow.rb:43:8:43:18 | call to [] : Array [element 0] | params_flow.rb:43:1:43:4 | args : Array [element 0] | provenance | | +| params_flow.rb:43:9:43:17 | call to taint | params_flow.rb:43:8:43:18 | call to [] : Array [element 0] | provenance | | | params_flow.rb:44:12:44:20 | call to taint | params_flow.rb:9:16:9:17 | p1 | provenance | | -| params_flow.rb:44:23:44:27 | * ... [element 0] | params_flow.rb:9:20:9:21 | p2 | provenance | | -| params_flow.rb:44:24:44:27 | args [element 0] | params_flow.rb:44:23:44:27 | * ... [element 0] | provenance | | -| params_flow.rb:46:1:46:4 | args [element 0] | params_flow.rb:47:13:47:16 | args [element 0] | provenance | | -| params_flow.rb:46:1:46:4 | args [element 1] | params_flow.rb:47:13:47:16 | args [element 1] | provenance | | -| params_flow.rb:46:8:46:29 | call to [] [element 0] | params_flow.rb:46:1:46:4 | args [element 0] | provenance | | -| params_flow.rb:46:8:46:29 | call to [] [element 1] | params_flow.rb:46:1:46:4 | args [element 1] | provenance | | -| params_flow.rb:46:9:46:17 | call to taint | params_flow.rb:46:8:46:29 | call to [] [element 0] | provenance | | -| params_flow.rb:46:20:46:28 | call to taint | params_flow.rb:46:8:46:29 | call to [] [element 1] | provenance | | -| params_flow.rb:47:12:47:16 | * ... [element 0] | params_flow.rb:9:16:9:17 | p1 | provenance | | -| params_flow.rb:47:12:47:16 | * ... [element 1] | params_flow.rb:9:20:9:21 | p2 | provenance | | -| params_flow.rb:47:13:47:16 | args [element 0] | params_flow.rb:47:12:47:16 | * ... [element 0] | provenance | | -| params_flow.rb:47:13:47:16 | args [element 1] | params_flow.rb:47:12:47:16 | * ... [element 1] | provenance | | +| params_flow.rb:44:23:44:27 | * ... : Array [element 0] | params_flow.rb:9:20:9:21 | p2 | provenance | | +| params_flow.rb:44:24:44:27 | args : Array [element 0] | params_flow.rb:44:23:44:27 | * ... : Array [element 0] | provenance | | +| params_flow.rb:46:1:46:4 | args : Array [element 0] | params_flow.rb:47:13:47:16 | args : Array [element 0] | provenance | | +| params_flow.rb:46:1:46:4 | args : Array [element 1] | params_flow.rb:47:13:47:16 | args : Array [element 1] | provenance | | +| params_flow.rb:46:8:46:29 | call to [] : Array [element 0] | params_flow.rb:46:1:46:4 | args : Array [element 0] | provenance | | +| params_flow.rb:46:8:46:29 | call to [] : Array [element 1] | params_flow.rb:46:1:46:4 | args : Array [element 1] | provenance | | +| params_flow.rb:46:9:46:17 | call to taint | params_flow.rb:46:8:46:29 | call to [] : Array [element 0] | provenance | | +| params_flow.rb:46:20:46:28 | call to taint | params_flow.rb:46:8:46:29 | call to [] : Array [element 1] | provenance | | +| params_flow.rb:47:12:47:16 | * ... : Array [element 0] | params_flow.rb:9:16:9:17 | p1 | provenance | | +| params_flow.rb:47:12:47:16 | * ... : Array [element 1] | params_flow.rb:9:20:9:21 | p2 | provenance | | +| params_flow.rb:47:13:47:16 | args : Array [element 0] | params_flow.rb:47:12:47:16 | * ... : Array [element 0] | provenance | | +| params_flow.rb:47:13:47:16 | args : Array [element 1] | params_flow.rb:47:12:47:16 | * ... : Array [element 1] | provenance | | | params_flow.rb:49:13:49:14 | p1 | params_flow.rb:50:10:50:11 | p1 | provenance | | -| params_flow.rb:49:17:49:24 | *posargs [element 0] | params_flow.rb:51:11:51:17 | posargs [element 0] | provenance | | -| params_flow.rb:51:11:51:17 | posargs [element 0] | params_flow.rb:51:11:51:20 | ...[...] | provenance | | +| params_flow.rb:49:17:49:24 | *posargs : Array [element 0] | params_flow.rb:51:11:51:17 | posargs : Array [element 0] | provenance | | +| params_flow.rb:49:17:49:24 | *posargs : [collection] [element 0] | params_flow.rb:51:11:51:17 | posargs : [collection] [element 0] | provenance | | +| params_flow.rb:51:11:51:17 | posargs : Array [element 0] | params_flow.rb:51:11:51:20 | ...[...] | provenance | | +| params_flow.rb:51:11:51:17 | posargs : [collection] [element 0] | params_flow.rb:51:11:51:20 | ...[...] | provenance | | | params_flow.rb:51:11:51:20 | ...[...] | params_flow.rb:51:10:51:21 | ( ... ) | provenance | | | params_flow.rb:55:9:55:17 | call to taint | params_flow.rb:49:13:49:14 | p1 | provenance | | -| params_flow.rb:55:20:55:28 | call to taint | params_flow.rb:49:17:49:24 | *posargs [element 0] | provenance | | -| params_flow.rb:57:1:57:4 | args [element 0] | params_flow.rb:58:21:58:24 | args [element 0] | provenance | | -| params_flow.rb:57:8:57:18 | call to [] [element 0] | params_flow.rb:57:1:57:4 | args [element 0] | provenance | | -| params_flow.rb:57:9:57:17 | call to taint | params_flow.rb:57:8:57:18 | call to [] [element 0] | provenance | | +| params_flow.rb:55:20:55:28 | call to taint | params_flow.rb:49:17:49:24 | *posargs : [collection] [element 0] | provenance | | +| params_flow.rb:57:1:57:4 | args : Array [element 0] | params_flow.rb:58:21:58:24 | args : Array [element 0] | provenance | | +| params_flow.rb:57:8:57:18 | call to [] : Array [element 0] | params_flow.rb:57:1:57:4 | args : Array [element 0] | provenance | | +| params_flow.rb:57:9:57:17 | call to taint | params_flow.rb:57:8:57:18 | call to [] : Array [element 0] | provenance | | | params_flow.rb:58:9:58:17 | call to taint | params_flow.rb:49:13:49:14 | p1 | provenance | | -| params_flow.rb:58:20:58:24 | * ... [element 0] | params_flow.rb:49:17:49:24 | *posargs [element 0] | provenance | | -| params_flow.rb:58:21:58:24 | args [element 0] | params_flow.rb:58:20:58:24 | * ... [element 0] | provenance | | -| params_flow.rb:60:1:60:4 | args [element 0] | params_flow.rb:61:10:61:13 | args [element 0] | provenance | | -| params_flow.rb:60:1:60:4 | args [element 1] | params_flow.rb:61:10:61:13 | args [element 1] | provenance | | -| params_flow.rb:60:8:60:29 | call to [] [element 0] | params_flow.rb:60:1:60:4 | args [element 0] | provenance | | -| params_flow.rb:60:8:60:29 | call to [] [element 1] | params_flow.rb:60:1:60:4 | args [element 1] | provenance | | -| params_flow.rb:60:9:60:17 | call to taint | params_flow.rb:60:8:60:29 | call to [] [element 0] | provenance | | -| params_flow.rb:60:20:60:28 | call to taint | params_flow.rb:60:8:60:29 | call to [] [element 1] | provenance | | -| params_flow.rb:61:9:61:13 | * ... [element 0] | params_flow.rb:49:13:49:14 | p1 | provenance | | -| params_flow.rb:61:9:61:13 | * ... [element 1] | params_flow.rb:49:17:49:24 | *posargs [element 0] | provenance | | -| params_flow.rb:61:10:61:13 | args [element 0] | params_flow.rb:61:9:61:13 | * ... [element 0] | provenance | | -| params_flow.rb:61:10:61:13 | args [element 1] | params_flow.rb:61:9:61:13 | * ... [element 1] | provenance | | +| params_flow.rb:58:20:58:24 | * ... : Array [element 0] | params_flow.rb:49:17:49:24 | *posargs : Array [element 0] | provenance | | +| params_flow.rb:58:21:58:24 | args : Array [element 0] | params_flow.rb:58:20:58:24 | * ... : Array [element 0] | provenance | | +| params_flow.rb:60:1:60:4 | args : Array [element 0] | params_flow.rb:61:10:61:13 | args : Array [element 0] | provenance | | +| params_flow.rb:60:1:60:4 | args : Array [element 1] | params_flow.rb:61:10:61:13 | args : Array [element 1] | provenance | | +| params_flow.rb:60:8:60:29 | call to [] : Array [element 0] | params_flow.rb:60:1:60:4 | args : Array [element 0] | provenance | | +| params_flow.rb:60:8:60:29 | call to [] : Array [element 1] | params_flow.rb:60:1:60:4 | args : Array [element 1] | provenance | | +| params_flow.rb:60:9:60:17 | call to taint | params_flow.rb:60:8:60:29 | call to [] : Array [element 0] | provenance | | +| params_flow.rb:60:20:60:28 | call to taint | params_flow.rb:60:8:60:29 | call to [] : Array [element 1] | provenance | | +| params_flow.rb:61:9:61:13 | * ... : Array [element 0] | params_flow.rb:49:13:49:14 | p1 | provenance | | +| params_flow.rb:61:9:61:13 | * ... : Array [element 1] | params_flow.rb:49:17:49:24 | *posargs : [collection] [element 0] | provenance | | +| params_flow.rb:61:10:61:13 | args : Array [element 0] | params_flow.rb:61:9:61:13 | * ... : Array [element 0] | provenance | | +| params_flow.rb:61:10:61:13 | args : Array [element 1] | params_flow.rb:61:9:61:13 | * ... : Array [element 1] | provenance | | | params_flow.rb:63:1:63:4 | args | params_flow.rb:67:13:67:16 | args | provenance | | | params_flow.rb:63:8:63:16 | call to taint | params_flow.rb:63:1:63:4 | args | provenance | | -| params_flow.rb:64:16:64:17 | *x [element 0] | params_flow.rb:65:10:65:10 | x [element 0] | provenance | | -| params_flow.rb:65:10:65:10 | x [element 0] | params_flow.rb:65:10:65:13 | ...[...] | provenance | | -| params_flow.rb:67:12:67:16 | * ... [element 0] | params_flow.rb:64:16:64:17 | *x [element 0] | provenance | | -| params_flow.rb:67:13:67:16 | args | params_flow.rb:67:12:67:16 | * ... [element 0] | provenance | | +| params_flow.rb:64:16:64:17 | *x : [collection] [element 0] | params_flow.rb:65:10:65:10 | x : [collection] [element 0] | provenance | | +| params_flow.rb:65:10:65:10 | x : [collection] [element 0] | params_flow.rb:65:10:65:13 | ...[...] | provenance | | +| params_flow.rb:67:12:67:16 | * ... : [collection] [element 0] | params_flow.rb:64:16:64:17 | *x : [collection] [element 0] | provenance | | +| params_flow.rb:67:13:67:16 | args | params_flow.rb:67:12:67:16 | * ... : [collection] [element 0] | provenance | | | params_flow.rb:69:14:69:14 | x | params_flow.rb:70:10:70:10 | x | provenance | | | params_flow.rb:69:17:69:17 | y | params_flow.rb:71:10:71:10 | y | provenance | | | params_flow.rb:78:10:78:18 | call to taint | params_flow.rb:69:14:69:14 | x | provenance | | | params_flow.rb:78:21:78:29 | call to taint | params_flow.rb:69:17:69:17 | y | provenance | | -| params_flow.rb:80:1:80:4 | args [element 0] | params_flow.rb:81:22:81:25 | args [element 0] | provenance | | -| params_flow.rb:80:8:80:51 | call to [] [element 0] | params_flow.rb:80:1:80:4 | args [element 0] | provenance | | -| params_flow.rb:80:9:80:17 | call to taint | params_flow.rb:80:8:80:51 | call to [] [element 0] | provenance | | +| params_flow.rb:80:1:80:4 | args : Array [element 0] | params_flow.rb:81:22:81:25 | args : Array [element 0] | provenance | | +| params_flow.rb:80:8:80:51 | call to [] : Array [element 0] | params_flow.rb:80:1:80:4 | args : Array [element 0] | provenance | | +| params_flow.rb:80:9:80:17 | call to taint | params_flow.rb:80:8:80:51 | call to [] : Array [element 0] | provenance | | | params_flow.rb:81:10:81:18 | call to taint | params_flow.rb:69:14:69:14 | x | provenance | | -| params_flow.rb:81:21:81:25 | * ... [element 0] | params_flow.rb:69:17:69:17 | y | provenance | | -| params_flow.rb:81:22:81:25 | args [element 0] | params_flow.rb:81:21:81:25 | * ... [element 0] | provenance | | +| params_flow.rb:81:21:81:25 | * ... : Array [element 0] | params_flow.rb:69:17:69:17 | y | provenance | | +| params_flow.rb:81:22:81:25 | args : Array [element 0] | params_flow.rb:81:21:81:25 | * ... : Array [element 0] | provenance | | | params_flow.rb:83:14:83:14 | t | params_flow.rb:84:10:84:10 | t | provenance | | | params_flow.rb:83:17:83:17 | u | params_flow.rb:85:10:85:10 | u | provenance | | | params_flow.rb:83:20:83:20 | v | params_flow.rb:86:10:86:10 | v | provenance | | | params_flow.rb:83:23:83:23 | w | params_flow.rb:87:10:87:10 | w | provenance | | | params_flow.rb:83:26:83:26 | x | params_flow.rb:88:10:88:10 | x | provenance | | | params_flow.rb:83:29:83:29 | y | params_flow.rb:89:10:89:10 | y | provenance | | -| params_flow.rb:93:1:93:4 | args [element 0] | params_flow.rb:94:33:94:36 | args [element 0] | provenance | | -| params_flow.rb:93:1:93:4 | args [element 1] | params_flow.rb:94:33:94:36 | args [element 1] | provenance | | -| params_flow.rb:93:1:93:4 | args [element 2] | params_flow.rb:94:33:94:36 | args [element 2] | provenance | | -| params_flow.rb:93:1:93:4 | args [element 3] | params_flow.rb:94:33:94:36 | args [element 3] | provenance | | -| params_flow.rb:93:8:93:51 | call to [] [element 0] | params_flow.rb:93:1:93:4 | args [element 0] | provenance | | -| params_flow.rb:93:8:93:51 | call to [] [element 1] | params_flow.rb:93:1:93:4 | args [element 1] | provenance | | -| params_flow.rb:93:8:93:51 | call to [] [element 2] | params_flow.rb:93:1:93:4 | args [element 2] | provenance | | -| params_flow.rb:93:8:93:51 | call to [] [element 3] | params_flow.rb:93:1:93:4 | args [element 3] | provenance | | -| params_flow.rb:93:9:93:17 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 0] | provenance | | -| params_flow.rb:93:20:93:28 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 1] | provenance | | -| params_flow.rb:93:31:93:39 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 2] | provenance | | -| params_flow.rb:93:42:93:50 | call to taint | params_flow.rb:93:8:93:51 | call to [] [element 3] | provenance | | +| params_flow.rb:93:1:93:4 | args : Array [element 0] | params_flow.rb:94:33:94:36 | args : Array [element 0] | provenance | | +| params_flow.rb:93:1:93:4 | args : Array [element 1] | params_flow.rb:94:33:94:36 | args : Array [element 1] | provenance | | +| params_flow.rb:93:1:93:4 | args : Array [element 2] | params_flow.rb:94:33:94:36 | args : Array [element 2] | provenance | | +| params_flow.rb:93:1:93:4 | args : Array [element 3] | params_flow.rb:94:33:94:36 | args : Array [element 3] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 0] | params_flow.rb:93:1:93:4 | args : Array [element 0] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 1] | params_flow.rb:93:1:93:4 | args : Array [element 1] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 2] | params_flow.rb:93:1:93:4 | args : Array [element 2] | provenance | | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 3] | params_flow.rb:93:1:93:4 | args : Array [element 3] | provenance | | +| params_flow.rb:93:9:93:17 | call to taint | params_flow.rb:93:8:93:51 | call to [] : Array [element 0] | provenance | | +| params_flow.rb:93:20:93:28 | call to taint | params_flow.rb:93:8:93:51 | call to [] : Array [element 1] | provenance | | +| params_flow.rb:93:31:93:39 | call to taint | params_flow.rb:93:8:93:51 | call to [] : Array [element 2] | provenance | | +| params_flow.rb:93:42:93:50 | call to taint | params_flow.rb:93:8:93:51 | call to [] : Array [element 3] | provenance | | | params_flow.rb:94:10:94:18 | call to taint | params_flow.rb:83:14:83:14 | t | provenance | | | params_flow.rb:94:21:94:29 | call to taint | params_flow.rb:83:17:83:17 | u | provenance | | -| params_flow.rb:94:32:94:36 | * ... [element 0] | params_flow.rb:83:20:83:20 | v | provenance | | -| params_flow.rb:94:32:94:36 | * ... [element 1] | params_flow.rb:83:23:83:23 | w | provenance | | -| params_flow.rb:94:32:94:36 | * ... [element 2] | params_flow.rb:83:26:83:26 | x | provenance | | -| params_flow.rb:94:32:94:36 | * ... [element 3] | params_flow.rb:83:29:83:29 | y | provenance | | -| params_flow.rb:94:33:94:36 | args [element 0] | params_flow.rb:94:32:94:36 | * ... [element 0] | provenance | | -| params_flow.rb:94:33:94:36 | args [element 1] | params_flow.rb:94:32:94:36 | * ... [element 1] | provenance | | -| params_flow.rb:94:33:94:36 | args [element 2] | params_flow.rb:94:32:94:36 | * ... [element 2] | provenance | | -| params_flow.rb:94:33:94:36 | args [element 3] | params_flow.rb:94:32:94:36 | * ... [element 3] | provenance | | +| params_flow.rb:94:32:94:36 | * ... : Array [element 0] | params_flow.rb:83:20:83:20 | v | provenance | | +| params_flow.rb:94:32:94:36 | * ... : Array [element 1] | params_flow.rb:83:23:83:23 | w | provenance | | +| params_flow.rb:94:32:94:36 | * ... : Array [element 2] | params_flow.rb:83:26:83:26 | x | provenance | | +| params_flow.rb:94:32:94:36 | * ... : Array [element 3] | params_flow.rb:83:29:83:29 | y | provenance | | +| params_flow.rb:94:33:94:36 | args : Array [element 0] | params_flow.rb:94:32:94:36 | * ... : Array [element 0] | provenance | | +| params_flow.rb:94:33:94:36 | args : Array [element 1] | params_flow.rb:94:32:94:36 | * ... : Array [element 1] | provenance | | +| params_flow.rb:94:33:94:36 | args : Array [element 2] | params_flow.rb:94:32:94:36 | * ... : Array [element 2] | provenance | | +| params_flow.rb:94:33:94:36 | args : Array [element 3] | params_flow.rb:94:32:94:36 | * ... : Array [element 3] | provenance | | | params_flow.rb:96:10:96:18 | call to taint | params_flow.rb:69:14:69:14 | x | provenance | | | params_flow.rb:96:21:96:29 | call to taint | params_flow.rb:69:17:69:17 | y | provenance | | | params_flow.rb:98:19:98:19 | a | params_flow.rb:99:10:99:10 | a | provenance | | | params_flow.rb:105:15:105:23 | call to taint | params_flow.rb:98:19:98:19 | a | provenance | | | params_flow.rb:106:15:106:23 | call to taint | params_flow.rb:98:19:98:19 | a | provenance | | | params_flow.rb:108:37:108:37 | a | params_flow.rb:109:10:109:10 | a | provenance | | -| params_flow.rb:108:40:108:41 | *b [element 0] | params_flow.rb:110:10:110:10 | b [element 0] | provenance | | +| params_flow.rb:108:40:108:41 | *b : [collection] [element 0] | params_flow.rb:110:10:110:10 | b : [collection] [element 0] | provenance | | | params_flow.rb:108:44:108:44 | c | params_flow.rb:111:10:111:10 | c | provenance | | -| params_flow.rb:110:10:110:10 | b [element 0] | params_flow.rb:110:10:110:13 | ...[...] | provenance | | +| params_flow.rb:110:10:110:10 | b : [collection] [element 0] | params_flow.rb:110:10:110:13 | ...[...] | provenance | | | params_flow.rb:114:33:114:41 | call to taint | params_flow.rb:108:37:108:37 | a | provenance | | -| params_flow.rb:114:44:114:52 | call to taint | params_flow.rb:108:40:108:41 | *b [element 0] | provenance | | +| params_flow.rb:114:44:114:52 | call to taint | params_flow.rb:108:40:108:41 | *b : [collection] [element 0] | provenance | | | params_flow.rb:114:58:114:66 | call to taint | params_flow.rb:108:44:108:44 | c | provenance | | -| params_flow.rb:117:1:117:1 | [post] x [element] | params_flow.rb:118:13:118:13 | x [element] | provenance | | -| params_flow.rb:117:19:117:27 | call to taint | params_flow.rb:117:1:117:1 | [post] x [element] | provenance | | -| params_flow.rb:118:12:118:13 | * ... [element] | params_flow.rb:9:16:9:17 | p1 | provenance | | -| params_flow.rb:118:12:118:13 | * ... [element] | params_flow.rb:9:20:9:21 | p2 | provenance | | -| params_flow.rb:118:13:118:13 | x [element] | params_flow.rb:118:12:118:13 | * ... [element] | provenance | | -| params_flow.rb:130:1:130:4 | args [element 0] | params_flow.rb:131:11:131:14 | args [element 0] | provenance | | -| params_flow.rb:130:1:130:4 | args [element 1] | params_flow.rb:131:11:131:14 | args [element 1] | provenance | | -| params_flow.rb:130:8:130:29 | call to [] [element 0] | params_flow.rb:130:1:130:4 | args [element 0] | provenance | | -| params_flow.rb:130:8:130:29 | call to [] [element 1] | params_flow.rb:130:1:130:4 | args [element 1] | provenance | | -| params_flow.rb:130:9:130:17 | call to taint | params_flow.rb:130:8:130:29 | call to [] [element 0] | provenance | | -| params_flow.rb:130:20:130:28 | call to taint | params_flow.rb:130:8:130:29 | call to [] [element 1] | provenance | | -| params_flow.rb:131:10:131:14 | * ... [element 0] | params_flow.rb:83:14:83:14 | t | provenance | | -| params_flow.rb:131:10:131:14 | * ... [element 1] | params_flow.rb:83:17:83:17 | u | provenance | | -| params_flow.rb:131:11:131:14 | args [element 0] | params_flow.rb:131:10:131:14 | * ... [element 0] | provenance | | -| params_flow.rb:131:11:131:14 | args [element 1] | params_flow.rb:131:10:131:14 | * ... [element 1] | provenance | | -| params_flow.rb:133:14:133:18 | *args [element 1] | params_flow.rb:134:10:134:13 | args [element 1] | provenance | | -| params_flow.rb:134:10:134:13 | args [element 1] | params_flow.rb:134:10:134:16 | ...[...] | provenance | | -| params_flow.rb:137:10:137:43 | * ... [element 1] | params_flow.rb:133:14:133:18 | *args [element 1] | provenance | | -| params_flow.rb:137:11:137:43 | call to [] [element 1] | params_flow.rb:137:10:137:43 | * ... [element 1] | provenance | | -| params_flow.rb:137:23:137:31 | call to taint | params_flow.rb:137:11:137:43 | call to [] [element 1] | provenance | | +| params_flow.rb:117:1:117:1 | [post] x : [collection] [element] | params_flow.rb:118:13:118:13 | x : [collection] [element] | provenance | | +| params_flow.rb:117:19:117:27 | call to taint | params_flow.rb:117:1:117:1 | [post] x : [collection] [element] | provenance | | +| params_flow.rb:118:12:118:13 | * ... : [collection] [element] | params_flow.rb:9:16:9:17 | p1 | provenance | | +| params_flow.rb:118:12:118:13 | * ... : [collection] [element] | params_flow.rb:9:20:9:21 | p2 | provenance | | +| params_flow.rb:118:13:118:13 | x : [collection] [element] | params_flow.rb:118:12:118:13 | * ... : [collection] [element] | provenance | | +| params_flow.rb:130:1:130:4 | args : Array [element 0] | params_flow.rb:131:11:131:14 | args : Array [element 0] | provenance | | +| params_flow.rb:130:1:130:4 | args : Array [element 1] | params_flow.rb:131:11:131:14 | args : Array [element 1] | provenance | | +| params_flow.rb:130:8:130:29 | call to [] : Array [element 0] | params_flow.rb:130:1:130:4 | args : Array [element 0] | provenance | | +| params_flow.rb:130:8:130:29 | call to [] : Array [element 1] | params_flow.rb:130:1:130:4 | args : Array [element 1] | provenance | | +| params_flow.rb:130:9:130:17 | call to taint | params_flow.rb:130:8:130:29 | call to [] : Array [element 0] | provenance | | +| params_flow.rb:130:20:130:28 | call to taint | params_flow.rb:130:8:130:29 | call to [] : Array [element 1] | provenance | | +| params_flow.rb:131:10:131:14 | * ... : Array [element 0] | params_flow.rb:83:14:83:14 | t | provenance | | +| params_flow.rb:131:10:131:14 | * ... : Array [element 1] | params_flow.rb:83:17:83:17 | u | provenance | | +| params_flow.rb:131:11:131:14 | args : Array [element 0] | params_flow.rb:131:10:131:14 | * ... : Array [element 0] | provenance | | +| params_flow.rb:131:11:131:14 | args : Array [element 1] | params_flow.rb:131:10:131:14 | * ... : Array [element 1] | provenance | | +| params_flow.rb:133:14:133:18 | *args : Array [element 1] | params_flow.rb:134:10:134:13 | args : Array [element 1] | provenance | | +| params_flow.rb:134:10:134:13 | args : Array [element 1] | params_flow.rb:134:10:134:16 | ...[...] | provenance | | +| params_flow.rb:137:10:137:43 | * ... : Array [element 1] | params_flow.rb:133:14:133:18 | *args : Array [element 1] | provenance | | +| params_flow.rb:137:11:137:43 | call to [] : Array [element 1] | params_flow.rb:137:10:137:43 | * ... : Array [element 1] | provenance | | +| params_flow.rb:137:23:137:31 | call to taint | params_flow.rb:137:11:137:43 | call to [] : Array [element 1] | provenance | | | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:154:18:154:19 | p2 | provenance | | -| params_flow.rb:154:5:154:6 | [post] p1 [element 0] | params_flow.rb:153:23:153:24 | p1 [Return] [element 0] | provenance | | -| params_flow.rb:154:18:154:19 | p2 | params_flow.rb:154:5:154:6 | [post] p1 [element 0] | provenance | | -| params_flow.rb:164:23:164:24 | [post] p1 [element 0] | params_flow.rb:165:6:165:7 | p1 [element 0] | provenance | | +| params_flow.rb:154:5:154:6 | [post] p1 : [collection] [element 0] | params_flow.rb:153:23:153:24 | p1 [Return] : [collection] [element 0] | provenance | | +| params_flow.rb:154:18:154:19 | p2 | params_flow.rb:154:5:154:6 | [post] p1 : [collection] [element 0] | provenance | | +| params_flow.rb:164:23:164:24 | [post] p1 : [collection] [element 0] | params_flow.rb:165:6:165:7 | p1 : [collection] [element 0] | provenance | | | params_flow.rb:164:31:164:39 | call to taint | params_flow.rb:153:28:153:29 | p2 | provenance | | -| params_flow.rb:164:31:164:39 | call to taint | params_flow.rb:164:23:164:24 | [post] p1 [element 0] | provenance | | -| params_flow.rb:165:6:165:7 | p1 [element 0] | params_flow.rb:165:6:165:10 | ...[...] | provenance | | +| params_flow.rb:164:31:164:39 | call to taint | params_flow.rb:164:23:164:24 | [post] p1 : [collection] [element 0] | provenance | | +| params_flow.rb:165:6:165:7 | p1 : [collection] [element 0] | params_flow.rb:165:6:165:10 | ...[...] | provenance | | | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:182:18:182:19 | p2 | provenance | | -| params_flow.rb:182:5:182:6 | [post] p1 [element 0] | params_flow.rb:181:24:181:25 | p1 [Return] [element 0] | provenance | | -| params_flow.rb:182:18:182:19 | p2 | params_flow.rb:182:5:182:6 | [post] p1 [element 0] | provenance | | -| params_flow.rb:192:20:192:21 | [post] p1 [element 0] | params_flow.rb:193:6:193:7 | p1 [element 0] | provenance | | +| params_flow.rb:182:5:182:6 | [post] p1 : [collection] [element 0] | params_flow.rb:181:24:181:25 | p1 [Return] : [collection] [element 0] | provenance | | +| params_flow.rb:182:18:182:19 | p2 | params_flow.rb:182:5:182:6 | [post] p1 : [collection] [element 0] | provenance | | +| params_flow.rb:192:20:192:21 | [post] p1 : [collection] [element 0] | params_flow.rb:193:6:193:7 | p1 : [collection] [element 0] | provenance | | | params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:181:28:181:29 | p2 | provenance | | -| params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:192:20:192:21 | [post] p1 [element 0] | provenance | | -| params_flow.rb:193:6:193:7 | p1 [element 0] | params_flow.rb:193:6:193:10 | ...[...] | provenance | | +| params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:192:20:192:21 | [post] p1 : [collection] [element 0] | provenance | | +| params_flow.rb:193:6:193:7 | p1 : [collection] [element 0] | params_flow.rb:193:6:193:10 | ...[...] | provenance | | nodes | params_flow.rb:9:16:9:17 | p1 | semmle.label | p1 | | params_flow.rb:9:20:9:21 | p2 | semmle.label | p2 | @@ -190,86 +192,88 @@ nodes | params_flow.rb:23:16:23:23 | call to taint | semmle.label | call to taint | | params_flow.rb:23:33:23:40 | call to taint | semmle.label | call to taint | | params_flow.rb:25:12:25:13 | p1 | semmle.label | p1 | -| params_flow.rb:25:17:25:24 | **kwargs [element :p2] | semmle.label | **kwargs [element :p2] | -| params_flow.rb:25:17:25:24 | **kwargs [element :p3] | semmle.label | **kwargs [element :p3] | +| params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p2] | semmle.label | **kwargs : Hash [element :p2] | +| params_flow.rb:25:17:25:24 | **kwargs : Hash [element :p3] | semmle.label | **kwargs : Hash [element :p3] | | params_flow.rb:26:10:26:11 | p1 | semmle.label | p1 | | params_flow.rb:28:10:28:22 | ( ... ) | semmle.label | ( ... ) | -| params_flow.rb:28:11:28:16 | kwargs [element :p2] | semmle.label | kwargs [element :p2] | +| params_flow.rb:28:11:28:16 | kwargs : Hash [element :p2] | semmle.label | kwargs : Hash [element :p2] | | params_flow.rb:28:11:28:21 | ...[...] | semmle.label | ...[...] | | params_flow.rb:29:10:29:22 | ( ... ) | semmle.label | ( ... ) | -| params_flow.rb:29:11:29:16 | kwargs [element :p3] | semmle.label | kwargs [element :p3] | +| params_flow.rb:29:11:29:16 | kwargs : Hash [element :p3] | semmle.label | kwargs : Hash [element :p3] | | params_flow.rb:29:11:29:21 | ...[...] | semmle.label | ...[...] | | params_flow.rb:33:12:33:19 | call to taint | semmle.label | call to taint | | params_flow.rb:33:26:33:34 | call to taint | semmle.label | call to taint | | params_flow.rb:33:41:33:49 | call to taint | semmle.label | call to taint | -| params_flow.rb:34:1:34:4 | args [element :p3] | semmle.label | args [element :p3] | -| params_flow.rb:34:8:34:32 | call to [] [element :p3] | semmle.label | call to [] [element :p3] | +| params_flow.rb:34:1:34:4 | args : Hash [element :p3] | semmle.label | args : Hash [element :p3] | +| params_flow.rb:34:8:34:32 | call to [] : Hash [element :p3] | semmle.label | call to [] : Hash [element :p3] | | params_flow.rb:34:14:34:22 | call to taint | semmle.label | call to taint | | params_flow.rb:35:12:35:20 | call to taint | semmle.label | call to taint | -| params_flow.rb:35:23:35:28 | ** ... [element :p3] | semmle.label | ** ... [element :p3] | -| params_flow.rb:35:25:35:28 | args [element :p3] | semmle.label | args [element :p3] | -| params_flow.rb:37:1:37:4 | args [element :p1] | semmle.label | args [element :p1] | -| params_flow.rb:37:1:37:4 | args [element :p2] | semmle.label | args [element :p2] | -| params_flow.rb:37:8:37:44 | call to [] [element :p1] | semmle.label | call to [] [element :p1] | -| params_flow.rb:37:8:37:44 | call to [] [element :p2] | semmle.label | call to [] [element :p2] | +| params_flow.rb:35:23:35:28 | ** ... : Hash [element :p3] | semmle.label | ** ... : Hash [element :p3] | +| params_flow.rb:35:25:35:28 | args : Hash [element :p3] | semmle.label | args : Hash [element :p3] | +| params_flow.rb:37:1:37:4 | args : Hash [element :p1] | semmle.label | args : Hash [element :p1] | +| params_flow.rb:37:1:37:4 | args : Hash [element :p2] | semmle.label | args : Hash [element :p2] | +| params_flow.rb:37:8:37:44 | call to [] : Hash [element :p1] | semmle.label | call to [] : Hash [element :p1] | +| params_flow.rb:37:8:37:44 | call to [] : Hash [element :p2] | semmle.label | call to [] : Hash [element :p2] | | params_flow.rb:37:16:37:24 | call to taint | semmle.label | call to taint | | params_flow.rb:37:34:37:42 | call to taint | semmle.label | call to taint | -| params_flow.rb:38:8:38:13 | ** ... [element :p1] | semmle.label | ** ... [element :p1] | -| params_flow.rb:38:8:38:13 | ** ... [element :p2] | semmle.label | ** ... [element :p2] | -| params_flow.rb:38:10:38:13 | args [element :p1] | semmle.label | args [element :p1] | -| params_flow.rb:38:10:38:13 | args [element :p2] | semmle.label | args [element :p2] | -| params_flow.rb:40:1:40:4 | args [element :p1] | semmle.label | args [element :p1] | -| params_flow.rb:40:8:40:26 | call to [] [element :p1] | semmle.label | call to [] [element :p1] | +| params_flow.rb:38:8:38:13 | ** ... : Hash [element :p1] | semmle.label | ** ... : Hash [element :p1] | +| params_flow.rb:38:8:38:13 | ** ... : Hash [element :p2] | semmle.label | ** ... : Hash [element :p2] | +| params_flow.rb:38:10:38:13 | args : Hash [element :p1] | semmle.label | args : Hash [element :p1] | +| params_flow.rb:38:10:38:13 | args : Hash [element :p2] | semmle.label | args : Hash [element :p2] | +| params_flow.rb:40:1:40:4 | args : Hash [element :p1] | semmle.label | args : Hash [element :p1] | +| params_flow.rb:40:8:40:26 | call to [] : Hash [element :p1] | semmle.label | call to [] : Hash [element :p1] | | params_flow.rb:40:16:40:24 | call to taint | semmle.label | call to taint | | params_flow.rb:41:13:41:21 | call to taint | semmle.label | call to taint | -| params_flow.rb:41:24:41:29 | ** ... [element :p1] | semmle.label | ** ... [element :p1] | -| params_flow.rb:41:26:41:29 | args [element :p1] | semmle.label | args [element :p1] | -| params_flow.rb:43:1:43:4 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:43:8:43:18 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| params_flow.rb:41:24:41:29 | ** ... : Hash [element :p1] | semmle.label | ** ... : Hash [element :p1] | +| params_flow.rb:41:26:41:29 | args : Hash [element :p1] | semmle.label | args : Hash [element :p1] | +| params_flow.rb:43:1:43:4 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:43:8:43:18 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | params_flow.rb:43:9:43:17 | call to taint | semmle.label | call to taint | | params_flow.rb:44:12:44:20 | call to taint | semmle.label | call to taint | -| params_flow.rb:44:23:44:27 | * ... [element 0] | semmle.label | * ... [element 0] | -| params_flow.rb:44:24:44:27 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:46:1:46:4 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:46:1:46:4 | args [element 1] | semmle.label | args [element 1] | -| params_flow.rb:46:8:46:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| params_flow.rb:46:8:46:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| params_flow.rb:44:23:44:27 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| params_flow.rb:44:24:44:27 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:46:1:46:4 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:46:1:46:4 | args : Array [element 1] | semmle.label | args : Array [element 1] | +| params_flow.rb:46:8:46:29 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| params_flow.rb:46:8:46:29 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | params_flow.rb:46:9:46:17 | call to taint | semmle.label | call to taint | | params_flow.rb:46:20:46:28 | call to taint | semmle.label | call to taint | -| params_flow.rb:47:12:47:16 | * ... [element 0] | semmle.label | * ... [element 0] | -| params_flow.rb:47:12:47:16 | * ... [element 1] | semmle.label | * ... [element 1] | -| params_flow.rb:47:13:47:16 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:47:13:47:16 | args [element 1] | semmle.label | args [element 1] | +| params_flow.rb:47:12:47:16 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| params_flow.rb:47:12:47:16 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| params_flow.rb:47:13:47:16 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:47:13:47:16 | args : Array [element 1] | semmle.label | args : Array [element 1] | | params_flow.rb:49:13:49:14 | p1 | semmle.label | p1 | -| params_flow.rb:49:17:49:24 | *posargs [element 0] | semmle.label | *posargs [element 0] | +| params_flow.rb:49:17:49:24 | *posargs : Array [element 0] | semmle.label | *posargs : Array [element 0] | +| params_flow.rb:49:17:49:24 | *posargs : [collection] [element 0] | semmle.label | *posargs : [collection] [element 0] | | params_flow.rb:50:10:50:11 | p1 | semmle.label | p1 | | params_flow.rb:51:10:51:21 | ( ... ) | semmle.label | ( ... ) | -| params_flow.rb:51:11:51:17 | posargs [element 0] | semmle.label | posargs [element 0] | +| params_flow.rb:51:11:51:17 | posargs : Array [element 0] | semmle.label | posargs : Array [element 0] | +| params_flow.rb:51:11:51:17 | posargs : [collection] [element 0] | semmle.label | posargs : [collection] [element 0] | | params_flow.rb:51:11:51:20 | ...[...] | semmle.label | ...[...] | | params_flow.rb:55:9:55:17 | call to taint | semmle.label | call to taint | | params_flow.rb:55:20:55:28 | call to taint | semmle.label | call to taint | -| params_flow.rb:57:1:57:4 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:57:8:57:18 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| params_flow.rb:57:1:57:4 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:57:8:57:18 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | params_flow.rb:57:9:57:17 | call to taint | semmle.label | call to taint | | params_flow.rb:58:9:58:17 | call to taint | semmle.label | call to taint | -| params_flow.rb:58:20:58:24 | * ... [element 0] | semmle.label | * ... [element 0] | -| params_flow.rb:58:21:58:24 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:60:1:60:4 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:60:1:60:4 | args [element 1] | semmle.label | args [element 1] | -| params_flow.rb:60:8:60:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| params_flow.rb:60:8:60:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| params_flow.rb:58:20:58:24 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| params_flow.rb:58:21:58:24 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:60:1:60:4 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:60:1:60:4 | args : Array [element 1] | semmle.label | args : Array [element 1] | +| params_flow.rb:60:8:60:29 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| params_flow.rb:60:8:60:29 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | params_flow.rb:60:9:60:17 | call to taint | semmle.label | call to taint | | params_flow.rb:60:20:60:28 | call to taint | semmle.label | call to taint | -| params_flow.rb:61:9:61:13 | * ... [element 0] | semmle.label | * ... [element 0] | -| params_flow.rb:61:9:61:13 | * ... [element 1] | semmle.label | * ... [element 1] | -| params_flow.rb:61:10:61:13 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:61:10:61:13 | args [element 1] | semmle.label | args [element 1] | +| params_flow.rb:61:9:61:13 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| params_flow.rb:61:9:61:13 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| params_flow.rb:61:10:61:13 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:61:10:61:13 | args : Array [element 1] | semmle.label | args : Array [element 1] | | params_flow.rb:63:1:63:4 | args | semmle.label | args | | params_flow.rb:63:8:63:16 | call to taint | semmle.label | call to taint | -| params_flow.rb:64:16:64:17 | *x [element 0] | semmle.label | *x [element 0] | -| params_flow.rb:65:10:65:10 | x [element 0] | semmle.label | x [element 0] | +| params_flow.rb:64:16:64:17 | *x : [collection] [element 0] | semmle.label | *x : [collection] [element 0] | +| params_flow.rb:65:10:65:10 | x : [collection] [element 0] | semmle.label | x : [collection] [element 0] | | params_flow.rb:65:10:65:13 | ...[...] | semmle.label | ...[...] | -| params_flow.rb:67:12:67:16 | * ... [element 0] | semmle.label | * ... [element 0] | +| params_flow.rb:67:12:67:16 | * ... : [collection] [element 0] | semmle.label | * ... : [collection] [element 0] | | params_flow.rb:67:13:67:16 | args | semmle.label | args | | params_flow.rb:69:14:69:14 | x | semmle.label | x | | params_flow.rb:69:17:69:17 | y | semmle.label | y | @@ -277,12 +281,12 @@ nodes | params_flow.rb:71:10:71:10 | y | semmle.label | y | | params_flow.rb:78:10:78:18 | call to taint | semmle.label | call to taint | | params_flow.rb:78:21:78:29 | call to taint | semmle.label | call to taint | -| params_flow.rb:80:1:80:4 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:80:8:80:51 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| params_flow.rb:80:1:80:4 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:80:8:80:51 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | params_flow.rb:80:9:80:17 | call to taint | semmle.label | call to taint | | params_flow.rb:81:10:81:18 | call to taint | semmle.label | call to taint | -| params_flow.rb:81:21:81:25 | * ... [element 0] | semmle.label | * ... [element 0] | -| params_flow.rb:81:22:81:25 | args [element 0] | semmle.label | args [element 0] | +| params_flow.rb:81:21:81:25 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| params_flow.rb:81:22:81:25 | args : Array [element 0] | semmle.label | args : Array [element 0] | | params_flow.rb:83:14:83:14 | t | semmle.label | t | | params_flow.rb:83:17:83:17 | u | semmle.label | u | | params_flow.rb:83:20:83:20 | v | semmle.label | v | @@ -295,28 +299,28 @@ nodes | params_flow.rb:87:10:87:10 | w | semmle.label | w | | params_flow.rb:88:10:88:10 | x | semmle.label | x | | params_flow.rb:89:10:89:10 | y | semmle.label | y | -| params_flow.rb:93:1:93:4 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:93:1:93:4 | args [element 1] | semmle.label | args [element 1] | -| params_flow.rb:93:1:93:4 | args [element 2] | semmle.label | args [element 2] | -| params_flow.rb:93:1:93:4 | args [element 3] | semmle.label | args [element 3] | -| params_flow.rb:93:8:93:51 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| params_flow.rb:93:8:93:51 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| params_flow.rb:93:8:93:51 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| params_flow.rb:93:8:93:51 | call to [] [element 3] | semmle.label | call to [] [element 3] | +| params_flow.rb:93:1:93:4 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:93:1:93:4 | args : Array [element 1] | semmle.label | args : Array [element 1] | +| params_flow.rb:93:1:93:4 | args : Array [element 2] | semmle.label | args : Array [element 2] | +| params_flow.rb:93:1:93:4 | args : Array [element 3] | semmle.label | args : Array [element 3] | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| params_flow.rb:93:8:93:51 | call to [] : Array [element 3] | semmle.label | call to [] : Array [element 3] | | params_flow.rb:93:9:93:17 | call to taint | semmle.label | call to taint | | params_flow.rb:93:20:93:28 | call to taint | semmle.label | call to taint | | params_flow.rb:93:31:93:39 | call to taint | semmle.label | call to taint | | params_flow.rb:93:42:93:50 | call to taint | semmle.label | call to taint | | params_flow.rb:94:10:94:18 | call to taint | semmle.label | call to taint | | params_flow.rb:94:21:94:29 | call to taint | semmle.label | call to taint | -| params_flow.rb:94:32:94:36 | * ... [element 0] | semmle.label | * ... [element 0] | -| params_flow.rb:94:32:94:36 | * ... [element 1] | semmle.label | * ... [element 1] | -| params_flow.rb:94:32:94:36 | * ... [element 2] | semmle.label | * ... [element 2] | -| params_flow.rb:94:32:94:36 | * ... [element 3] | semmle.label | * ... [element 3] | -| params_flow.rb:94:33:94:36 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:94:33:94:36 | args [element 1] | semmle.label | args [element 1] | -| params_flow.rb:94:33:94:36 | args [element 2] | semmle.label | args [element 2] | -| params_flow.rb:94:33:94:36 | args [element 3] | semmle.label | args [element 3] | +| params_flow.rb:94:32:94:36 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| params_flow.rb:94:32:94:36 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| params_flow.rb:94:32:94:36 | * ... : Array [element 2] | semmle.label | * ... : Array [element 2] | +| params_flow.rb:94:32:94:36 | * ... : Array [element 3] | semmle.label | * ... : Array [element 3] | +| params_flow.rb:94:33:94:36 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:94:33:94:36 | args : Array [element 1] | semmle.label | args : Array [element 1] | +| params_flow.rb:94:33:94:36 | args : Array [element 2] | semmle.label | args : Array [element 2] | +| params_flow.rb:94:33:94:36 | args : Array [element 3] | semmle.label | args : Array [element 3] | | params_flow.rb:96:10:96:18 | call to taint | semmle.label | call to taint | | params_flow.rb:96:21:96:29 | call to taint | semmle.label | call to taint | | params_flow.rb:98:19:98:19 | a | semmle.label | a | @@ -324,54 +328,54 @@ nodes | params_flow.rb:105:15:105:23 | call to taint | semmle.label | call to taint | | params_flow.rb:106:15:106:23 | call to taint | semmle.label | call to taint | | params_flow.rb:108:37:108:37 | a | semmle.label | a | -| params_flow.rb:108:40:108:41 | *b [element 0] | semmle.label | *b [element 0] | +| params_flow.rb:108:40:108:41 | *b : [collection] [element 0] | semmle.label | *b : [collection] [element 0] | | params_flow.rb:108:44:108:44 | c | semmle.label | c | | params_flow.rb:109:10:109:10 | a | semmle.label | a | -| params_flow.rb:110:10:110:10 | b [element 0] | semmle.label | b [element 0] | +| params_flow.rb:110:10:110:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | | params_flow.rb:110:10:110:13 | ...[...] | semmle.label | ...[...] | | params_flow.rb:111:10:111:10 | c | semmle.label | c | | params_flow.rb:114:33:114:41 | call to taint | semmle.label | call to taint | | params_flow.rb:114:44:114:52 | call to taint | semmle.label | call to taint | | params_flow.rb:114:58:114:66 | call to taint | semmle.label | call to taint | -| params_flow.rb:117:1:117:1 | [post] x [element] | semmle.label | [post] x [element] | +| params_flow.rb:117:1:117:1 | [post] x : [collection] [element] | semmle.label | [post] x : [collection] [element] | | params_flow.rb:117:19:117:27 | call to taint | semmle.label | call to taint | -| params_flow.rb:118:12:118:13 | * ... [element] | semmle.label | * ... [element] | -| params_flow.rb:118:13:118:13 | x [element] | semmle.label | x [element] | -| params_flow.rb:130:1:130:4 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:130:1:130:4 | args [element 1] | semmle.label | args [element 1] | -| params_flow.rb:130:8:130:29 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| params_flow.rb:130:8:130:29 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| params_flow.rb:118:12:118:13 | * ... : [collection] [element] | semmle.label | * ... : [collection] [element] | +| params_flow.rb:118:13:118:13 | x : [collection] [element] | semmle.label | x : [collection] [element] | +| params_flow.rb:130:1:130:4 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:130:1:130:4 | args : Array [element 1] | semmle.label | args : Array [element 1] | +| params_flow.rb:130:8:130:29 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| params_flow.rb:130:8:130:29 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | params_flow.rb:130:9:130:17 | call to taint | semmle.label | call to taint | | params_flow.rb:130:20:130:28 | call to taint | semmle.label | call to taint | -| params_flow.rb:131:10:131:14 | * ... [element 0] | semmle.label | * ... [element 0] | -| params_flow.rb:131:10:131:14 | * ... [element 1] | semmle.label | * ... [element 1] | -| params_flow.rb:131:11:131:14 | args [element 0] | semmle.label | args [element 0] | -| params_flow.rb:131:11:131:14 | args [element 1] | semmle.label | args [element 1] | -| params_flow.rb:133:14:133:18 | *args [element 1] | semmle.label | *args [element 1] | -| params_flow.rb:134:10:134:13 | args [element 1] | semmle.label | args [element 1] | +| params_flow.rb:131:10:131:14 | * ... : Array [element 0] | semmle.label | * ... : Array [element 0] | +| params_flow.rb:131:10:131:14 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| params_flow.rb:131:11:131:14 | args : Array [element 0] | semmle.label | args : Array [element 0] | +| params_flow.rb:131:11:131:14 | args : Array [element 1] | semmle.label | args : Array [element 1] | +| params_flow.rb:133:14:133:18 | *args : Array [element 1] | semmle.label | *args : Array [element 1] | +| params_flow.rb:134:10:134:13 | args : Array [element 1] | semmle.label | args : Array [element 1] | | params_flow.rb:134:10:134:16 | ...[...] | semmle.label | ...[...] | -| params_flow.rb:137:10:137:43 | * ... [element 1] | semmle.label | * ... [element 1] | -| params_flow.rb:137:11:137:43 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| params_flow.rb:137:10:137:43 | * ... : Array [element 1] | semmle.label | * ... : Array [element 1] | +| params_flow.rb:137:11:137:43 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | params_flow.rb:137:23:137:31 | call to taint | semmle.label | call to taint | -| params_flow.rb:153:23:153:24 | p1 [Return] [element 0] | semmle.label | p1 [Return] [element 0] | +| params_flow.rb:153:23:153:24 | p1 [Return] : [collection] [element 0] | semmle.label | p1 [Return] : [collection] [element 0] | | params_flow.rb:153:28:153:29 | p2 | semmle.label | p2 | -| params_flow.rb:154:5:154:6 | [post] p1 [element 0] | semmle.label | [post] p1 [element 0] | +| params_flow.rb:154:5:154:6 | [post] p1 : [collection] [element 0] | semmle.label | [post] p1 : [collection] [element 0] | | params_flow.rb:154:18:154:19 | p2 | semmle.label | p2 | -| params_flow.rb:164:23:164:24 | [post] p1 [element 0] | semmle.label | [post] p1 [element 0] | +| params_flow.rb:164:23:164:24 | [post] p1 : [collection] [element 0] | semmle.label | [post] p1 : [collection] [element 0] | | params_flow.rb:164:31:164:39 | call to taint | semmle.label | call to taint | -| params_flow.rb:165:6:165:7 | p1 [element 0] | semmle.label | p1 [element 0] | +| params_flow.rb:165:6:165:7 | p1 : [collection] [element 0] | semmle.label | p1 : [collection] [element 0] | | params_flow.rb:165:6:165:10 | ...[...] | semmle.label | ...[...] | -| params_flow.rb:181:24:181:25 | p1 [Return] [element 0] | semmle.label | p1 [Return] [element 0] | +| params_flow.rb:181:24:181:25 | p1 [Return] : [collection] [element 0] | semmle.label | p1 [Return] : [collection] [element 0] | | params_flow.rb:181:28:181:29 | p2 | semmle.label | p2 | -| params_flow.rb:182:5:182:6 | [post] p1 [element 0] | semmle.label | [post] p1 [element 0] | +| params_flow.rb:182:5:182:6 | [post] p1 : [collection] [element 0] | semmle.label | [post] p1 : [collection] [element 0] | | params_flow.rb:182:18:182:19 | p2 | semmle.label | p2 | -| params_flow.rb:192:20:192:21 | [post] p1 [element 0] | semmle.label | [post] p1 [element 0] | +| params_flow.rb:192:20:192:21 | [post] p1 : [collection] [element 0] | semmle.label | [post] p1 : [collection] [element 0] | | params_flow.rb:192:24:192:32 | call to taint | semmle.label | call to taint | -| params_flow.rb:193:6:193:7 | p1 [element 0] | semmle.label | p1 [element 0] | +| params_flow.rb:193:6:193:7 | p1 : [collection] [element 0] | semmle.label | p1 : [collection] [element 0] | | params_flow.rb:193:6:193:10 | ...[...] | semmle.label | ...[...] | subpaths -| params_flow.rb:164:31:164:39 | call to taint | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:153:23:153:24 | p1 [Return] [element 0] | params_flow.rb:164:23:164:24 | [post] p1 [element 0] | -| params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:181:24:181:25 | p1 [Return] [element 0] | params_flow.rb:192:20:192:21 | [post] p1 [element 0] | +| params_flow.rb:164:31:164:39 | call to taint | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:153:23:153:24 | p1 [Return] : [collection] [element 0] | params_flow.rb:164:23:164:24 | [post] p1 : [collection] [element 0] | +| params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:181:24:181:25 | p1 [Return] : [collection] [element 0] | params_flow.rb:192:20:192:21 | [post] p1 : [collection] [element 0] | testFailures #select | params_flow.rb:10:10:10:11 | p1 | params_flow.rb:14:12:14:19 | call to taint | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:14:12:14:19 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected index fdf190f58dd..507b8a983ef 100644 --- a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected @@ -1,12 +1,12 @@ models edges -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | ssa_flow.rb:16:10:16:10 | a [element 0] | provenance | | -| ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:12:9:12:9 | [post] a [element 0] | provenance | | -| ssa_flow.rb:16:10:16:10 | a [element 0] | ssa_flow.rb:16:10:16:13 | ...[...] | provenance | | +| ssa_flow.rb:12:9:12:9 | [post] a : [collection] [element 0] | ssa_flow.rb:16:10:16:10 | a : [collection] [element 0] | provenance | | +| ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:12:9:12:9 | [post] a : [collection] [element 0] | provenance | | +| ssa_flow.rb:16:10:16:10 | a : [collection] [element 0] | ssa_flow.rb:16:10:16:13 | ...[...] | provenance | | nodes -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | +| ssa_flow.rb:12:9:12:9 | [post] a : [collection] [element 0] | semmle.label | [post] a : [collection] [element 0] | | ssa_flow.rb:12:16:12:23 | call to taint | semmle.label | call to taint | -| ssa_flow.rb:16:10:16:10 | a [element 0] | semmle.label | a [element 0] | +| ssa_flow.rb:16:10:16:10 | a : [collection] [element 0] | semmle.label | a : [collection] [element 0] | | ssa_flow.rb:16:10:16:13 | ...[...] | semmle.label | ...[...] | subpaths testFailures diff --git a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected index ce89d3f549f..85286410c47 100644 --- a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected +++ b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected @@ -83,8 +83,8 @@ edges | summaries.rb:1:11:1:36 | call to identity | summaries.rb:155:28:155:34 | tainted | provenance | Sink:MaD:6 | | summaries.rb:1:11:1:36 | call to identity | summaries.rb:156:27:156:33 | tainted | provenance | Sink:MaD:6 | | summaries.rb:1:11:1:36 | call to identity | summaries.rb:156:27:156:33 | tainted | provenance | Sink:MaD:6 | -| summaries.rb:1:11:1:36 | call to identity | summaries.rb:157:14:160:3 | do ... end [captured tainted] | provenance | | -| summaries.rb:1:11:1:36 | call to identity | summaries.rb:157:14:160:3 | do ... end [captured tainted] | provenance | | +| summaries.rb:1:11:1:36 | call to identity | summaries.rb:157:14:160:3 | do ... end : [lambda] [captured tainted] | provenance | | +| summaries.rb:1:11:1:36 | call to identity | summaries.rb:157:14:160:3 | do ... end : [lambda] [captured tainted] | provenance | | | summaries.rb:1:20:1:36 | call to source | summaries.rb:1:11:1:36 | call to identity | provenance | | | summaries.rb:1:20:1:36 | call to source | summaries.rb:1:11:1:36 | call to identity | provenance | | | summaries.rb:4:1:4:8 | tainted2 | summaries.rb:9:6:9:13 | tainted2 | provenance | | @@ -128,11 +128,11 @@ edges | summaries.rb:44:8:44:8 | t | summaries.rb:44:8:44:27 | call to matchedByNameRcv | provenance | MaD:23 | | summaries.rb:48:24:48:41 | call to source | summaries.rb:48:8:48:42 | call to preserveTaint | provenance | MaD:11 | | summaries.rb:51:24:51:30 | tainted | summaries.rb:51:6:51:31 | call to namedArg | provenance | MaD:14 | -| summaries.rb:53:1:53:4 | args [element :foo] | summaries.rb:54:21:54:24 | args [element :foo] | provenance | | -| summaries.rb:53:8:53:33 | call to [] [element :foo] | summaries.rb:53:1:53:4 | args [element :foo] | provenance | | -| summaries.rb:53:15:53:31 | call to source | summaries.rb:53:8:53:33 | call to [] [element :foo] | provenance | | -| summaries.rb:54:19:54:24 | ** ... [element :foo] | summaries.rb:54:6:54:25 | call to namedArg | provenance | MaD:14 | -| summaries.rb:54:21:54:24 | args [element :foo] | summaries.rb:54:19:54:24 | ** ... [element :foo] | provenance | | +| summaries.rb:53:1:53:4 | args : Hash [element :foo] | summaries.rb:54:21:54:24 | args : Hash [element :foo] | provenance | | +| summaries.rb:53:8:53:33 | call to [] : Hash [element :foo] | summaries.rb:53:1:53:4 | args : Hash [element :foo] | provenance | | +| summaries.rb:53:15:53:31 | call to source | summaries.rb:53:8:53:33 | call to [] : Hash [element :foo] | provenance | | +| summaries.rb:54:19:54:24 | ** ... : Hash [element :foo] | summaries.rb:54:6:54:25 | call to namedArg | provenance | MaD:14 | +| summaries.rb:54:21:54:24 | args : Hash [element :foo] | summaries.rb:54:19:54:24 | ** ... : Hash [element :foo] | provenance | | | summaries.rb:56:22:56:28 | tainted | summaries.rb:56:6:56:29 | call to anyArg | provenance | MaD:8 | | summaries.rb:57:17:57:23 | tainted | summaries.rb:57:6:57:24 | call to anyArg | provenance | MaD:8 | | summaries.rb:59:27:59:33 | tainted | summaries.rb:59:6:59:34 | call to anyNamedArg | provenance | MaD:9 | @@ -141,128 +141,128 @@ edges | summaries.rb:65:40:65:40 | x | summaries.rb:66:8:66:8 | x | provenance | | | summaries.rb:73:24:73:53 | call to source | summaries.rb:73:8:73:54 | call to preserveTaint | provenance | MaD:18 | | summaries.rb:76:26:76:56 | call to source | summaries.rb:76:8:76:57 | call to preserveTaint | provenance | MaD:19 | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:82:6:82:6 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:82:6:82:6 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:83:6:83:6 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:83:6:83:6 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:85:6:85:6 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:85:6:85:6 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:87:5:87:5 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:87:5:87:5 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:91:5:91:5 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 1] | summaries.rb:91:5:91:5 | a [element 1] | provenance | | -| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:86:6:86:6 | a [element 2] | provenance | | -| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:86:6:86:6 | a [element 2] | provenance | | -| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:95:1:95:1 | a [element 2] | provenance | | -| summaries.rb:79:1:79:1 | a [element 2] | summaries.rb:95:1:95:1 | a [element 2] | provenance | | -| summaries.rb:79:5:79:47 | call to [] [element 1] | summaries.rb:79:1:79:1 | a [element 1] | provenance | | -| summaries.rb:79:5:79:47 | call to [] [element 1] | summaries.rb:79:1:79:1 | a [element 1] | provenance | | -| summaries.rb:79:5:79:47 | call to [] [element 2] | summaries.rb:79:1:79:1 | a [element 2] | provenance | | -| summaries.rb:79:5:79:47 | call to [] [element 2] | summaries.rb:79:1:79:1 | a [element 2] | provenance | | -| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:5:79:47 | call to [] [element 1] | provenance | | -| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:5:79:47 | call to [] [element 1] | provenance | | -| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:5:79:47 | call to [] [element 2] | provenance | | -| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:5:79:47 | call to [] [element 2] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:82:6:82:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:82:6:82:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:84:6:84:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:84:6:84:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:85:6:85:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:85:6:85:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:86:6:86:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:86:6:86:6 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:87:5:87:5 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:87:5:87:5 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:95:1:95:1 | a [element] | provenance | | -| summaries.rb:81:1:81:1 | [post] a [element] | summaries.rb:95:1:95:1 | a [element] | provenance | | -| summaries.rb:81:13:81:27 | call to source | summaries.rb:81:1:81:1 | [post] a [element] | provenance | | -| summaries.rb:81:13:81:27 | call to source | summaries.rb:81:1:81:1 | [post] a [element] | provenance | | -| summaries.rb:82:6:82:6 | a [element 1] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | -| summaries.rb:82:6:82:6 | a [element 1] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | -| summaries.rb:82:6:82:6 | a [element] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | -| summaries.rb:82:6:82:6 | a [element] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | -| summaries.rb:83:6:83:6 | a [element 1] | summaries.rb:83:6:83:31 | call to readExactlyElementOne | provenance | MaD:26 | -| summaries.rb:83:6:83:6 | a [element 1] | summaries.rb:83:6:83:31 | call to readExactlyElementOne | provenance | MaD:26 | -| summaries.rb:84:6:84:6 | a [element] | summaries.rb:84:6:84:9 | ...[...] | provenance | | -| summaries.rb:84:6:84:6 | a [element] | summaries.rb:84:6:84:9 | ...[...] | provenance | | -| summaries.rb:85:6:85:6 | a [element 1] | summaries.rb:85:6:85:9 | ...[...] | provenance | | -| summaries.rb:85:6:85:6 | a [element 1] | summaries.rb:85:6:85:9 | ...[...] | provenance | | -| summaries.rb:85:6:85:6 | a [element] | summaries.rb:85:6:85:9 | ...[...] | provenance | | -| summaries.rb:85:6:85:6 | a [element] | summaries.rb:85:6:85:9 | ...[...] | provenance | | -| summaries.rb:86:6:86:6 | a [element 2] | summaries.rb:86:6:86:9 | ...[...] | provenance | | -| summaries.rb:86:6:86:6 | a [element 2] | summaries.rb:86:6:86:9 | ...[...] | provenance | | -| summaries.rb:86:6:86:6 | a [element] | summaries.rb:86:6:86:9 | ...[...] | provenance | | -| summaries.rb:86:6:86:6 | a [element] | summaries.rb:86:6:86:9 | ...[...] | provenance | | -| summaries.rb:87:1:87:1 | b [element 1] | summaries.rb:89:6:89:6 | b [element 1] | provenance | | -| summaries.rb:87:1:87:1 | b [element 1] | summaries.rb:89:6:89:6 | b [element 1] | provenance | | -| summaries.rb:87:1:87:1 | b [element] | summaries.rb:88:6:88:6 | b [element] | provenance | | -| summaries.rb:87:1:87:1 | b [element] | summaries.rb:88:6:88:6 | b [element] | provenance | | -| summaries.rb:87:1:87:1 | b [element] | summaries.rb:89:6:89:6 | b [element] | provenance | | -| summaries.rb:87:1:87:1 | b [element] | summaries.rb:89:6:89:6 | b [element] | provenance | | -| summaries.rb:87:1:87:1 | b [element] | summaries.rb:90:6:90:6 | b [element] | provenance | | -| summaries.rb:87:1:87:1 | b [element] | summaries.rb:90:6:90:6 | b [element] | provenance | | -| summaries.rb:87:5:87:5 | a [element 1] | summaries.rb:87:5:87:22 | call to withElementOne [element 1] | provenance | MaD:28 | -| summaries.rb:87:5:87:5 | a [element 1] | summaries.rb:87:5:87:22 | call to withElementOne [element 1] | provenance | MaD:28 | -| summaries.rb:87:5:87:5 | a [element] | summaries.rb:87:5:87:22 | call to withElementOne [element] | provenance | MaD:28 | -| summaries.rb:87:5:87:5 | a [element] | summaries.rb:87:5:87:22 | call to withElementOne [element] | provenance | MaD:28 | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | summaries.rb:87:1:87:1 | b [element 1] | provenance | | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | summaries.rb:87:1:87:1 | b [element 1] | provenance | | -| summaries.rb:87:5:87:22 | call to withElementOne [element] | summaries.rb:87:1:87:1 | b [element] | provenance | | -| summaries.rb:87:5:87:22 | call to withElementOne [element] | summaries.rb:87:1:87:1 | b [element] | provenance | | -| summaries.rb:88:6:88:6 | b [element] | summaries.rb:88:6:88:9 | ...[...] | provenance | | -| summaries.rb:88:6:88:6 | b [element] | summaries.rb:88:6:88:9 | ...[...] | provenance | | -| summaries.rb:89:6:89:6 | b [element 1] | summaries.rb:89:6:89:9 | ...[...] | provenance | | -| summaries.rb:89:6:89:6 | b [element 1] | summaries.rb:89:6:89:9 | ...[...] | provenance | | -| summaries.rb:89:6:89:6 | b [element] | summaries.rb:89:6:89:9 | ...[...] | provenance | | -| summaries.rb:89:6:89:6 | b [element] | summaries.rb:89:6:89:9 | ...[...] | provenance | | -| summaries.rb:90:6:90:6 | b [element] | summaries.rb:90:6:90:9 | ...[...] | provenance | | -| summaries.rb:90:6:90:6 | b [element] | summaries.rb:90:6:90:9 | ...[...] | provenance | | -| summaries.rb:91:1:91:1 | c [element 1] | summaries.rb:93:6:93:6 | c [element 1] | provenance | | -| summaries.rb:91:1:91:1 | c [element 1] | summaries.rb:93:6:93:6 | c [element 1] | provenance | | -| summaries.rb:91:5:91:5 | a [element 1] | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | provenance | MaD:29 | -| summaries.rb:91:5:91:5 | a [element 1] | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | provenance | MaD:29 | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | summaries.rb:91:1:91:1 | c [element 1] | provenance | | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | summaries.rb:91:1:91:1 | c [element 1] | provenance | | -| summaries.rb:93:6:93:6 | c [element 1] | summaries.rb:93:6:93:9 | ...[...] | provenance | | -| summaries.rb:93:6:93:6 | c [element 1] | summaries.rb:93:6:93:9 | ...[...] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:98:6:98:6 | a [element 2] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:98:6:98:6 | a [element 2] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:99:1:99:1 | a [element 2] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element 2] | summaries.rb:99:1:99:1 | a [element 2] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:96:6:96:6 | a [element] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:96:6:96:6 | a [element] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:97:6:97:6 | a [element] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:97:6:97:6 | a [element] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:98:6:98:6 | a [element] | provenance | | -| summaries.rb:95:1:95:1 | [post] a [element] | summaries.rb:98:6:98:6 | a [element] | provenance | | -| summaries.rb:95:1:95:1 | a [element 2] | summaries.rb:95:1:95:1 | [post] a [element 2] | provenance | MaD:32 | -| summaries.rb:95:1:95:1 | a [element 2] | summaries.rb:95:1:95:1 | [post] a [element 2] | provenance | MaD:32 | -| summaries.rb:95:1:95:1 | a [element] | summaries.rb:95:1:95:1 | [post] a [element] | provenance | MaD:32 | -| summaries.rb:95:1:95:1 | a [element] | summaries.rb:95:1:95:1 | [post] a [element] | provenance | MaD:32 | -| summaries.rb:96:6:96:6 | a [element] | summaries.rb:96:6:96:9 | ...[...] | provenance | | -| summaries.rb:96:6:96:6 | a [element] | summaries.rb:96:6:96:9 | ...[...] | provenance | | -| summaries.rb:97:6:97:6 | a [element] | summaries.rb:97:6:97:9 | ...[...] | provenance | | -| summaries.rb:97:6:97:6 | a [element] | summaries.rb:97:6:97:9 | ...[...] | provenance | | -| summaries.rb:98:6:98:6 | a [element 2] | summaries.rb:98:6:98:9 | ...[...] | provenance | | -| summaries.rb:98:6:98:6 | a [element 2] | summaries.rb:98:6:98:9 | ...[...] | provenance | | -| summaries.rb:98:6:98:6 | a [element] | summaries.rb:98:6:98:9 | ...[...] | provenance | | -| summaries.rb:98:6:98:6 | a [element] | summaries.rb:98:6:98:9 | ...[...] | provenance | | -| summaries.rb:99:1:99:1 | [post] a [element 2] | summaries.rb:102:6:102:6 | a [element 2] | provenance | | -| summaries.rb:99:1:99:1 | [post] a [element 2] | summaries.rb:102:6:102:6 | a [element 2] | provenance | | -| summaries.rb:99:1:99:1 | a [element 2] | summaries.rb:99:1:99:1 | [post] a [element 2] | provenance | MaD:31 | -| summaries.rb:99:1:99:1 | a [element 2] | summaries.rb:99:1:99:1 | [post] a [element 2] | provenance | MaD:31 | -| summaries.rb:102:6:102:6 | a [element 2] | summaries.rb:102:6:102:9 | ...[...] | provenance | | -| summaries.rb:102:6:102:6 | a [element 2] | summaries.rb:102:6:102:9 | ...[...] | provenance | | -| summaries.rb:103:1:103:1 | [post] d [element 3] | summaries.rb:104:1:104:1 | d [element 3] | provenance | | -| summaries.rb:103:1:103:1 | [post] d [element 3] | summaries.rb:104:1:104:1 | d [element 3] | provenance | | -| summaries.rb:103:8:103:22 | call to source | summaries.rb:103:1:103:1 | [post] d [element 3] | provenance | | -| summaries.rb:103:8:103:22 | call to source | summaries.rb:103:1:103:1 | [post] d [element 3] | provenance | | -| summaries.rb:104:1:104:1 | [post] d [element 3] | summaries.rb:108:6:108:6 | d [element 3] | provenance | | -| summaries.rb:104:1:104:1 | [post] d [element 3] | summaries.rb:108:6:108:6 | d [element 3] | provenance | | -| summaries.rb:104:1:104:1 | d [element 3] | summaries.rb:104:1:104:1 | [post] d [element 3] | provenance | MaD:30 | -| summaries.rb:104:1:104:1 | d [element 3] | summaries.rb:104:1:104:1 | [post] d [element 3] | provenance | MaD:30 | -| summaries.rb:108:6:108:6 | d [element 3] | summaries.rb:108:6:108:9 | ...[...] | provenance | | -| summaries.rb:108:6:108:6 | d [element 3] | summaries.rb:108:6:108:9 | ...[...] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:82:6:82:6 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:82:6:82:6 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:83:6:83:6 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:83:6:83:6 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:85:6:85:6 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:85:6:85:6 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:87:5:87:5 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:87:5:87:5 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:91:5:91:5 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 1] | summaries.rb:91:5:91:5 | a : Array [element 1] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 2] | summaries.rb:86:6:86:6 | a : Array [element 2] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 2] | summaries.rb:86:6:86:6 | a : Array [element 2] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 2] | summaries.rb:95:1:95:1 | a : Array [element 2] | provenance | | +| summaries.rb:79:1:79:1 | a : Array [element 2] | summaries.rb:95:1:95:1 | a : Array [element 2] | provenance | | +| summaries.rb:79:5:79:47 | call to [] : Array [element 1] | summaries.rb:79:1:79:1 | a : Array [element 1] | provenance | | +| summaries.rb:79:5:79:47 | call to [] : Array [element 1] | summaries.rb:79:1:79:1 | a : Array [element 1] | provenance | | +| summaries.rb:79:5:79:47 | call to [] : Array [element 2] | summaries.rb:79:1:79:1 | a : Array [element 2] | provenance | | +| summaries.rb:79:5:79:47 | call to [] : Array [element 2] | summaries.rb:79:1:79:1 | a : Array [element 2] | provenance | | +| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:5:79:47 | call to [] : Array [element 1] | provenance | | +| summaries.rb:79:15:79:29 | call to source | summaries.rb:79:5:79:47 | call to [] : Array [element 1] | provenance | | +| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:5:79:47 | call to [] : Array [element 2] | provenance | | +| summaries.rb:79:32:79:46 | call to source | summaries.rb:79:5:79:47 | call to [] : Array [element 2] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:82:6:82:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:82:6:82:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:84:6:84:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:84:6:84:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:85:6:85:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:85:6:85:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:86:6:86:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:86:6:86:6 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:87:5:87:5 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:87:5:87:5 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:95:1:95:1 | a : [collection] [element] | provenance | | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | summaries.rb:95:1:95:1 | a : [collection] [element] | provenance | | +| summaries.rb:81:13:81:27 | call to source | summaries.rb:81:1:81:1 | [post] a : [collection] [element] | provenance | | +| summaries.rb:81:13:81:27 | call to source | summaries.rb:81:1:81:1 | [post] a : [collection] [element] | provenance | | +| summaries.rb:82:6:82:6 | a : Array [element 1] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | +| summaries.rb:82:6:82:6 | a : Array [element 1] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | +| summaries.rb:82:6:82:6 | a : [collection] [element] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | +| summaries.rb:82:6:82:6 | a : [collection] [element] | summaries.rb:82:6:82:24 | call to readElementOne | provenance | MaD:25 | +| summaries.rb:83:6:83:6 | a : Array [element 1] | summaries.rb:83:6:83:31 | call to readExactlyElementOne | provenance | MaD:26 | +| summaries.rb:83:6:83:6 | a : Array [element 1] | summaries.rb:83:6:83:31 | call to readExactlyElementOne | provenance | MaD:26 | +| summaries.rb:84:6:84:6 | a : [collection] [element] | summaries.rb:84:6:84:9 | ...[...] | provenance | | +| summaries.rb:84:6:84:6 | a : [collection] [element] | summaries.rb:84:6:84:9 | ...[...] | provenance | | +| summaries.rb:85:6:85:6 | a : Array [element 1] | summaries.rb:85:6:85:9 | ...[...] | provenance | | +| summaries.rb:85:6:85:6 | a : Array [element 1] | summaries.rb:85:6:85:9 | ...[...] | provenance | | +| summaries.rb:85:6:85:6 | a : [collection] [element] | summaries.rb:85:6:85:9 | ...[...] | provenance | | +| summaries.rb:85:6:85:6 | a : [collection] [element] | summaries.rb:85:6:85:9 | ...[...] | provenance | | +| summaries.rb:86:6:86:6 | a : Array [element 2] | summaries.rb:86:6:86:9 | ...[...] | provenance | | +| summaries.rb:86:6:86:6 | a : Array [element 2] | summaries.rb:86:6:86:9 | ...[...] | provenance | | +| summaries.rb:86:6:86:6 | a : [collection] [element] | summaries.rb:86:6:86:9 | ...[...] | provenance | | +| summaries.rb:86:6:86:6 | a : [collection] [element] | summaries.rb:86:6:86:9 | ...[...] | provenance | | +| summaries.rb:87:1:87:1 | b : Array [element 1] | summaries.rb:89:6:89:6 | b : Array [element 1] | provenance | | +| summaries.rb:87:1:87:1 | b : Array [element 1] | summaries.rb:89:6:89:6 | b : Array [element 1] | provenance | | +| summaries.rb:87:1:87:1 | b : [collection] [element] | summaries.rb:88:6:88:6 | b : [collection] [element] | provenance | | +| summaries.rb:87:1:87:1 | b : [collection] [element] | summaries.rb:88:6:88:6 | b : [collection] [element] | provenance | | +| summaries.rb:87:1:87:1 | b : [collection] [element] | summaries.rb:89:6:89:6 | b : [collection] [element] | provenance | | +| summaries.rb:87:1:87:1 | b : [collection] [element] | summaries.rb:89:6:89:6 | b : [collection] [element] | provenance | | +| summaries.rb:87:1:87:1 | b : [collection] [element] | summaries.rb:90:6:90:6 | b : [collection] [element] | provenance | | +| summaries.rb:87:1:87:1 | b : [collection] [element] | summaries.rb:90:6:90:6 | b : [collection] [element] | provenance | | +| summaries.rb:87:5:87:5 | a : Array [element 1] | summaries.rb:87:5:87:22 | call to withElementOne : Array [element 1] | provenance | MaD:28 | +| summaries.rb:87:5:87:5 | a : Array [element 1] | summaries.rb:87:5:87:22 | call to withElementOne : Array [element 1] | provenance | MaD:28 | +| summaries.rb:87:5:87:5 | a : [collection] [element] | summaries.rb:87:5:87:22 | call to withElementOne : [collection] [element] | provenance | MaD:28 | +| summaries.rb:87:5:87:5 | a : [collection] [element] | summaries.rb:87:5:87:22 | call to withElementOne : [collection] [element] | provenance | MaD:28 | +| summaries.rb:87:5:87:22 | call to withElementOne : Array [element 1] | summaries.rb:87:1:87:1 | b : Array [element 1] | provenance | | +| summaries.rb:87:5:87:22 | call to withElementOne : Array [element 1] | summaries.rb:87:1:87:1 | b : Array [element 1] | provenance | | +| summaries.rb:87:5:87:22 | call to withElementOne : [collection] [element] | summaries.rb:87:1:87:1 | b : [collection] [element] | provenance | | +| summaries.rb:87:5:87:22 | call to withElementOne : [collection] [element] | summaries.rb:87:1:87:1 | b : [collection] [element] | provenance | | +| summaries.rb:88:6:88:6 | b : [collection] [element] | summaries.rb:88:6:88:9 | ...[...] | provenance | | +| summaries.rb:88:6:88:6 | b : [collection] [element] | summaries.rb:88:6:88:9 | ...[...] | provenance | | +| summaries.rb:89:6:89:6 | b : Array [element 1] | summaries.rb:89:6:89:9 | ...[...] | provenance | | +| summaries.rb:89:6:89:6 | b : Array [element 1] | summaries.rb:89:6:89:9 | ...[...] | provenance | | +| summaries.rb:89:6:89:6 | b : [collection] [element] | summaries.rb:89:6:89:9 | ...[...] | provenance | | +| summaries.rb:89:6:89:6 | b : [collection] [element] | summaries.rb:89:6:89:9 | ...[...] | provenance | | +| summaries.rb:90:6:90:6 | b : [collection] [element] | summaries.rb:90:6:90:9 | ...[...] | provenance | | +| summaries.rb:90:6:90:6 | b : [collection] [element] | summaries.rb:90:6:90:9 | ...[...] | provenance | | +| summaries.rb:91:1:91:1 | c : Array [element 1] | summaries.rb:93:6:93:6 | c : Array [element 1] | provenance | | +| summaries.rb:91:1:91:1 | c : Array [element 1] | summaries.rb:93:6:93:6 | c : Array [element 1] | provenance | | +| summaries.rb:91:5:91:5 | a : Array [element 1] | summaries.rb:91:5:91:29 | call to withExactlyElementOne : Array [element 1] | provenance | MaD:29 | +| summaries.rb:91:5:91:5 | a : Array [element 1] | summaries.rb:91:5:91:29 | call to withExactlyElementOne : Array [element 1] | provenance | MaD:29 | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne : Array [element 1] | summaries.rb:91:1:91:1 | c : Array [element 1] | provenance | | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne : Array [element 1] | summaries.rb:91:1:91:1 | c : Array [element 1] | provenance | | +| summaries.rb:93:6:93:6 | c : Array [element 1] | summaries.rb:93:6:93:9 | ...[...] | provenance | | +| summaries.rb:93:6:93:6 | c : Array [element 1] | summaries.rb:93:6:93:9 | ...[...] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : Array [element 2] | summaries.rb:98:6:98:6 | a : Array [element 2] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : Array [element 2] | summaries.rb:98:6:98:6 | a : Array [element 2] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : Array [element 2] | summaries.rb:99:1:99:1 | a : Array [element 2] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : Array [element 2] | summaries.rb:99:1:99:1 | a : Array [element 2] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | summaries.rb:96:6:96:6 | a : [collection] [element] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | summaries.rb:96:6:96:6 | a : [collection] [element] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | summaries.rb:97:6:97:6 | a : [collection] [element] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | summaries.rb:97:6:97:6 | a : [collection] [element] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | summaries.rb:98:6:98:6 | a : [collection] [element] | provenance | | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | summaries.rb:98:6:98:6 | a : [collection] [element] | provenance | | +| summaries.rb:95:1:95:1 | a : Array [element 2] | summaries.rb:95:1:95:1 | [post] a : Array [element 2] | provenance | MaD:32 | +| summaries.rb:95:1:95:1 | a : Array [element 2] | summaries.rb:95:1:95:1 | [post] a : Array [element 2] | provenance | MaD:32 | +| summaries.rb:95:1:95:1 | a : [collection] [element] | summaries.rb:95:1:95:1 | [post] a : [collection] [element] | provenance | MaD:32 | +| summaries.rb:95:1:95:1 | a : [collection] [element] | summaries.rb:95:1:95:1 | [post] a : [collection] [element] | provenance | MaD:32 | +| summaries.rb:96:6:96:6 | a : [collection] [element] | summaries.rb:96:6:96:9 | ...[...] | provenance | | +| summaries.rb:96:6:96:6 | a : [collection] [element] | summaries.rb:96:6:96:9 | ...[...] | provenance | | +| summaries.rb:97:6:97:6 | a : [collection] [element] | summaries.rb:97:6:97:9 | ...[...] | provenance | | +| summaries.rb:97:6:97:6 | a : [collection] [element] | summaries.rb:97:6:97:9 | ...[...] | provenance | | +| summaries.rb:98:6:98:6 | a : Array [element 2] | summaries.rb:98:6:98:9 | ...[...] | provenance | | +| summaries.rb:98:6:98:6 | a : Array [element 2] | summaries.rb:98:6:98:9 | ...[...] | provenance | | +| summaries.rb:98:6:98:6 | a : [collection] [element] | summaries.rb:98:6:98:9 | ...[...] | provenance | | +| summaries.rb:98:6:98:6 | a : [collection] [element] | summaries.rb:98:6:98:9 | ...[...] | provenance | | +| summaries.rb:99:1:99:1 | [post] a : Array [element 2] | summaries.rb:102:6:102:6 | a : Array [element 2] | provenance | | +| summaries.rb:99:1:99:1 | [post] a : Array [element 2] | summaries.rb:102:6:102:6 | a : Array [element 2] | provenance | | +| summaries.rb:99:1:99:1 | a : Array [element 2] | summaries.rb:99:1:99:1 | [post] a : Array [element 2] | provenance | MaD:31 | +| summaries.rb:99:1:99:1 | a : Array [element 2] | summaries.rb:99:1:99:1 | [post] a : Array [element 2] | provenance | MaD:31 | +| summaries.rb:102:6:102:6 | a : Array [element 2] | summaries.rb:102:6:102:9 | ...[...] | provenance | | +| summaries.rb:102:6:102:6 | a : Array [element 2] | summaries.rb:102:6:102:9 | ...[...] | provenance | | +| summaries.rb:103:1:103:1 | [post] d : [collection] [element 3] | summaries.rb:104:1:104:1 | d : [collection] [element 3] | provenance | | +| summaries.rb:103:1:103:1 | [post] d : [collection] [element 3] | summaries.rb:104:1:104:1 | d : [collection] [element 3] | provenance | | +| summaries.rb:103:8:103:22 | call to source | summaries.rb:103:1:103:1 | [post] d : [collection] [element 3] | provenance | | +| summaries.rb:103:8:103:22 | call to source | summaries.rb:103:1:103:1 | [post] d : [collection] [element 3] | provenance | | +| summaries.rb:104:1:104:1 | [post] d : [collection] [element 3] | summaries.rb:108:6:108:6 | d : [collection] [element 3] | provenance | | +| summaries.rb:104:1:104:1 | [post] d : [collection] [element 3] | summaries.rb:108:6:108:6 | d : [collection] [element 3] | provenance | | +| summaries.rb:104:1:104:1 | d : [collection] [element 3] | summaries.rb:104:1:104:1 | [post] d : [collection] [element 3] | provenance | MaD:30 | +| summaries.rb:104:1:104:1 | d : [collection] [element 3] | summaries.rb:104:1:104:1 | [post] d : [collection] [element 3] | provenance | MaD:30 | +| summaries.rb:108:6:108:6 | d : [collection] [element 3] | summaries.rb:108:6:108:9 | ...[...] | provenance | | +| summaries.rb:108:6:108:6 | d : [collection] [element 3] | summaries.rb:108:6:108:9 | ...[...] | provenance | | | summaries.rb:111:1:111:1 | [post] x [@value] | summaries.rb:112:6:112:6 | x [@value] | provenance | | | summaries.rb:111:1:111:1 | [post] x [@value] | summaries.rb:112:6:112:6 | x [@value] | provenance | | | summaries.rb:111:13:111:26 | call to source | summaries.rb:111:1:111:1 | [post] x [@value] | provenance | MaD:27 | @@ -283,7 +283,7 @@ edges | summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:154:20:154:26 | tainted | provenance | Sink:MaD:6 | | summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:155:28:155:34 | tainted | provenance | Sink:MaD:6 | | summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:156:27:156:33 | tainted | provenance | Sink:MaD:6 | -| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:157:14:160:3 | do ... end [captured tainted] | provenance | | +| summaries.rb:122:16:122:22 | [post] tainted | summaries.rb:157:14:160:3 | do ... end : [lambda] [captured tainted] | provenance | | | summaries.rb:122:16:122:22 | tainted | summaries.rb:122:16:122:22 | [post] tainted | provenance | MaD:20 | | summaries.rb:122:16:122:22 | tainted | summaries.rb:122:25:122:25 | [post] y | provenance | MaD:20 | | summaries.rb:122:16:122:22 | tainted | summaries.rb:122:33:122:33 | [post] z | provenance | MaD:20 | @@ -292,8 +292,8 @@ edges | summaries.rb:128:1:128:1 | [post] x | summaries.rb:129:6:129:6 | x | provenance | | | summaries.rb:128:14:128:20 | tainted | summaries.rb:128:1:128:1 | [post] x | provenance | MaD:21 | | summaries.rb:131:16:131:22 | tainted | summaries.rb:131:1:131:23 | synthetic splat argument | provenance | Sink:MaD:4 | -| summaries.rb:157:14:160:3 | do ... end [captured tainted] | summaries.rb:158:15:158:21 | tainted | provenance | heuristic-callback Sink:MaD:6 | -| summaries.rb:157:14:160:3 | do ... end [captured tainted] | summaries.rb:158:15:158:21 | tainted | provenance | heuristic-callback Sink:MaD:6 | +| summaries.rb:157:14:160:3 | do ... end : [lambda] [captured tainted] | summaries.rb:158:15:158:21 | tainted | provenance | heuristic-callback Sink:MaD:6 | +| summaries.rb:157:14:160:3 | do ... end : [lambda] [captured tainted] | summaries.rb:158:15:158:21 | tainted | provenance | heuristic-callback Sink:MaD:6 | nodes | summaries.rb:1:11:1:36 | call to identity | semmle.label | call to identity | | summaries.rb:1:11:1:36 | call to identity | semmle.label | call to identity | @@ -361,12 +361,12 @@ nodes | summaries.rb:48:24:48:41 | call to source | semmle.label | call to source | | summaries.rb:51:6:51:31 | call to namedArg | semmle.label | call to namedArg | | summaries.rb:51:24:51:30 | tainted | semmle.label | tainted | -| summaries.rb:53:1:53:4 | args [element :foo] | semmle.label | args [element :foo] | -| summaries.rb:53:8:53:33 | call to [] [element :foo] | semmle.label | call to [] [element :foo] | +| summaries.rb:53:1:53:4 | args : Hash [element :foo] | semmle.label | args : Hash [element :foo] | +| summaries.rb:53:8:53:33 | call to [] : Hash [element :foo] | semmle.label | call to [] : Hash [element :foo] | | summaries.rb:53:15:53:31 | call to source | semmle.label | call to source | | summaries.rb:54:6:54:25 | call to namedArg | semmle.label | call to namedArg | -| summaries.rb:54:19:54:24 | ** ... [element :foo] | semmle.label | ** ... [element :foo] | -| summaries.rb:54:21:54:24 | args [element :foo] | semmle.label | args [element :foo] | +| summaries.rb:54:19:54:24 | ** ... : Hash [element :foo] | semmle.label | ** ... : Hash [element :foo] | +| summaries.rb:54:21:54:24 | args : Hash [element :foo] | semmle.label | args : Hash [element :foo] | | summaries.rb:56:6:56:29 | call to anyArg | semmle.label | call to anyArg | | summaries.rb:56:22:56:28 | tainted | semmle.label | tainted | | summaries.rb:57:6:57:24 | call to anyArg | semmle.label | call to anyArg | @@ -382,124 +382,124 @@ nodes | summaries.rb:73:24:73:53 | call to source | semmle.label | call to source | | summaries.rb:76:8:76:57 | call to preserveTaint | semmle.label | call to preserveTaint | | summaries.rb:76:26:76:56 | call to source | semmle.label | call to source | -| summaries.rb:79:1:79:1 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:79:1:79:1 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:79:1:79:1 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:79:1:79:1 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:79:5:79:47 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| summaries.rb:79:5:79:47 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| summaries.rb:79:5:79:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | -| summaries.rb:79:5:79:47 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| summaries.rb:79:1:79:1 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:79:1:79:1 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:79:1:79:1 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:79:1:79:1 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:79:5:79:47 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| summaries.rb:79:5:79:47 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| summaries.rb:79:5:79:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | +| summaries.rb:79:5:79:47 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | summaries.rb:79:15:79:29 | call to source | semmle.label | call to source | | summaries.rb:79:15:79:29 | call to source | semmle.label | call to source | | summaries.rb:79:32:79:46 | call to source | semmle.label | call to source | | summaries.rb:79:32:79:46 | call to source | semmle.label | call to source | -| summaries.rb:81:1:81:1 | [post] a [element] | semmle.label | [post] a [element] | -| summaries.rb:81:1:81:1 | [post] a [element] | semmle.label | [post] a [element] | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| summaries.rb:81:1:81:1 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | | summaries.rb:81:13:81:27 | call to source | semmle.label | call to source | | summaries.rb:81:13:81:27 | call to source | semmle.label | call to source | -| summaries.rb:82:6:82:6 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:82:6:82:6 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:82:6:82:6 | a [element] | semmle.label | a [element] | -| summaries.rb:82:6:82:6 | a [element] | semmle.label | a [element] | +| summaries.rb:82:6:82:6 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:82:6:82:6 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:82:6:82:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:82:6:82:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | | summaries.rb:82:6:82:24 | call to readElementOne | semmle.label | call to readElementOne | | summaries.rb:82:6:82:24 | call to readElementOne | semmle.label | call to readElementOne | -| summaries.rb:83:6:83:6 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:83:6:83:6 | a [element 1] | semmle.label | a [element 1] | +| summaries.rb:83:6:83:6 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:83:6:83:6 | a : Array [element 1] | semmle.label | a : Array [element 1] | | summaries.rb:83:6:83:31 | call to readExactlyElementOne | semmle.label | call to readExactlyElementOne | | summaries.rb:83:6:83:31 | call to readExactlyElementOne | semmle.label | call to readExactlyElementOne | -| summaries.rb:84:6:84:6 | a [element] | semmle.label | a [element] | -| summaries.rb:84:6:84:6 | a [element] | semmle.label | a [element] | +| summaries.rb:84:6:84:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:84:6:84:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | | summaries.rb:84:6:84:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:84:6:84:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:85:6:85:6 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:85:6:85:6 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:85:6:85:6 | a [element] | semmle.label | a [element] | -| summaries.rb:85:6:85:6 | a [element] | semmle.label | a [element] | +| summaries.rb:85:6:85:6 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:85:6:85:6 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:85:6:85:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:85:6:85:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | | summaries.rb:85:6:85:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:85:6:85:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:86:6:86:6 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:86:6:86:6 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:86:6:86:6 | a [element] | semmle.label | a [element] | -| summaries.rb:86:6:86:6 | a [element] | semmle.label | a [element] | +| summaries.rb:86:6:86:6 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:86:6:86:6 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:86:6:86:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:86:6:86:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | | summaries.rb:86:6:86:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:86:6:86:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:87:1:87:1 | b [element 1] | semmle.label | b [element 1] | -| summaries.rb:87:1:87:1 | b [element 1] | semmle.label | b [element 1] | -| summaries.rb:87:1:87:1 | b [element] | semmle.label | b [element] | -| summaries.rb:87:1:87:1 | b [element] | semmle.label | b [element] | -| summaries.rb:87:5:87:5 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:87:5:87:5 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:87:5:87:5 | a [element] | semmle.label | a [element] | -| summaries.rb:87:5:87:5 | a [element] | semmle.label | a [element] | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | semmle.label | call to withElementOne [element 1] | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] | semmle.label | call to withElementOne [element 1] | -| summaries.rb:87:5:87:22 | call to withElementOne [element] | semmle.label | call to withElementOne [element] | -| summaries.rb:87:5:87:22 | call to withElementOne [element] | semmle.label | call to withElementOne [element] | -| summaries.rb:88:6:88:6 | b [element] | semmle.label | b [element] | -| summaries.rb:88:6:88:6 | b [element] | semmle.label | b [element] | +| summaries.rb:87:1:87:1 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| summaries.rb:87:1:87:1 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| summaries.rb:87:1:87:1 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| summaries.rb:87:1:87:1 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| summaries.rb:87:5:87:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:87:5:87:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:87:5:87:5 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:87:5:87:5 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:87:5:87:22 | call to withElementOne : Array [element 1] | semmle.label | call to withElementOne : Array [element 1] | +| summaries.rb:87:5:87:22 | call to withElementOne : Array [element 1] | semmle.label | call to withElementOne : Array [element 1] | +| summaries.rb:87:5:87:22 | call to withElementOne : [collection] [element] | semmle.label | call to withElementOne : [collection] [element] | +| summaries.rb:87:5:87:22 | call to withElementOne : [collection] [element] | semmle.label | call to withElementOne : [collection] [element] | +| summaries.rb:88:6:88:6 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| summaries.rb:88:6:88:6 | b : [collection] [element] | semmle.label | b : [collection] [element] | | summaries.rb:88:6:88:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:88:6:88:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:89:6:89:6 | b [element 1] | semmle.label | b [element 1] | -| summaries.rb:89:6:89:6 | b [element 1] | semmle.label | b [element 1] | -| summaries.rb:89:6:89:6 | b [element] | semmle.label | b [element] | -| summaries.rb:89:6:89:6 | b [element] | semmle.label | b [element] | +| summaries.rb:89:6:89:6 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| summaries.rb:89:6:89:6 | b : Array [element 1] | semmle.label | b : Array [element 1] | +| summaries.rb:89:6:89:6 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| summaries.rb:89:6:89:6 | b : [collection] [element] | semmle.label | b : [collection] [element] | | summaries.rb:89:6:89:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:89:6:89:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:90:6:90:6 | b [element] | semmle.label | b [element] | -| summaries.rb:90:6:90:6 | b [element] | semmle.label | b [element] | +| summaries.rb:90:6:90:6 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| summaries.rb:90:6:90:6 | b : [collection] [element] | semmle.label | b : [collection] [element] | | summaries.rb:90:6:90:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:90:6:90:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:91:1:91:1 | c [element 1] | semmle.label | c [element 1] | -| summaries.rb:91:1:91:1 | c [element 1] | semmle.label | c [element 1] | -| summaries.rb:91:5:91:5 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:91:5:91:5 | a [element 1] | semmle.label | a [element 1] | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | semmle.label | call to withExactlyElementOne [element 1] | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] | semmle.label | call to withExactlyElementOne [element 1] | -| summaries.rb:93:6:93:6 | c [element 1] | semmle.label | c [element 1] | -| summaries.rb:93:6:93:6 | c [element 1] | semmle.label | c [element 1] | +| summaries.rb:91:1:91:1 | c : Array [element 1] | semmle.label | c : Array [element 1] | +| summaries.rb:91:1:91:1 | c : Array [element 1] | semmle.label | c : Array [element 1] | +| summaries.rb:91:5:91:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:91:5:91:5 | a : Array [element 1] | semmle.label | a : Array [element 1] | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne : Array [element 1] | semmle.label | call to withExactlyElementOne : Array [element 1] | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne : Array [element 1] | semmle.label | call to withExactlyElementOne : Array [element 1] | +| summaries.rb:93:6:93:6 | c : Array [element 1] | semmle.label | c : Array [element 1] | +| summaries.rb:93:6:93:6 | c : Array [element 1] | semmle.label | c : Array [element 1] | | summaries.rb:93:6:93:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:93:6:93:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:95:1:95:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| summaries.rb:95:1:95:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| summaries.rb:95:1:95:1 | [post] a [element] | semmle.label | [post] a [element] | -| summaries.rb:95:1:95:1 | [post] a [element] | semmle.label | [post] a [element] | -| summaries.rb:95:1:95:1 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:95:1:95:1 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:95:1:95:1 | a [element] | semmle.label | a [element] | -| summaries.rb:95:1:95:1 | a [element] | semmle.label | a [element] | -| summaries.rb:96:6:96:6 | a [element] | semmle.label | a [element] | -| summaries.rb:96:6:96:6 | a [element] | semmle.label | a [element] | +| summaries.rb:95:1:95:1 | [post] a : Array [element 2] | semmle.label | [post] a : Array [element 2] | +| summaries.rb:95:1:95:1 | [post] a : Array [element 2] | semmle.label | [post] a : Array [element 2] | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| summaries.rb:95:1:95:1 | [post] a : [collection] [element] | semmle.label | [post] a : [collection] [element] | +| summaries.rb:95:1:95:1 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:95:1:95:1 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:95:1:95:1 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:95:1:95:1 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:96:6:96:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:96:6:96:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | | summaries.rb:96:6:96:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:96:6:96:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:97:6:97:6 | a [element] | semmle.label | a [element] | -| summaries.rb:97:6:97:6 | a [element] | semmle.label | a [element] | +| summaries.rb:97:6:97:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:97:6:97:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | | summaries.rb:97:6:97:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:97:6:97:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:98:6:98:6 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:98:6:98:6 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:98:6:98:6 | a [element] | semmle.label | a [element] | -| summaries.rb:98:6:98:6 | a [element] | semmle.label | a [element] | +| summaries.rb:98:6:98:6 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:98:6:98:6 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:98:6:98:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | +| summaries.rb:98:6:98:6 | a : [collection] [element] | semmle.label | a : [collection] [element] | | summaries.rb:98:6:98:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:98:6:98:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:99:1:99:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| summaries.rb:99:1:99:1 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| summaries.rb:99:1:99:1 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:99:1:99:1 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:102:6:102:6 | a [element 2] | semmle.label | a [element 2] | -| summaries.rb:102:6:102:6 | a [element 2] | semmle.label | a [element 2] | +| summaries.rb:99:1:99:1 | [post] a : Array [element 2] | semmle.label | [post] a : Array [element 2] | +| summaries.rb:99:1:99:1 | [post] a : Array [element 2] | semmle.label | [post] a : Array [element 2] | +| summaries.rb:99:1:99:1 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:99:1:99:1 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:102:6:102:6 | a : Array [element 2] | semmle.label | a : Array [element 2] | +| summaries.rb:102:6:102:6 | a : Array [element 2] | semmle.label | a : Array [element 2] | | summaries.rb:102:6:102:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:102:6:102:9 | ...[...] | semmle.label | ...[...] | -| summaries.rb:103:1:103:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | -| summaries.rb:103:1:103:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | +| summaries.rb:103:1:103:1 | [post] d : [collection] [element 3] | semmle.label | [post] d : [collection] [element 3] | +| summaries.rb:103:1:103:1 | [post] d : [collection] [element 3] | semmle.label | [post] d : [collection] [element 3] | | summaries.rb:103:8:103:22 | call to source | semmle.label | call to source | | summaries.rb:103:8:103:22 | call to source | semmle.label | call to source | -| summaries.rb:104:1:104:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | -| summaries.rb:104:1:104:1 | [post] d [element 3] | semmle.label | [post] d [element 3] | -| summaries.rb:104:1:104:1 | d [element 3] | semmle.label | d [element 3] | -| summaries.rb:104:1:104:1 | d [element 3] | semmle.label | d [element 3] | -| summaries.rb:108:6:108:6 | d [element 3] | semmle.label | d [element 3] | -| summaries.rb:108:6:108:6 | d [element 3] | semmle.label | d [element 3] | +| summaries.rb:104:1:104:1 | [post] d : [collection] [element 3] | semmle.label | [post] d : [collection] [element 3] | +| summaries.rb:104:1:104:1 | [post] d : [collection] [element 3] | semmle.label | [post] d : [collection] [element 3] | +| summaries.rb:104:1:104:1 | d : [collection] [element 3] | semmle.label | d : [collection] [element 3] | +| summaries.rb:104:1:104:1 | d : [collection] [element 3] | semmle.label | d : [collection] [element 3] | +| summaries.rb:108:6:108:6 | d : [collection] [element 3] | semmle.label | d : [collection] [element 3] | +| summaries.rb:108:6:108:6 | d : [collection] [element 3] | semmle.label | d : [collection] [element 3] | | summaries.rb:108:6:108:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:108:6:108:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:111:1:111:1 | [post] x [@value] | semmle.label | [post] x [@value] | @@ -545,8 +545,8 @@ nodes | summaries.rb:155:28:155:34 | tainted | semmle.label | tainted | | summaries.rb:156:27:156:33 | tainted | semmle.label | tainted | | summaries.rb:156:27:156:33 | tainted | semmle.label | tainted | -| summaries.rb:157:14:160:3 | do ... end [captured tainted] | semmle.label | do ... end [captured tainted] | -| summaries.rb:157:14:160:3 | do ... end [captured tainted] | semmle.label | do ... end [captured tainted] | +| summaries.rb:157:14:160:3 | do ... end : [lambda] [captured tainted] | semmle.label | do ... end : [lambda] [captured tainted] | +| summaries.rb:157:14:160:3 | do ... end : [lambda] [captured tainted] | semmle.label | do ... end : [lambda] [captured tainted] | | summaries.rb:158:15:158:21 | tainted | semmle.label | tainted | | summaries.rb:158:15:158:21 | tainted | semmle.label | tainted | | summaries.rb:163:20:163:36 | call to source | semmle.label | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/type-flow/Flow.expected b/ruby/ql/test/library-tests/dataflow/type-flow/Flow.expected new file mode 100644 index 00000000000..1083f7136f0 --- /dev/null +++ b/ruby/ql/test/library-tests/dataflow/type-flow/Flow.expected @@ -0,0 +1,373 @@ +models +edges +| types.rb:1:11:1:11 | x : C1 | types.rb:2:5:2:5 | x : C1 | provenance | | +| types.rb:1:11:1:11 | x : C2 | types.rb:2:5:2:5 | x : C2 | provenance | | +| types.rb:1:11:1:11 | x : C3 | types.rb:2:5:2:5 | x : C3 | provenance | | +| types.rb:20:5:22:7 | self in call_foo : C1 | types.rb:21:13:21:16 | self : C1 | provenance | | +| types.rb:20:5:22:7 | self in call_foo : C3 | types.rb:21:13:21:16 | self : C3 | provenance | | +| types.rb:21:13:21:16 | self : C1 | types.rb:52:9:52:9 | x : C1 | provenance | | +| types.rb:21:13:21:16 | self : C1 | types.rb:52:9:52:9 | x : C1 | provenance | | +| types.rb:21:13:21:16 | self : C3 | types.rb:52:9:52:9 | x : C3 | provenance | | +| types.rb:24:5:26:7 | self in call_bar : C1 | types.rb:25:13:25:16 | self : C1 | provenance | | +| types.rb:24:5:26:7 | self in call_bar : C3 | types.rb:25:13:25:16 | self : C3 | provenance | | +| types.rb:25:13:25:16 | self : C1 | types.rb:61:9:61:9 | x : C1 | provenance | | +| types.rb:25:13:25:16 | self : C1 | types.rb:61:9:61:9 | x : C1 | provenance | | +| types.rb:25:13:25:16 | self : C3 | types.rb:61:9:61:9 | x : C3 | provenance | | +| types.rb:31:5:33:7 | self in call_maybe_sink : C1 | types.rb:32:9:32:18 | self : C1 | provenance | | +| types.rb:31:5:33:7 | self in call_maybe_sink : C2 | types.rb:32:9:32:18 | self : C2 | provenance | | +| types.rb:31:5:33:7 | self in call_maybe_sink : C3 | types.rb:32:9:32:18 | self : C3 | provenance | | +| types.rb:32:9:32:18 | self : C1 | types.rb:41:5:43:7 | self in maybe_sink : C2 | provenance | | +| types.rb:32:9:32:18 | self : C1 | types.rb:47:5:49:7 | self in maybe_sink : C3 | provenance | | +| types.rb:32:9:32:18 | self : C2 | types.rb:41:5:43:7 | self in maybe_sink : C2 | provenance | | +| types.rb:32:9:32:18 | self : C3 | types.rb:47:5:49:7 | self in maybe_sink : C3 | provenance | | +| types.rb:35:5:37:7 | self in call_call_maybe_sink : C1 | types.rb:36:9:36:23 | self : C1 | provenance | | +| types.rb:35:5:37:7 | self in call_call_maybe_sink : C2 | types.rb:36:9:36:23 | self : C2 | provenance | | +| types.rb:35:5:37:7 | self in call_call_maybe_sink : C3 | types.rb:36:9:36:23 | self : C3 | provenance | | +| types.rb:36:9:36:23 | self : C1 | types.rb:31:5:33:7 | self in call_maybe_sink : C1 | provenance | | +| types.rb:36:9:36:23 | self : C2 | types.rb:31:5:33:7 | self in call_maybe_sink : C2 | provenance | | +| types.rb:36:9:36:23 | self : C3 | types.rb:31:5:33:7 | self in call_maybe_sink : C3 | provenance | | +| types.rb:41:5:43:7 | self in maybe_sink : C2 | types.rb:42:14:42:17 | self | provenance | | +| types.rb:47:5:49:7 | self in maybe_sink : C3 | types.rb:48:14:48:17 | self | provenance | | +| types.rb:52:9:52:9 | x : C1 | types.rb:55:18:55:18 | x | provenance | | +| types.rb:52:9:52:9 | x : C3 | types.rb:55:18:55:18 | x | provenance | | +| types.rb:61:9:61:9 | x : C1 | types.rb:63:18:63:19 | c3 : C3 | provenance | | +| types.rb:61:9:61:9 | x : C3 | types.rb:63:18:63:19 | c3 : C3 | provenance | | +| types.rb:63:18:63:19 | c3 : C3 | types.rb:64:18:64:19 | c3 | provenance | | +| types.rb:71:5:71:19 | call to taint : C1 | types.rb:52:9:52:9 | x : C1 | provenance | | +| types.rb:71:11:71:18 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | provenance | | +| types.rb:71:11:71:18 | call to new : C1 | types.rb:71:5:71:19 | call to taint : C1 | provenance | | +| types.rb:73:5:73:19 | call to taint : C3 | types.rb:52:9:52:9 | x : C3 | provenance | | +| types.rb:73:11:73:18 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | provenance | | +| types.rb:73:11:73:18 | call to new : C3 | types.rb:73:5:73:19 | call to taint : C3 | provenance | | +| types.rb:75:1:75:15 | call to taint : C1 | types.rb:20:5:22:7 | self in call_foo : C1 | provenance | | +| types.rb:75:7:75:14 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | provenance | | +| types.rb:75:7:75:14 | call to new : C1 | types.rb:75:1:75:15 | call to taint : C1 | provenance | | +| types.rb:77:1:77:15 | call to taint : C3 | types.rb:20:5:22:7 | self in call_foo : C3 | provenance | | +| types.rb:77:7:77:14 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | provenance | | +| types.rb:77:7:77:14 | call to new : C3 | types.rb:77:1:77:15 | call to taint : C3 | provenance | | +| types.rb:79:5:79:19 | call to taint : C1 | types.rb:61:9:61:9 | x : C1 | provenance | | +| types.rb:79:11:79:18 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | provenance | | +| types.rb:79:11:79:18 | call to new : C1 | types.rb:79:5:79:19 | call to taint : C1 | provenance | | +| types.rb:81:5:81:19 | call to taint : C3 | types.rb:61:9:61:9 | x : C3 | provenance | | +| types.rb:81:11:81:18 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | provenance | | +| types.rb:81:11:81:18 | call to new : C3 | types.rb:81:5:81:19 | call to taint : C3 | provenance | | +| types.rb:83:1:83:15 | call to taint : C1 | types.rb:24:5:26:7 | self in call_bar : C1 | provenance | | +| types.rb:83:7:83:14 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | provenance | | +| types.rb:83:7:83:14 | call to new : C1 | types.rb:83:1:83:15 | call to taint : C1 | provenance | | +| types.rb:85:1:85:16 | call to taint : C3 | types.rb:24:5:26:7 | self in call_bar : C3 | provenance | | +| types.rb:85:7:85:15 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | provenance | | +| types.rb:85:7:85:15 | call to new : C3 | types.rb:85:1:85:16 | call to taint : C3 | provenance | | +| types.rb:87:1:87:16 | call to taint : C1 | types.rb:35:5:37:7 | self in call_call_maybe_sink : C1 | provenance | | +| types.rb:87:7:87:15 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | provenance | | +| types.rb:87:7:87:15 | call to new : C1 | types.rb:87:1:87:16 | call to taint : C1 | provenance | | +| types.rb:88:1:88:16 | call to taint : C2 | types.rb:35:5:37:7 | self in call_call_maybe_sink : C2 | provenance | | +| types.rb:88:7:88:15 | call to new : C2 | types.rb:1:11:1:11 | x : C2 | provenance | | +| types.rb:88:7:88:15 | call to new : C2 | types.rb:88:1:88:16 | call to taint : C2 | provenance | | +| types.rb:89:1:89:16 | call to taint : C3 | types.rb:35:5:37:7 | self in call_call_maybe_sink : C3 | provenance | | +| types.rb:89:7:89:15 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | provenance | | +| types.rb:89:7:89:15 | call to new : C3 | types.rb:89:1:89:16 | call to taint : C3 | provenance | | +nodes +| types.rb:1:11:1:11 | x : C1 | semmle.label | x : C1 | +| types.rb:1:11:1:11 | x : C2 | semmle.label | x : C2 | +| types.rb:1:11:1:11 | x : C3 | semmle.label | x : C3 | +| types.rb:2:5:2:5 | x : C1 | semmle.label | x : C1 | +| types.rb:2:5:2:5 | x : C2 | semmle.label | x : C2 | +| types.rb:2:5:2:5 | x : C3 | semmle.label | x : C3 | +| types.rb:20:5:22:7 | self in call_foo : C1 | semmle.label | self in call_foo : C1 | +| types.rb:20:5:22:7 | self in call_foo : C3 | semmle.label | self in call_foo : C3 | +| types.rb:21:13:21:16 | self : C1 | semmle.label | self : C1 | +| types.rb:21:13:21:16 | self : C1 | semmle.label | self : C1 | +| types.rb:21:13:21:16 | self : C3 | semmle.label | self : C3 | +| types.rb:24:5:26:7 | self in call_bar : C1 | semmle.label | self in call_bar : C1 | +| types.rb:24:5:26:7 | self in call_bar : C3 | semmle.label | self in call_bar : C3 | +| types.rb:25:13:25:16 | self : C1 | semmle.label | self : C1 | +| types.rb:25:13:25:16 | self : C1 | semmle.label | self : C1 | +| types.rb:25:13:25:16 | self : C3 | semmle.label | self : C3 | +| types.rb:31:5:33:7 | self in call_maybe_sink : C1 | semmle.label | self in call_maybe_sink : C1 | +| types.rb:31:5:33:7 | self in call_maybe_sink : C2 | semmle.label | self in call_maybe_sink : C2 | +| types.rb:31:5:33:7 | self in call_maybe_sink : C3 | semmle.label | self in call_maybe_sink : C3 | +| types.rb:32:9:32:18 | self : C1 | semmle.label | self : C1 | +| types.rb:32:9:32:18 | self : C2 | semmle.label | self : C2 | +| types.rb:32:9:32:18 | self : C3 | semmle.label | self : C3 | +| types.rb:35:5:37:7 | self in call_call_maybe_sink : C1 | semmle.label | self in call_call_maybe_sink : C1 | +| types.rb:35:5:37:7 | self in call_call_maybe_sink : C2 | semmle.label | self in call_call_maybe_sink : C2 | +| types.rb:35:5:37:7 | self in call_call_maybe_sink : C3 | semmle.label | self in call_call_maybe_sink : C3 | +| types.rb:36:9:36:23 | self : C1 | semmle.label | self : C1 | +| types.rb:36:9:36:23 | self : C2 | semmle.label | self : C2 | +| types.rb:36:9:36:23 | self : C3 | semmle.label | self : C3 | +| types.rb:41:5:43:7 | self in maybe_sink : C2 | semmle.label | self in maybe_sink : C2 | +| types.rb:42:14:42:17 | self | semmle.label | self | +| types.rb:47:5:49:7 | self in maybe_sink : C3 | semmle.label | self in maybe_sink : C3 | +| types.rb:48:14:48:17 | self | semmle.label | self | +| types.rb:52:9:52:9 | x : C1 | semmle.label | x : C1 | +| types.rb:52:9:52:9 | x : C3 | semmle.label | x : C3 | +| types.rb:55:18:55:18 | x | semmle.label | x | +| types.rb:61:9:61:9 | x : C1 | semmle.label | x : C1 | +| types.rb:61:9:61:9 | x : C3 | semmle.label | x : C3 | +| types.rb:63:18:63:19 | c3 : C3 | semmle.label | c3 : C3 | +| types.rb:64:18:64:19 | c3 | semmle.label | c3 | +| types.rb:71:5:71:19 | call to taint : C1 | semmle.label | call to taint : C1 | +| types.rb:71:11:71:18 | call to new : C1 | semmle.label | call to new : C1 | +| types.rb:73:5:73:19 | call to taint : C3 | semmle.label | call to taint : C3 | +| types.rb:73:11:73:18 | call to new : C3 | semmle.label | call to new : C3 | +| types.rb:75:1:75:15 | call to taint : C1 | semmle.label | call to taint : C1 | +| types.rb:75:7:75:14 | call to new : C1 | semmle.label | call to new : C1 | +| types.rb:77:1:77:15 | call to taint : C3 | semmle.label | call to taint : C3 | +| types.rb:77:7:77:14 | call to new : C3 | semmle.label | call to new : C3 | +| types.rb:79:5:79:19 | call to taint : C1 | semmle.label | call to taint : C1 | +| types.rb:79:11:79:18 | call to new : C1 | semmle.label | call to new : C1 | +| types.rb:81:5:81:19 | call to taint : C3 | semmle.label | call to taint : C3 | +| types.rb:81:11:81:18 | call to new : C3 | semmle.label | call to new : C3 | +| types.rb:83:1:83:15 | call to taint : C1 | semmle.label | call to taint : C1 | +| types.rb:83:7:83:14 | call to new : C1 | semmle.label | call to new : C1 | +| types.rb:85:1:85:16 | call to taint : C3 | semmle.label | call to taint : C3 | +| types.rb:85:7:85:15 | call to new : C3 | semmle.label | call to new : C3 | +| types.rb:87:1:87:16 | call to taint : C1 | semmle.label | call to taint : C1 | +| types.rb:87:7:87:15 | call to new : C1 | semmle.label | call to new : C1 | +| types.rb:88:1:88:16 | call to taint : C2 | semmle.label | call to taint : C2 | +| types.rb:88:7:88:15 | call to new : C2 | semmle.label | call to new : C2 | +| types.rb:89:1:89:16 | call to taint : C3 | semmle.label | call to taint : C3 | +| types.rb:89:7:89:15 | call to new : C3 | semmle.label | call to new : C3 | +subpaths +| types.rb:71:11:71:18 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | types.rb:2:5:2:5 | x : C1 | types.rb:71:5:71:19 | call to taint : C1 | +| types.rb:73:11:73:18 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | types.rb:2:5:2:5 | x : C3 | types.rb:73:5:73:19 | call to taint : C3 | +| types.rb:75:7:75:14 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | types.rb:2:5:2:5 | x : C1 | types.rb:75:1:75:15 | call to taint : C1 | +| types.rb:77:7:77:14 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | types.rb:2:5:2:5 | x : C3 | types.rb:77:1:77:15 | call to taint : C3 | +| types.rb:79:11:79:18 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | types.rb:2:5:2:5 | x : C1 | types.rb:79:5:79:19 | call to taint : C1 | +| types.rb:81:11:81:18 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | types.rb:2:5:2:5 | x : C3 | types.rb:81:5:81:19 | call to taint : C3 | +| types.rb:83:7:83:14 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | types.rb:2:5:2:5 | x : C1 | types.rb:83:1:83:15 | call to taint : C1 | +| types.rb:85:7:85:15 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | types.rb:2:5:2:5 | x : C3 | types.rb:85:1:85:16 | call to taint : C3 | +| types.rb:87:7:87:15 | call to new : C1 | types.rb:1:11:1:11 | x : C1 | types.rb:2:5:2:5 | x : C1 | types.rb:87:1:87:16 | call to taint : C1 | +| types.rb:88:7:88:15 | call to new : C2 | types.rb:1:11:1:11 | x : C2 | types.rb:2:5:2:5 | x : C2 | types.rb:88:1:88:16 | call to taint : C2 | +| types.rb:89:7:89:15 | call to new : C3 | types.rb:1:11:1:11 | x : C3 | types.rb:2:5:2:5 | x : C3 | types.rb:89:1:89:16 | call to taint : C3 | +testFailures +nodeType +| file://:0:0:0:0 | [summary param] * (position 0) in Array.[] | file://:0:0:0:0 | Array | +| file://:0:0:0:0 | [summary param] ** in Hash.[] | file://:0:0:0:0 | Hash | +| file://:0:0:0:0 | [summary param] ** in I18n.translate | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] position 0 in & | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] position 0 in + | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] position 0 in Hash[] | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] position 0 in \| | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] self in & | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] self in * | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] self in - | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] self in \| | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary param] self in assoc-unknown-arg | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[0].Element[any] in Hash[] | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[0].WithElement[0..] in Array() | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[0].WithElement[any] in Array.new | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[0].WithElement[any] in Array.try_convert | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[0].WithElement[any] in Hash.try_convert | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[0].WithElement[any] in Hash[] | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[self].WithElement[any] in *(splat) | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[self].WithElement[any] in **(hash-splat) | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[self].WithElement[any] in + | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] read: Argument[self].WithElement[any] in << | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: Argument[self] in << | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in & | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in * | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in *(splat) | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in + | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in - | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in << | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in Array() | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in Array.new | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in Hash[] | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in \| | file://:0:0:0:0 | [collection] | +| file://:0:0:0:0 | [summary] to write: ReturnValue in assoc-unknown-arg | file://:0:0:0:0 | [collection] | +| types.rb:1:1:3:3 | &block | file://:0:0:0:0 | Proc | +| types.rb:1:1:3:3 | self in taint | file://:0:0:0:0 | Object | +| types.rb:1:1:3:3 | synthetic splat parameter | file://:0:0:0:0 | Array | +| types.rb:1:1:3:3 | taint | file://:0:0:0:0 | Symbol | +| types.rb:1:1:89:38 | self (types.rb) | file://:0:0:0:0 | Object | +| types.rb:1:1:89:38 | self in types.rb | file://:0:0:0:0 | Object | +| types.rb:5:1:7:3 | &block | file://:0:0:0:0 | Proc | +| types.rb:5:1:7:3 | self (sink) | file://:0:0:0:0 | Object | +| types.rb:5:1:7:3 | self in sink | file://:0:0:0:0 | Object | +| types.rb:5:1:7:3 | sink | file://:0:0:0:0 | Symbol | +| types.rb:5:1:7:3 | synthetic splat parameter | file://:0:0:0:0 | Array | +| types.rb:6:5:6:31 | self | file://:0:0:0:0 | Object | +| types.rb:6:5:6:31 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:6:10:6:31 | "SINK: #{...}" | file://:0:0:0:0 | String | +| types.rb:12:5:14:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:12:5:14:7 | initialize | file://:0:0:0:0 | Symbol | +| types.rb:12:5:14:7 | self (initialize) | types.rb:9:1:38:3 | C1 | +| types.rb:12:5:14:7 | self in initialize | types.rb:9:1:38:3 | C1 | +| types.rb:12:5:14:7 | synthetic splat parameter | file://:0:0:0:0 | Array | +| types.rb:13:9:13:14 | self | types.rb:9:1:38:3 | C1 | +| types.rb:16:5:18:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:16:5:18:7 | get_field | file://:0:0:0:0 | Symbol | +| types.rb:16:5:18:7 | self (get_field) | types.rb:9:1:38:3 | C1 | +| types.rb:16:5:18:7 | self in get_field | types.rb:9:1:38:3 | C1 | +| types.rb:17:9:17:14 | self | types.rb:9:1:38:3 | C1 | +| types.rb:20:5:22:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:20:5:22:7 | call_foo | file://:0:0:0:0 | Symbol | +| types.rb:20:5:22:7 | self (call_foo) | types.rb:9:1:38:3 | C1 | +| types.rb:20:5:22:7 | self in call_foo | types.rb:9:1:38:3 | C1 | +| types.rb:21:9:21:17 | self | types.rb:9:1:38:3 | C1 | +| types.rb:21:9:21:17 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:21:13:21:16 | self | types.rb:9:1:38:3 | C1 | +| types.rb:24:5:26:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:24:5:26:7 | call_bar | file://:0:0:0:0 | Symbol | +| types.rb:24:5:26:7 | self (call_bar) | types.rb:9:1:38:3 | C1 | +| types.rb:24:5:26:7 | self in call_bar | types.rb:9:1:38:3 | C1 | +| types.rb:25:9:25:17 | self | types.rb:9:1:38:3 | C1 | +| types.rb:25:9:25:17 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:25:13:25:16 | self | types.rb:9:1:38:3 | C1 | +| types.rb:28:5:29:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:28:5:29:7 | maybe_sink | file://:0:0:0:0 | Symbol | +| types.rb:28:5:29:7 | self in maybe_sink | types.rb:9:1:38:3 | C1 | +| types.rb:31:5:33:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:31:5:33:7 | call_maybe_sink | file://:0:0:0:0 | Symbol | +| types.rb:31:5:33:7 | self (call_maybe_sink) | types.rb:9:1:38:3 | C1 | +| types.rb:31:5:33:7 | self in call_maybe_sink | types.rb:9:1:38:3 | C1 | +| types.rb:32:9:32:18 | self | types.rb:9:1:38:3 | C1 | +| types.rb:35:5:37:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:35:5:37:7 | call_call_maybe_sink | file://:0:0:0:0 | Symbol | +| types.rb:35:5:37:7 | self (call_call_maybe_sink) | types.rb:9:1:38:3 | C1 | +| types.rb:35:5:37:7 | self in call_call_maybe_sink | types.rb:9:1:38:3 | C1 | +| types.rb:36:9:36:23 | self | types.rb:9:1:38:3 | C1 | +| types.rb:41:5:43:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:41:5:43:7 | maybe_sink | file://:0:0:0:0 | Symbol | +| types.rb:41:5:43:7 | self (maybe_sink) | types.rb:40:1:44:3 | C2 | +| types.rb:41:5:43:7 | self in maybe_sink | types.rb:40:1:44:3 | C2 | +| types.rb:42:9:42:17 | self | types.rb:40:1:44:3 | C2 | +| types.rb:42:9:42:17 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:42:14:42:17 | self | types.rb:40:1:44:3 | C2 | +| types.rb:47:5:49:7 | &block | file://:0:0:0:0 | Proc | +| types.rb:47:5:49:7 | maybe_sink | file://:0:0:0:0 | Symbol | +| types.rb:47:5:49:7 | self (maybe_sink) | types.rb:46:1:50:3 | C3 | +| types.rb:47:5:49:7 | self in maybe_sink | types.rb:46:1:50:3 | C3 | +| types.rb:48:9:48:17 | self | types.rb:46:1:50:3 | C3 | +| types.rb:48:9:48:17 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:48:14:48:17 | self | types.rb:46:1:50:3 | C3 | +| types.rb:52:1:59:3 | &block | file://:0:0:0:0 | Proc | +| types.rb:52:1:59:3 | foo | file://:0:0:0:0 | Symbol | +| types.rb:52:1:59:3 | self (foo) | file://:0:0:0:0 | Object | +| types.rb:52:1:59:3 | self in foo | file://:0:0:0:0 | Object | +| types.rb:52:1:59:3 | synthetic splat parameter | file://:0:0:0:0 | Array | +| types.rb:55:13:55:19 | self | file://:0:0:0:0 | Object | +| types.rb:55:13:55:19 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:55:18:55:18 | x | types.rb:46:1:50:3 | C3 | +| types.rb:56:18:56:18 | x | types.rb:46:1:50:3 | C3 | +| types.rb:56:33:56:39 | self | file://:0:0:0:0 | Object | +| types.rb:56:33:56:39 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:56:38:56:38 | x | types.rb:40:1:44:3 | C2 | +| types.rb:61:1:69:3 | &block | file://:0:0:0:0 | Proc | +| types.rb:61:1:69:3 | bar | file://:0:0:0:0 | Symbol | +| types.rb:61:1:69:3 | self (bar) | file://:0:0:0:0 | Object | +| types.rb:61:1:69:3 | self in bar | file://:0:0:0:0 | Object | +| types.rb:61:1:69:3 | synthetic splat parameter | file://:0:0:0:0 | Array | +| types.rb:63:18:63:19 | c3 | types.rb:46:1:50:3 | C3 | +| types.rb:64:13:64:20 | self | file://:0:0:0:0 | Object | +| types.rb:64:13:64:20 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:64:18:64:19 | c3 | types.rb:46:1:50:3 | C3 | +| types.rb:65:18:65:19 | c3 | types.rb:46:1:50:3 | C3 | +| types.rb:65:34:65:41 | self | file://:0:0:0:0 | Object | +| types.rb:65:34:65:41 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:65:39:65:40 | c3 | types.rb:40:1:44:3 | C2 | +| types.rb:71:1:71:20 | self | file://:0:0:0:0 | Object | +| types.rb:71:1:71:20 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:71:5:71:19 | self | file://:0:0:0:0 | Object | +| types.rb:71:5:71:19 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:71:11:71:18 | call to new | types.rb:9:1:38:3 | C1 | +| types.rb:71:11:71:18 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:71:18:71:18 | 0 | file://:0:0:0:0 | Integer | +| types.rb:72:1:72:20 | self | file://:0:0:0:0 | Object | +| types.rb:72:1:72:20 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:72:5:72:19 | self | file://:0:0:0:0 | Object | +| types.rb:72:5:72:19 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:72:11:72:18 | call to new | types.rb:40:1:44:3 | C2 | +| types.rb:72:11:72:18 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:72:18:72:18 | 1 | file://:0:0:0:0 | Integer | +| types.rb:73:1:73:20 | self | file://:0:0:0:0 | Object | +| types.rb:73:1:73:20 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:73:5:73:19 | self | file://:0:0:0:0 | Object | +| types.rb:73:5:73:19 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:73:11:73:18 | call to new | types.rb:46:1:50:3 | C3 | +| types.rb:73:11:73:18 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:73:18:73:18 | 2 | file://:0:0:0:0 | Integer | +| types.rb:75:1:75:15 | self | file://:0:0:0:0 | Object | +| types.rb:75:1:75:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:75:7:75:14 | call to new | types.rb:9:1:38:3 | C1 | +| types.rb:75:7:75:14 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:75:14:75:14 | 3 | file://:0:0:0:0 | Integer | +| types.rb:76:1:76:15 | self | file://:0:0:0:0 | Object | +| types.rb:76:1:76:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:76:7:76:14 | call to new | types.rb:40:1:44:3 | C2 | +| types.rb:76:7:76:14 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:76:14:76:14 | 4 | file://:0:0:0:0 | Integer | +| types.rb:77:1:77:15 | self | file://:0:0:0:0 | Object | +| types.rb:77:1:77:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:77:7:77:14 | call to new | types.rb:46:1:50:3 | C3 | +| types.rb:77:7:77:14 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:77:14:77:14 | 5 | file://:0:0:0:0 | Integer | +| types.rb:79:1:79:20 | self | file://:0:0:0:0 | Object | +| types.rb:79:1:79:20 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:79:5:79:19 | self | file://:0:0:0:0 | Object | +| types.rb:79:5:79:19 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:79:11:79:18 | call to new | types.rb:9:1:38:3 | C1 | +| types.rb:79:11:79:18 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:79:18:79:18 | 6 | file://:0:0:0:0 | Integer | +| types.rb:80:1:80:20 | self | file://:0:0:0:0 | Object | +| types.rb:80:1:80:20 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:80:5:80:19 | self | file://:0:0:0:0 | Object | +| types.rb:80:5:80:19 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:80:11:80:18 | call to new | types.rb:40:1:44:3 | C2 | +| types.rb:80:11:80:18 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:80:18:80:18 | 7 | file://:0:0:0:0 | Integer | +| types.rb:81:1:81:20 | self | file://:0:0:0:0 | Object | +| types.rb:81:1:81:20 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:81:5:81:19 | self | file://:0:0:0:0 | Object | +| types.rb:81:5:81:19 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:81:11:81:18 | call to new | types.rb:46:1:50:3 | C3 | +| types.rb:81:11:81:18 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:81:18:81:18 | 8 | file://:0:0:0:0 | Integer | +| types.rb:83:1:83:15 | self | file://:0:0:0:0 | Object | +| types.rb:83:1:83:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:83:7:83:14 | call to new | types.rb:9:1:38:3 | C1 | +| types.rb:83:7:83:14 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:83:14:83:14 | 9 | file://:0:0:0:0 | Integer | +| types.rb:84:1:84:16 | self | file://:0:0:0:0 | Object | +| types.rb:84:1:84:16 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:84:7:84:15 | call to new | types.rb:40:1:44:3 | C2 | +| types.rb:84:7:84:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:84:14:84:15 | 10 | file://:0:0:0:0 | Integer | +| types.rb:85:1:85:16 | self | file://:0:0:0:0 | Object | +| types.rb:85:1:85:16 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:85:7:85:15 | call to new | types.rb:46:1:50:3 | C3 | +| types.rb:85:7:85:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:85:14:85:15 | 11 | file://:0:0:0:0 | Integer | +| types.rb:87:1:87:16 | self | file://:0:0:0:0 | Object | +| types.rb:87:1:87:16 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:87:7:87:15 | call to new | types.rb:9:1:38:3 | C1 | +| types.rb:87:7:87:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:87:14:87:15 | 12 | file://:0:0:0:0 | Integer | +| types.rb:88:1:88:16 | self | file://:0:0:0:0 | Object | +| types.rb:88:1:88:16 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:88:7:88:15 | call to new | types.rb:40:1:44:3 | C2 | +| types.rb:88:7:88:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:88:14:88:15 | 13 | file://:0:0:0:0 | Integer | +| types.rb:89:1:89:16 | self | file://:0:0:0:0 | Object | +| types.rb:89:1:89:16 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:89:7:89:15 | call to new | types.rb:46:1:50:3 | C3 | +| types.rb:89:7:89:15 | synthetic splat argument | file://:0:0:0:0 | Array | +| types.rb:89:14:89:15 | 14 | file://:0:0:0:0 | Integer | +#select +| types.rb:42:14:42:17 | self | types.rb:42:14:42:17 | self | types.rb:42:14:42:17 | self | $@ | types.rb:42:14:42:17 | self | self | +| types.rb:42:14:42:17 | self | types.rb:87:7:87:15 | call to new : C1 | types.rb:42:14:42:17 | self | $@ | types.rb:87:7:87:15 | call to new : C1 | call to new : C1 | +| types.rb:42:14:42:17 | self | types.rb:88:7:88:15 | call to new : C2 | types.rb:42:14:42:17 | self | $@ | types.rb:88:7:88:15 | call to new : C2 | call to new : C2 | +| types.rb:48:14:48:17 | self | types.rb:48:14:48:17 | self | types.rb:48:14:48:17 | self | $@ | types.rb:48:14:48:17 | self | self | +| types.rb:48:14:48:17 | self | types.rb:87:7:87:15 | call to new : C1 | types.rb:48:14:48:17 | self | $@ | types.rb:87:7:87:15 | call to new : C1 | call to new : C1 | +| types.rb:48:14:48:17 | self | types.rb:89:7:89:15 | call to new : C3 | types.rb:48:14:48:17 | self | $@ | types.rb:89:7:89:15 | call to new : C3 | call to new : C3 | +| types.rb:55:18:55:18 | x | types.rb:21:13:21:16 | self : C1 | types.rb:55:18:55:18 | x | $@ | types.rb:21:13:21:16 | self : C1 | self : C1 | +| types.rb:55:18:55:18 | x | types.rb:71:11:71:18 | call to new : C1 | types.rb:55:18:55:18 | x | $@ | types.rb:71:11:71:18 | call to new : C1 | call to new : C1 | +| types.rb:55:18:55:18 | x | types.rb:73:11:73:18 | call to new : C3 | types.rb:55:18:55:18 | x | $@ | types.rb:73:11:73:18 | call to new : C3 | call to new : C3 | +| types.rb:55:18:55:18 | x | types.rb:75:7:75:14 | call to new : C1 | types.rb:55:18:55:18 | x | $@ | types.rb:75:7:75:14 | call to new : C1 | call to new : C1 | +| types.rb:55:18:55:18 | x | types.rb:77:7:77:14 | call to new : C3 | types.rb:55:18:55:18 | x | $@ | types.rb:77:7:77:14 | call to new : C3 | call to new : C3 | +| types.rb:64:18:64:19 | c3 | types.rb:25:13:25:16 | self : C1 | types.rb:64:18:64:19 | c3 | $@ | types.rb:25:13:25:16 | self : C1 | self : C1 | +| types.rb:64:18:64:19 | c3 | types.rb:79:11:79:18 | call to new : C1 | types.rb:64:18:64:19 | c3 | $@ | types.rb:79:11:79:18 | call to new : C1 | call to new : C1 | +| types.rb:64:18:64:19 | c3 | types.rb:81:11:81:18 | call to new : C3 | types.rb:64:18:64:19 | c3 | $@ | types.rb:81:11:81:18 | call to new : C3 | call to new : C3 | +| types.rb:64:18:64:19 | c3 | types.rb:83:7:83:14 | call to new : C1 | types.rb:64:18:64:19 | c3 | $@ | types.rb:83:7:83:14 | call to new : C1 | call to new : C1 | +| types.rb:64:18:64:19 | c3 | types.rb:85:7:85:15 | call to new : C3 | types.rb:64:18:64:19 | c3 | $@ | types.rb:85:7:85:15 | call to new : C3 | call to new : C3 | diff --git a/ruby/ql/test/library-tests/dataflow/type-flow/Flow.ql b/ruby/ql/test/library-tests/dataflow/type-flow/Flow.ql new file mode 100644 index 00000000000..728db890b4c --- /dev/null +++ b/ruby/ql/test/library-tests/dataflow/type-flow/Flow.ql @@ -0,0 +1,54 @@ +/** + * @kind path-problem + */ + +import codeql.ruby.AST +import codeql.ruby.DataFlow +private import utils.test.InlineFlowTest +private import codeql.ruby.dataflow.internal.DataFlowPrivate +private import codeql.ruby.dataflow.internal.DataFlowDispatch + +query predicate nodeType(DataFlow::Node node, DataFlowType tp) { + tp = getNodeType(node) and + not tp.isUnknown() +} + +private predicate isSource(DataFlow::Node source, string s) { + exists(MethodCall taint, MethodCall new | + taint.getMethodName() = "taint" and + new.getMethodName() = "new" and + source.asExpr().getExpr() = new and + new = taint.getAnArgument() and + s = new.getAnArgument().getConstantValue().toString() + ) + or + exists(SelfVariableAccess self, Module m | + self = source.asExpr().getExpr() and + not self.isSynthesized() and + selfInMethod(self.getVariable(), _, m) and + s = "self(" + m.getQualifiedName() + ")" + ) +} + +private module FlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isSource(source, _) } + + predicate isSink(DataFlow::Node sink) { + exists(MethodCall mc | mc.getMethodName() = "sink" | + sink.asExpr().getExpr() = mc.getAnArgument() + ) + } +} + +bindingset[src, sink] +pragma[inline_late] +string getArgString(DataFlow::Node src, DataFlow::Node sink) { + isSource(src, result) and exists(sink) +} + +import ValueFlowTestArgString +import PathGraph + +from PathNode source, PathNode sink +where flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() diff --git a/ruby/ql/test/library-tests/dataflow/type-flow/types.rb b/ruby/ql/test/library-tests/dataflow/type-flow/types.rb new file mode 100644 index 00000000000..cf4d5bfb78b --- /dev/null +++ b/ruby/ql/test/library-tests/dataflow/type-flow/types.rb @@ -0,0 +1,89 @@ +def taint x + x +end + +def sink x + puts "SINK: #{x.get_field}" +end + +class C1 + @field + + def initialize(x) + @field = x + end + + def get_field + @field + end + + def call_foo + foo(self) + end + + def call_bar + bar(self) + end + + def maybe_sink + end + + def call_maybe_sink + maybe_sink + end + + def call_call_maybe_sink + call_maybe_sink + end +end + +class C2 < C1 + def maybe_sink + sink self # $ hasValueFlow=13 $ hasValueFlow=self(C2) $ SPURIOUS: hasValueFlow=12 + end +end + +class C3 < C1 + def maybe_sink + sink self # $ hasValueFlow=14 $ hasValueFlow=self(C3) $ SPURIOUS: hasValueFlow=12 + end +end + +def foo x + case x + when C3 then + sink(x) # $ hasValueFlow=2 $ hasValueFlow=5 $ hasValueFlow=self(C1) $ SPURIOUS: hasValueFlow=0 $ SPURIOUS: hasValueFlow=3 + case x when C2 then sink(x) # dead code + end + end +end + +def bar x + case x + in C3 => c3 then + sink(c3) # $ hasValueFlow=8 $ hasValueFlow=11 $ hasValueFlow=self(C1) $ SPURIOUS: hasValueFlow=6 $ SPURIOUS: hasValueFlow=9 + case c3 when C2 then sink(c3) # dead code + end + else return + end +end + +foo(taint(C1.new 0)) +foo(taint(C2.new 1)) +foo(taint(C3.new 2)) + +taint(C1.new 3).call_foo +taint(C2.new 4).call_foo +taint(C3.new 5).call_foo + +bar(taint(C1.new 6)) +bar(taint(C2.new 7)) +bar(taint(C3.new 8)) + +taint(C1.new 9).call_bar +taint(C2.new 10).call_bar +taint(C3.new 11).call_bar + +taint(C1.new 12).call_call_maybe_sink +taint(C2.new 13).call_call_maybe_sink +taint(C3.new 14).call_call_maybe_sink diff --git a/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected b/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected index b207b729941..8e2f3114d43 100644 --- a/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected +++ b/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.expected @@ -1,37 +1,37 @@ models edges -| filter_flow.rb:14:5:14:8 | [post] self [@foo] | filter_flow.rb:17:3:18:5 | self in b [@foo] | provenance | | +| filter_flow.rb:14:5:14:8 | [post] self [@foo] | filter_flow.rb:17:3:18:5 | self in b : OneController [@foo] | provenance | | | filter_flow.rb:14:12:14:17 | call to params | filter_flow.rb:14:12:14:23 | ...[...] | provenance | | | filter_flow.rb:14:12:14:23 | ...[...] | filter_flow.rb:14:5:14:8 | [post] self [@foo] | provenance | | -| filter_flow.rb:17:3:18:5 | self in b [@foo] | filter_flow.rb:20:3:22:5 | self in c [@foo] | provenance | | -| filter_flow.rb:20:3:22:5 | self in c [@foo] | filter_flow.rb:21:10:21:13 | self [@foo] | provenance | | -| filter_flow.rb:21:10:21:13 | self [@foo] | filter_flow.rb:21:10:21:13 | @foo | provenance | | -| filter_flow.rb:30:5:30:8 | [post] self [@foo] | filter_flow.rb:33:3:35:5 | self in b [@foo] | provenance | | +| filter_flow.rb:17:3:18:5 | self in b : OneController [@foo] | filter_flow.rb:20:3:22:5 | self in c : OneController [@foo] | provenance | | +| filter_flow.rb:20:3:22:5 | self in c : OneController [@foo] | filter_flow.rb:21:10:21:13 | self : OneController [@foo] | provenance | | +| filter_flow.rb:21:10:21:13 | self : OneController [@foo] | filter_flow.rb:21:10:21:13 | @foo | provenance | | +| filter_flow.rb:30:5:30:8 | [post] self [@foo] | filter_flow.rb:33:3:35:5 | self in b : TwoController [@foo] | provenance | | | filter_flow.rb:30:12:30:17 | call to params | filter_flow.rb:30:12:30:23 | ...[...] | provenance | | | filter_flow.rb:30:12:30:23 | ...[...] | filter_flow.rb:30:5:30:8 | [post] self [@foo] | provenance | | -| filter_flow.rb:33:3:35:5 | self in b [@foo] | filter_flow.rb:37:3:39:5 | self in c [@foo] | provenance | | -| filter_flow.rb:37:3:39:5 | self in c [@foo] | filter_flow.rb:38:10:38:13 | self [@foo] | provenance | | -| filter_flow.rb:38:10:38:13 | self [@foo] | filter_flow.rb:38:10:38:13 | @foo | provenance | | -| filter_flow.rb:47:5:47:8 | [post] self [@foo] | filter_flow.rb:51:3:52:5 | self in b [@foo] | provenance | | +| filter_flow.rb:33:3:35:5 | self in b : TwoController [@foo] | filter_flow.rb:37:3:39:5 | self in c : TwoController [@foo] | provenance | | +| filter_flow.rb:37:3:39:5 | self in c : TwoController [@foo] | filter_flow.rb:38:10:38:13 | self : TwoController [@foo] | provenance | | +| filter_flow.rb:38:10:38:13 | self : TwoController [@foo] | filter_flow.rb:38:10:38:13 | @foo | provenance | | +| filter_flow.rb:47:5:47:8 | [post] self [@foo] | filter_flow.rb:51:3:52:5 | self in b : ThreeController [@foo] | provenance | | | filter_flow.rb:47:12:47:17 | call to params | filter_flow.rb:47:12:47:23 | ...[...] | provenance | | | filter_flow.rb:47:12:47:23 | ...[...] | filter_flow.rb:47:5:47:8 | [post] self [@foo] | provenance | | -| filter_flow.rb:51:3:52:5 | self in b [@foo] | filter_flow.rb:54:3:56:5 | self in c [@foo] | provenance | | -| filter_flow.rb:54:3:56:5 | self in c [@foo] | filter_flow.rb:55:10:55:13 | self [@foo] | provenance | | -| filter_flow.rb:55:10:55:13 | self [@foo] | filter_flow.rb:55:10:55:13 | @foo | provenance | | -| filter_flow.rb:64:5:64:8 | [post] @foo [@bar] | filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] | provenance | | -| filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] | filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] | provenance | | +| filter_flow.rb:51:3:52:5 | self in b : ThreeController [@foo] | filter_flow.rb:54:3:56:5 | self in c : ThreeController [@foo] | provenance | | +| filter_flow.rb:54:3:56:5 | self in c : ThreeController [@foo] | filter_flow.rb:55:10:55:13 | self : ThreeController [@foo] | provenance | | +| filter_flow.rb:55:10:55:13 | self : ThreeController [@foo] | filter_flow.rb:55:10:55:13 | @foo | provenance | | +| filter_flow.rb:64:5:64:8 | [post] @foo [@bar] | filter_flow.rb:64:5:64:8 | [post] self : FourController [@foo, @bar] | provenance | | +| filter_flow.rb:64:5:64:8 | [post] self : FourController [@foo, @bar] | filter_flow.rb:67:3:68:5 | self in b : FourController [@foo, @bar] | provenance | | | filter_flow.rb:64:16:64:21 | call to params | filter_flow.rb:64:16:64:27 | ...[...] | provenance | | | filter_flow.rb:64:16:64:27 | ...[...] | filter_flow.rb:64:5:64:8 | [post] @foo [@bar] | provenance | | -| filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] | filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] | provenance | | -| filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] | filter_flow.rb:71:10:71:13 | self [@foo, @bar] | provenance | | +| filter_flow.rb:67:3:68:5 | self in b : FourController [@foo, @bar] | filter_flow.rb:70:3:72:5 | self in c : FourController [@foo, @bar] | provenance | | +| filter_flow.rb:70:3:72:5 | self in c : FourController [@foo, @bar] | filter_flow.rb:71:10:71:13 | self : FourController [@foo, @bar] | provenance | | | filter_flow.rb:71:10:71:13 | @foo [@bar] | filter_flow.rb:71:10:71:17 | call to bar | provenance | | -| filter_flow.rb:71:10:71:13 | self [@foo, @bar] | filter_flow.rb:71:10:71:13 | @foo [@bar] | provenance | | -| filter_flow.rb:80:5:80:8 | [post] self [@foo] | filter_flow.rb:83:3:84:5 | self in b [@foo] | provenance | | -| filter_flow.rb:83:3:84:5 | self in b [@foo] | filter_flow.rb:86:3:88:5 | self in c [@foo] | provenance | | -| filter_flow.rb:86:3:88:5 | self in c [@foo] | filter_flow.rb:87:11:87:14 | self [@foo] | provenance | | -| filter_flow.rb:87:11:87:14 | self [@foo] | filter_flow.rb:87:11:87:14 | @foo | provenance | | -| filter_flow.rb:90:3:92:5 | self in taint_foo [Return] [@foo] | filter_flow.rb:80:5:80:8 | [post] self [@foo] | provenance | | -| filter_flow.rb:91:5:91:8 | [post] self [@foo] | filter_flow.rb:90:3:92:5 | self in taint_foo [Return] [@foo] | provenance | | +| filter_flow.rb:71:10:71:13 | self : FourController [@foo, @bar] | filter_flow.rb:71:10:71:13 | @foo [@bar] | provenance | | +| filter_flow.rb:80:5:80:8 | [post] self : FiveController [@foo] | filter_flow.rb:83:3:84:5 | self in b : FiveController [@foo] | provenance | | +| filter_flow.rb:83:3:84:5 | self in b : FiveController [@foo] | filter_flow.rb:86:3:88:5 | self in c : FiveController [@foo] | provenance | | +| filter_flow.rb:86:3:88:5 | self in c : FiveController [@foo] | filter_flow.rb:87:11:87:14 | self : FiveController [@foo] | provenance | | +| filter_flow.rb:87:11:87:14 | self : FiveController [@foo] | filter_flow.rb:87:11:87:14 | @foo | provenance | | +| filter_flow.rb:90:3:92:5 | self in taint_foo [Return] : FiveController [@foo] | filter_flow.rb:80:5:80:8 | [post] self : FiveController [@foo] | provenance | | +| filter_flow.rb:91:5:91:8 | [post] self [@foo] | filter_flow.rb:90:3:92:5 | self in taint_foo [Return] : FiveController [@foo] | provenance | | | filter_flow.rb:91:12:91:17 | call to params | filter_flow.rb:91:12:91:23 | ...[...] | provenance | | | filter_flow.rb:91:12:91:23 | ...[...] | filter_flow.rb:91:5:91:8 | [post] self [@foo] | provenance | | | params_flow.rb:3:10:3:15 | call to params | params_flow.rb:3:10:3:19 | ...[...] | provenance | | @@ -69,9 +69,9 @@ edges | params_flow.rb:126:10:126:15 | call to params | params_flow.rb:126:10:126:30 | call to merge! | provenance | | | params_flow.rb:127:24:127:29 | call to params | params_flow.rb:127:10:127:30 | call to merge! | provenance | | | params_flow.rb:130:5:130:5 | [post] p | params_flow.rb:131:10:131:10 | p | provenance | | -| params_flow.rb:130:5:130:5 | [post] p [element 0] | params_flow.rb:131:10:131:10 | p | provenance | | +| params_flow.rb:130:5:130:5 | [post] p : Array [element 0] | params_flow.rb:131:10:131:10 | p | provenance | | | params_flow.rb:130:14:130:19 | call to params | params_flow.rb:130:5:130:5 | [post] p | provenance | | -| params_flow.rb:130:14:130:19 | call to params | params_flow.rb:130:5:130:5 | [post] p [element 0] | provenance | | +| params_flow.rb:130:14:130:19 | call to params | params_flow.rb:130:5:130:5 | [post] p : Array [element 0] | provenance | | | params_flow.rb:135:10:135:15 | call to params | params_flow.rb:135:10:135:38 | call to reverse_merge! | provenance | | | params_flow.rb:136:32:136:37 | call to params | params_flow.rb:136:10:136:38 | call to reverse_merge! | provenance | | | params_flow.rb:139:5:139:5 | [post] p | params_flow.rb:140:10:140:10 | p | provenance | | @@ -109,39 +109,39 @@ nodes | filter_flow.rb:14:5:14:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | filter_flow.rb:14:12:14:17 | call to params | semmle.label | call to params | | filter_flow.rb:14:12:14:23 | ...[...] | semmle.label | ...[...] | -| filter_flow.rb:17:3:18:5 | self in b [@foo] | semmle.label | self in b [@foo] | -| filter_flow.rb:20:3:22:5 | self in c [@foo] | semmle.label | self in c [@foo] | +| filter_flow.rb:17:3:18:5 | self in b : OneController [@foo] | semmle.label | self in b : OneController [@foo] | +| filter_flow.rb:20:3:22:5 | self in c : OneController [@foo] | semmle.label | self in c : OneController [@foo] | | filter_flow.rb:21:10:21:13 | @foo | semmle.label | @foo | -| filter_flow.rb:21:10:21:13 | self [@foo] | semmle.label | self [@foo] | +| filter_flow.rb:21:10:21:13 | self : OneController [@foo] | semmle.label | self : OneController [@foo] | | filter_flow.rb:30:5:30:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | filter_flow.rb:30:12:30:17 | call to params | semmle.label | call to params | | filter_flow.rb:30:12:30:23 | ...[...] | semmle.label | ...[...] | -| filter_flow.rb:33:3:35:5 | self in b [@foo] | semmle.label | self in b [@foo] | -| filter_flow.rb:37:3:39:5 | self in c [@foo] | semmle.label | self in c [@foo] | +| filter_flow.rb:33:3:35:5 | self in b : TwoController [@foo] | semmle.label | self in b : TwoController [@foo] | +| filter_flow.rb:37:3:39:5 | self in c : TwoController [@foo] | semmle.label | self in c : TwoController [@foo] | | filter_flow.rb:38:10:38:13 | @foo | semmle.label | @foo | -| filter_flow.rb:38:10:38:13 | self [@foo] | semmle.label | self [@foo] | +| filter_flow.rb:38:10:38:13 | self : TwoController [@foo] | semmle.label | self : TwoController [@foo] | | filter_flow.rb:47:5:47:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | filter_flow.rb:47:12:47:17 | call to params | semmle.label | call to params | | filter_flow.rb:47:12:47:23 | ...[...] | semmle.label | ...[...] | -| filter_flow.rb:51:3:52:5 | self in b [@foo] | semmle.label | self in b [@foo] | -| filter_flow.rb:54:3:56:5 | self in c [@foo] | semmle.label | self in c [@foo] | +| filter_flow.rb:51:3:52:5 | self in b : ThreeController [@foo] | semmle.label | self in b : ThreeController [@foo] | +| filter_flow.rb:54:3:56:5 | self in c : ThreeController [@foo] | semmle.label | self in c : ThreeController [@foo] | | filter_flow.rb:55:10:55:13 | @foo | semmle.label | @foo | -| filter_flow.rb:55:10:55:13 | self [@foo] | semmle.label | self [@foo] | +| filter_flow.rb:55:10:55:13 | self : ThreeController [@foo] | semmle.label | self : ThreeController [@foo] | | filter_flow.rb:64:5:64:8 | [post] @foo [@bar] | semmle.label | [post] @foo [@bar] | -| filter_flow.rb:64:5:64:8 | [post] self [@foo, @bar] | semmle.label | [post] self [@foo, @bar] | +| filter_flow.rb:64:5:64:8 | [post] self : FourController [@foo, @bar] | semmle.label | [post] self : FourController [@foo, @bar] | | filter_flow.rb:64:16:64:21 | call to params | semmle.label | call to params | | filter_flow.rb:64:16:64:27 | ...[...] | semmle.label | ...[...] | -| filter_flow.rb:67:3:68:5 | self in b [@foo, @bar] | semmle.label | self in b [@foo, @bar] | -| filter_flow.rb:70:3:72:5 | self in c [@foo, @bar] | semmle.label | self in c [@foo, @bar] | +| filter_flow.rb:67:3:68:5 | self in b : FourController [@foo, @bar] | semmle.label | self in b : FourController [@foo, @bar] | +| filter_flow.rb:70:3:72:5 | self in c : FourController [@foo, @bar] | semmle.label | self in c : FourController [@foo, @bar] | | filter_flow.rb:71:10:71:13 | @foo [@bar] | semmle.label | @foo [@bar] | -| filter_flow.rb:71:10:71:13 | self [@foo, @bar] | semmle.label | self [@foo, @bar] | +| filter_flow.rb:71:10:71:13 | self : FourController [@foo, @bar] | semmle.label | self : FourController [@foo, @bar] | | filter_flow.rb:71:10:71:17 | call to bar | semmle.label | call to bar | -| filter_flow.rb:80:5:80:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | -| filter_flow.rb:83:3:84:5 | self in b [@foo] | semmle.label | self in b [@foo] | -| filter_flow.rb:86:3:88:5 | self in c [@foo] | semmle.label | self in c [@foo] | +| filter_flow.rb:80:5:80:8 | [post] self : FiveController [@foo] | semmle.label | [post] self : FiveController [@foo] | +| filter_flow.rb:83:3:84:5 | self in b : FiveController [@foo] | semmle.label | self in b : FiveController [@foo] | +| filter_flow.rb:86:3:88:5 | self in c : FiveController [@foo] | semmle.label | self in c : FiveController [@foo] | | filter_flow.rb:87:11:87:14 | @foo | semmle.label | @foo | -| filter_flow.rb:87:11:87:14 | self [@foo] | semmle.label | self [@foo] | -| filter_flow.rb:90:3:92:5 | self in taint_foo [Return] [@foo] | semmle.label | self in taint_foo [Return] [@foo] | +| filter_flow.rb:87:11:87:14 | self : FiveController [@foo] | semmle.label | self : FiveController [@foo] | +| filter_flow.rb:90:3:92:5 | self in taint_foo [Return] : FiveController [@foo] | semmle.label | self in taint_foo [Return] : FiveController [@foo] | | filter_flow.rb:91:5:91:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | filter_flow.rb:91:12:91:17 | call to params | semmle.label | call to params | | filter_flow.rb:91:12:91:23 | ...[...] | semmle.label | ...[...] | @@ -214,7 +214,7 @@ nodes | params_flow.rb:127:10:127:30 | call to merge! | semmle.label | call to merge! | | params_flow.rb:127:24:127:29 | call to params | semmle.label | call to params | | params_flow.rb:130:5:130:5 | [post] p | semmle.label | [post] p | -| params_flow.rb:130:5:130:5 | [post] p [element 0] | semmle.label | [post] p [element 0] | +| params_flow.rb:130:5:130:5 | [post] p : Array [element 0] | semmle.label | [post] p : Array [element 0] | | params_flow.rb:130:14:130:19 | call to params | semmle.label | call to params | | params_flow.rb:131:10:131:10 | p | semmle.label | p | | params_flow.rb:135:10:135:15 | call to params | semmle.label | call to params | diff --git a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected index bdca6b359ac..3ebd5e56670 100644 --- a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected +++ b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected @@ -1,53 +1,53 @@ models edges -| active_support.rb:180:5:180:5 | x [element 0] | active_support.rb:181:9:181:9 | x [element 0] | provenance | | -| active_support.rb:180:9:180:18 | call to [] [element 0] | active_support.rb:180:5:180:5 | x [element 0] | provenance | | -| active_support.rb:180:10:180:17 | call to source | active_support.rb:180:9:180:18 | call to [] [element 0] | provenance | | -| active_support.rb:181:5:181:5 | y [element] | active_support.rb:182:10:182:10 | y [element] | provenance | | -| active_support.rb:181:9:181:9 | x [element 0] | active_support.rb:181:9:181:23 | call to compact_blank [element] | provenance | | -| active_support.rb:181:9:181:23 | call to compact_blank [element] | active_support.rb:181:5:181:5 | y [element] | provenance | | -| active_support.rb:182:10:182:10 | y [element] | active_support.rb:182:10:182:13 | ...[...] | provenance | | -| active_support.rb:186:5:186:5 | x [element 0] | active_support.rb:187:9:187:9 | x [element 0] | provenance | | -| active_support.rb:186:9:186:22 | call to [] [element 0] | active_support.rb:186:5:186:5 | x [element 0] | provenance | | -| active_support.rb:186:10:186:18 | call to source | active_support.rb:186:9:186:22 | call to [] [element 0] | provenance | | -| active_support.rb:187:5:187:5 | y [element] | active_support.rb:188:10:188:10 | y [element] | provenance | | -| active_support.rb:187:9:187:9 | x [element 0] | active_support.rb:187:9:187:21 | call to excluding [element] | provenance | | -| active_support.rb:187:9:187:21 | call to excluding [element] | active_support.rb:187:5:187:5 | y [element] | provenance | | -| active_support.rb:188:10:188:10 | y [element] | active_support.rb:188:10:188:13 | ...[...] | provenance | | -| active_support.rb:192:5:192:5 | x [element 0] | active_support.rb:193:9:193:9 | x [element 0] | provenance | | -| active_support.rb:192:9:192:22 | call to [] [element 0] | active_support.rb:192:5:192:5 | x [element 0] | provenance | | -| active_support.rb:192:10:192:18 | call to source | active_support.rb:192:9:192:22 | call to [] [element 0] | provenance | | -| active_support.rb:193:5:193:5 | y [element] | active_support.rb:194:10:194:10 | y [element] | provenance | | -| active_support.rb:193:9:193:9 | x [element 0] | active_support.rb:193:9:193:19 | call to without [element] | provenance | | -| active_support.rb:193:9:193:19 | call to without [element] | active_support.rb:193:5:193:5 | y [element] | provenance | | -| active_support.rb:194:10:194:10 | y [element] | active_support.rb:194:10:194:13 | ...[...] | provenance | | -| active_support.rb:198:5:198:5 | x [element 0] | active_support.rb:199:9:199:9 | x [element 0] | provenance | | -| active_support.rb:198:9:198:22 | call to [] [element 0] | active_support.rb:198:5:198:5 | x [element 0] | provenance | | -| active_support.rb:198:10:198:18 | call to source | active_support.rb:198:9:198:22 | call to [] [element 0] | provenance | | -| active_support.rb:199:5:199:5 | y [element] | active_support.rb:200:10:200:10 | y [element] | provenance | | -| active_support.rb:199:9:199:9 | x [element 0] | active_support.rb:199:9:199:37 | call to in_order_of [element] | provenance | | -| active_support.rb:199:9:199:37 | call to in_order_of [element] | active_support.rb:199:5:199:5 | y [element] | provenance | | -| active_support.rb:200:10:200:10 | y [element] | active_support.rb:200:10:200:13 | ...[...] | provenance | | -| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:205:9:205:9 | a [element 0] | provenance | | -| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:206:10:206:10 | a [element 0] | provenance | | -| active_support.rb:204:9:204:22 | call to [] [element 0] | active_support.rb:204:5:204:5 | a [element 0] | provenance | | -| active_support.rb:204:10:204:18 | call to source | active_support.rb:204:9:204:22 | call to [] [element 0] | provenance | | -| active_support.rb:205:5:205:5 | b [element 0] | active_support.rb:208:10:208:10 | b [element 0] | provenance | | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:208:10:208:10 | b [element] | provenance | | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:209:10:209:10 | b [element] | provenance | | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:210:10:210:10 | b [element] | provenance | | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:211:10:211:10 | b [element] | provenance | | -| active_support.rb:205:9:205:9 | a [element 0] | active_support.rb:205:9:205:41 | call to including [element 0] | provenance | | -| active_support.rb:205:9:205:41 | call to including [element 0] | active_support.rb:205:5:205:5 | b [element 0] | provenance | | -| active_support.rb:205:9:205:41 | call to including [element] | active_support.rb:205:5:205:5 | b [element] | provenance | | -| active_support.rb:205:21:205:29 | call to source | active_support.rb:205:9:205:41 | call to including [element] | provenance | | -| active_support.rb:205:32:205:40 | call to source | active_support.rb:205:9:205:41 | call to including [element] | provenance | | -| active_support.rb:206:10:206:10 | a [element 0] | active_support.rb:206:10:206:13 | ...[...] | provenance | | -| active_support.rb:208:10:208:10 | b [element 0] | active_support.rb:208:10:208:13 | ...[...] | provenance | | -| active_support.rb:208:10:208:10 | b [element] | active_support.rb:208:10:208:13 | ...[...] | provenance | | -| active_support.rb:209:10:209:10 | b [element] | active_support.rb:209:10:209:13 | ...[...] | provenance | | -| active_support.rb:210:10:210:10 | b [element] | active_support.rb:210:10:210:13 | ...[...] | provenance | | -| active_support.rb:211:10:211:10 | b [element] | active_support.rb:211:10:211:13 | ...[...] | provenance | | +| active_support.rb:180:5:180:5 | x : Array [element 0] | active_support.rb:181:9:181:9 | x : Array [element 0] | provenance | | +| active_support.rb:180:9:180:18 | call to [] : Array [element 0] | active_support.rb:180:5:180:5 | x : Array [element 0] | provenance | | +| active_support.rb:180:10:180:17 | call to source | active_support.rb:180:9:180:18 | call to [] : Array [element 0] | provenance | | +| active_support.rb:181:5:181:5 | y : [collection] [element] | active_support.rb:182:10:182:10 | y : [collection] [element] | provenance | | +| active_support.rb:181:9:181:9 | x : Array [element 0] | active_support.rb:181:9:181:23 | call to compact_blank : [collection] [element] | provenance | | +| active_support.rb:181:9:181:23 | call to compact_blank : [collection] [element] | active_support.rb:181:5:181:5 | y : [collection] [element] | provenance | | +| active_support.rb:182:10:182:10 | y : [collection] [element] | active_support.rb:182:10:182:13 | ...[...] | provenance | | +| active_support.rb:186:5:186:5 | x : Array [element 0] | active_support.rb:187:9:187:9 | x : Array [element 0] | provenance | | +| active_support.rb:186:9:186:22 | call to [] : Array [element 0] | active_support.rb:186:5:186:5 | x : Array [element 0] | provenance | | +| active_support.rb:186:10:186:18 | call to source | active_support.rb:186:9:186:22 | call to [] : Array [element 0] | provenance | | +| active_support.rb:187:5:187:5 | y : [collection] [element] | active_support.rb:188:10:188:10 | y : [collection] [element] | provenance | | +| active_support.rb:187:9:187:9 | x : Array [element 0] | active_support.rb:187:9:187:21 | call to excluding : [collection] [element] | provenance | | +| active_support.rb:187:9:187:21 | call to excluding : [collection] [element] | active_support.rb:187:5:187:5 | y : [collection] [element] | provenance | | +| active_support.rb:188:10:188:10 | y : [collection] [element] | active_support.rb:188:10:188:13 | ...[...] | provenance | | +| active_support.rb:192:5:192:5 | x : Array [element 0] | active_support.rb:193:9:193:9 | x : Array [element 0] | provenance | | +| active_support.rb:192:9:192:22 | call to [] : Array [element 0] | active_support.rb:192:5:192:5 | x : Array [element 0] | provenance | | +| active_support.rb:192:10:192:18 | call to source | active_support.rb:192:9:192:22 | call to [] : Array [element 0] | provenance | | +| active_support.rb:193:5:193:5 | y : [collection] [element] | active_support.rb:194:10:194:10 | y : [collection] [element] | provenance | | +| active_support.rb:193:9:193:9 | x : Array [element 0] | active_support.rb:193:9:193:19 | call to without : [collection] [element] | provenance | | +| active_support.rb:193:9:193:19 | call to without : [collection] [element] | active_support.rb:193:5:193:5 | y : [collection] [element] | provenance | | +| active_support.rb:194:10:194:10 | y : [collection] [element] | active_support.rb:194:10:194:13 | ...[...] | provenance | | +| active_support.rb:198:5:198:5 | x : Array [element 0] | active_support.rb:199:9:199:9 | x : Array [element 0] | provenance | | +| active_support.rb:198:9:198:22 | call to [] : Array [element 0] | active_support.rb:198:5:198:5 | x : Array [element 0] | provenance | | +| active_support.rb:198:10:198:18 | call to source | active_support.rb:198:9:198:22 | call to [] : Array [element 0] | provenance | | +| active_support.rb:199:5:199:5 | y : [collection] [element] | active_support.rb:200:10:200:10 | y : [collection] [element] | provenance | | +| active_support.rb:199:9:199:9 | x : Array [element 0] | active_support.rb:199:9:199:37 | call to in_order_of : [collection] [element] | provenance | | +| active_support.rb:199:9:199:37 | call to in_order_of : [collection] [element] | active_support.rb:199:5:199:5 | y : [collection] [element] | provenance | | +| active_support.rb:200:10:200:10 | y : [collection] [element] | active_support.rb:200:10:200:13 | ...[...] | provenance | | +| active_support.rb:204:5:204:5 | a : Array [element 0] | active_support.rb:205:9:205:9 | a : Array [element 0] | provenance | | +| active_support.rb:204:5:204:5 | a : Array [element 0] | active_support.rb:206:10:206:10 | a : Array [element 0] | provenance | | +| active_support.rb:204:9:204:22 | call to [] : Array [element 0] | active_support.rb:204:5:204:5 | a : Array [element 0] | provenance | | +| active_support.rb:204:10:204:18 | call to source | active_support.rb:204:9:204:22 | call to [] : Array [element 0] | provenance | | +| active_support.rb:205:5:205:5 | b : [collection] [element 0] | active_support.rb:208:10:208:10 | b : [collection] [element 0] | provenance | | +| active_support.rb:205:5:205:5 | b : [collection] [element] | active_support.rb:208:10:208:10 | b : [collection] [element] | provenance | | +| active_support.rb:205:5:205:5 | b : [collection] [element] | active_support.rb:209:10:209:10 | b : [collection] [element] | provenance | | +| active_support.rb:205:5:205:5 | b : [collection] [element] | active_support.rb:210:10:210:10 | b : [collection] [element] | provenance | | +| active_support.rb:205:5:205:5 | b : [collection] [element] | active_support.rb:211:10:211:10 | b : [collection] [element] | provenance | | +| active_support.rb:205:9:205:9 | a : Array [element 0] | active_support.rb:205:9:205:41 | call to including : [collection] [element 0] | provenance | | +| active_support.rb:205:9:205:41 | call to including : [collection] [element 0] | active_support.rb:205:5:205:5 | b : [collection] [element 0] | provenance | | +| active_support.rb:205:9:205:41 | call to including : [collection] [element] | active_support.rb:205:5:205:5 | b : [collection] [element] | provenance | | +| active_support.rb:205:21:205:29 | call to source | active_support.rb:205:9:205:41 | call to including : [collection] [element] | provenance | | +| active_support.rb:205:32:205:40 | call to source | active_support.rb:205:9:205:41 | call to including : [collection] [element] | provenance | | +| active_support.rb:206:10:206:10 | a : Array [element 0] | active_support.rb:206:10:206:13 | ...[...] | provenance | | +| active_support.rb:208:10:208:10 | b : [collection] [element 0] | active_support.rb:208:10:208:13 | ...[...] | provenance | | +| active_support.rb:208:10:208:10 | b : [collection] [element] | active_support.rb:208:10:208:13 | ...[...] | provenance | | +| active_support.rb:209:10:209:10 | b : [collection] [element] | active_support.rb:209:10:209:13 | ...[...] | provenance | | +| active_support.rb:210:10:210:10 | b : [collection] [element] | active_support.rb:210:10:210:13 | ...[...] | provenance | | +| active_support.rb:211:10:211:10 | b : [collection] [element] | active_support.rb:211:10:211:13 | ...[...] | provenance | | | active_support.rb:282:3:282:3 | x | active_support.rb:283:8:283:8 | x | provenance | | | active_support.rb:282:7:282:16 | call to source | active_support.rb:282:3:282:3 | x | provenance | | | active_support.rb:283:8:283:8 | x | active_support.rb:283:8:283:17 | call to presence | provenance | | @@ -57,238 +57,238 @@ edges | active_support.rb:290:3:290:3 | x | active_support.rb:291:8:291:8 | x | provenance | | | active_support.rb:290:7:290:16 | call to source | active_support.rb:290:3:290:3 | x | provenance | | | active_support.rb:291:8:291:8 | x | active_support.rb:291:8:291:17 | call to deep_dup | provenance | | -| hash_extensions.rb:2:5:2:5 | h [element :a] | hash_extensions.rb:3:9:3:9 | h [element :a] | provenance | | -| hash_extensions.rb:2:9:2:26 | call to [] [element :a] | hash_extensions.rb:2:5:2:5 | h [element :a] | provenance | | -| hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:9:2:26 | call to [] [element :a] | provenance | | -| hash_extensions.rb:3:5:3:5 | x [element :a] | hash_extensions.rb:4:10:4:10 | x [element :a] | provenance | | -| hash_extensions.rb:3:9:3:9 | h [element :a] | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element :a] | provenance | | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element :a] | hash_extensions.rb:3:5:3:5 | x [element :a] | provenance | | -| hash_extensions.rb:4:10:4:10 | x [element :a] | hash_extensions.rb:4:10:4:15 | ...[...] | provenance | | -| hash_extensions.rb:10:5:10:5 | h [element a] | hash_extensions.rb:11:9:11:9 | h [element a] | provenance | | -| hash_extensions.rb:10:9:10:30 | call to [] [element a] | hash_extensions.rb:10:5:10:5 | h [element a] | provenance | | -| hash_extensions.rb:10:18:10:28 | call to source | hash_extensions.rb:10:9:10:30 | call to [] [element a] | provenance | | -| hash_extensions.rb:11:5:11:5 | x [element a] | hash_extensions.rb:12:10:12:10 | x [element a] | provenance | | -| hash_extensions.rb:11:9:11:9 | h [element a] | hash_extensions.rb:11:9:11:20 | call to to_options [element a] | provenance | | -| hash_extensions.rb:11:9:11:20 | call to to_options [element a] | hash_extensions.rb:11:5:11:5 | x [element a] | provenance | | -| hash_extensions.rb:12:10:12:10 | x [element a] | hash_extensions.rb:12:10:12:14 | ...[...] | provenance | | -| hash_extensions.rb:18:5:18:5 | h [element a] | hash_extensions.rb:19:9:19:9 | h [element a] | provenance | | -| hash_extensions.rb:18:9:18:30 | call to [] [element a] | hash_extensions.rb:18:5:18:5 | h [element a] | provenance | | -| hash_extensions.rb:18:18:18:28 | call to source | hash_extensions.rb:18:9:18:30 | call to [] [element a] | provenance | | -| hash_extensions.rb:19:5:19:5 | x [element a] | hash_extensions.rb:20:10:20:10 | x [element a] | provenance | | -| hash_extensions.rb:19:9:19:9 | h [element a] | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element a] | provenance | | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element a] | hash_extensions.rb:19:5:19:5 | x [element a] | provenance | | -| hash_extensions.rb:20:10:20:10 | x [element a] | hash_extensions.rb:20:10:20:14 | ...[...] | provenance | | -| hash_extensions.rb:26:5:26:5 | h [element :a] | hash_extensions.rb:27:9:27:9 | h [element :a] | provenance | | -| hash_extensions.rb:26:9:26:26 | call to [] [element :a] | hash_extensions.rb:26:5:26:5 | h [element :a] | provenance | | -| hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:9:26:26 | call to [] [element :a] | provenance | | -| hash_extensions.rb:27:5:27:5 | x [element :a] | hash_extensions.rb:28:10:28:10 | x [element :a] | provenance | | -| hash_extensions.rb:27:9:27:9 | h [element :a] | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element :a] | provenance | | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element :a] | hash_extensions.rb:27:5:27:5 | x [element :a] | provenance | | -| hash_extensions.rb:28:10:28:10 | x [element :a] | hash_extensions.rb:28:10:28:15 | ...[...] | provenance | | -| hash_extensions.rb:34:5:34:5 | h [element a] | hash_extensions.rb:35:9:35:9 | h [element a] | provenance | | -| hash_extensions.rb:34:9:34:30 | call to [] [element a] | hash_extensions.rb:34:5:34:5 | h [element a] | provenance | | -| hash_extensions.rb:34:18:34:28 | call to source | hash_extensions.rb:34:9:34:30 | call to [] [element a] | provenance | | -| hash_extensions.rb:35:5:35:5 | x [element a] | hash_extensions.rb:36:10:36:10 | x [element a] | provenance | | -| hash_extensions.rb:35:9:35:9 | h [element a] | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element a] | provenance | | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element a] | hash_extensions.rb:35:5:35:5 | x [element a] | provenance | | -| hash_extensions.rb:36:10:36:10 | x [element a] | hash_extensions.rb:36:10:36:14 | ...[...] | provenance | | -| hash_extensions.rb:42:5:42:5 | h [element :a] | hash_extensions.rb:43:9:43:9 | h [element :a] | provenance | | -| hash_extensions.rb:42:9:42:26 | call to [] [element :a] | hash_extensions.rb:42:5:42:5 | h [element :a] | provenance | | -| hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:9:42:26 | call to [] [element :a] | provenance | | -| hash_extensions.rb:43:5:43:5 | x [element :a] | hash_extensions.rb:44:10:44:10 | x [element :a] | provenance | | -| hash_extensions.rb:43:9:43:9 | h [element :a] | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element :a] | provenance | | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element :a] | hash_extensions.rb:43:5:43:5 | x [element :a] | provenance | | -| hash_extensions.rb:44:10:44:10 | x [element :a] | hash_extensions.rb:44:10:44:15 | ...[...] | provenance | | -| hash_extensions.rb:50:5:50:5 | h [element :a] | hash_extensions.rb:51:9:51:9 | h [element :a] | provenance | | -| hash_extensions.rb:50:5:50:5 | h [element :b] | hash_extensions.rb:51:9:51:9 | h [element :b] | provenance | | -| hash_extensions.rb:50:5:50:5 | h [element :d] | hash_extensions.rb:51:9:51:9 | h [element :d] | provenance | | -| hash_extensions.rb:50:9:50:63 | call to [] [element :a] | hash_extensions.rb:50:5:50:5 | h [element :a] | provenance | | -| hash_extensions.rb:50:9:50:63 | call to [] [element :b] | hash_extensions.rb:50:5:50:5 | h [element :b] | provenance | | -| hash_extensions.rb:50:9:50:63 | call to [] [element :d] | hash_extensions.rb:50:5:50:5 | h [element :d] | provenance | | -| hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] [element :a] | provenance | | -| hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] [element :b] | provenance | | -| hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] [element :d] | provenance | | -| hash_extensions.rb:51:5:51:5 | x [element :a] | hash_extensions.rb:58:10:58:10 | x [element :a] | provenance | | -| hash_extensions.rb:51:5:51:5 | x [element :b] | hash_extensions.rb:59:10:59:10 | x [element :b] | provenance | | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | hash_extensions.rb:56:10:56:10 | h [element :d] | provenance | | -| hash_extensions.rb:51:9:51:9 | h [element :a] | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | provenance | | -| hash_extensions.rb:51:9:51:9 | h [element :b] | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | provenance | | -| hash_extensions.rb:51:9:51:9 | h [element :d] | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | provenance | | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | hash_extensions.rb:51:5:51:5 | x [element :a] | provenance | | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | hash_extensions.rb:51:5:51:5 | x [element :b] | provenance | | -| hash_extensions.rb:56:10:56:10 | h [element :d] | hash_extensions.rb:56:10:56:14 | ...[...] | provenance | | -| hash_extensions.rb:58:10:58:10 | x [element :a] | hash_extensions.rb:58:10:58:14 | ...[...] | provenance | | -| hash_extensions.rb:59:10:59:10 | x [element :b] | hash_extensions.rb:59:10:59:14 | ...[...] | provenance | | -| hash_extensions.rb:67:5:67:10 | values [element 0] | hash_extensions.rb:68:9:68:14 | values [element 0] | provenance | | -| hash_extensions.rb:67:5:67:10 | values [element 1] | hash_extensions.rb:68:9:68:14 | values [element 1] | provenance | | -| hash_extensions.rb:67:5:67:10 | values [element 2] | hash_extensions.rb:68:9:68:14 | values [element 2] | provenance | | -| hash_extensions.rb:67:14:67:52 | call to [] [element 0] | hash_extensions.rb:67:5:67:10 | values [element 0] | provenance | | -| hash_extensions.rb:67:14:67:52 | call to [] [element 1] | hash_extensions.rb:67:5:67:10 | values [element 1] | provenance | | -| hash_extensions.rb:67:14:67:52 | call to [] [element 2] | hash_extensions.rb:67:5:67:10 | values [element 2] | provenance | | -| hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:14:67:52 | call to [] [element 0] | provenance | | -| hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:14:67:52 | call to [] [element 1] | provenance | | -| hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:14:67:52 | call to [] [element 2] | provenance | | -| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:73:10:73:10 | h [element] | provenance | | -| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:74:10:74:10 | h [element] | provenance | | -| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | provenance | | -| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:29:68:33 | value | provenance | | -| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | provenance | | -| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:29:68:33 | value | provenance | | -| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | provenance | | -| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:29:68:33 | value | provenance | | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] | hash_extensions.rb:68:5:68:5 | h [element] | provenance | | +| hash_extensions.rb:2:5:2:5 | h : Hash [element :a] | hash_extensions.rb:3:9:3:9 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:2:9:2:26 | call to [] : Hash [element :a] | hash_extensions.rb:2:5:2:5 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:9:2:26 | call to [] : Hash [element :a] | provenance | | +| hash_extensions.rb:3:5:3:5 | x : Hash [element :a] | hash_extensions.rb:4:10:4:10 | x : Hash [element :a] | provenance | | +| hash_extensions.rb:3:9:3:9 | h : Hash [element :a] | hash_extensions.rb:3:9:3:24 | call to stringify_keys : Hash [element :a] | provenance | | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys : Hash [element :a] | hash_extensions.rb:3:5:3:5 | x : Hash [element :a] | provenance | | +| hash_extensions.rb:4:10:4:10 | x : Hash [element :a] | hash_extensions.rb:4:10:4:15 | ...[...] | provenance | | +| hash_extensions.rb:10:5:10:5 | h : Hash [element a] | hash_extensions.rb:11:9:11:9 | h : Hash [element a] | provenance | | +| hash_extensions.rb:10:9:10:30 | call to [] : Hash [element a] | hash_extensions.rb:10:5:10:5 | h : Hash [element a] | provenance | | +| hash_extensions.rb:10:18:10:28 | call to source | hash_extensions.rb:10:9:10:30 | call to [] : Hash [element a] | provenance | | +| hash_extensions.rb:11:5:11:5 | x : Hash [element a] | hash_extensions.rb:12:10:12:10 | x : Hash [element a] | provenance | | +| hash_extensions.rb:11:9:11:9 | h : Hash [element a] | hash_extensions.rb:11:9:11:20 | call to to_options : Hash [element a] | provenance | | +| hash_extensions.rb:11:9:11:20 | call to to_options : Hash [element a] | hash_extensions.rb:11:5:11:5 | x : Hash [element a] | provenance | | +| hash_extensions.rb:12:10:12:10 | x : Hash [element a] | hash_extensions.rb:12:10:12:14 | ...[...] | provenance | | +| hash_extensions.rb:18:5:18:5 | h : Hash [element a] | hash_extensions.rb:19:9:19:9 | h : Hash [element a] | provenance | | +| hash_extensions.rb:18:9:18:30 | call to [] : Hash [element a] | hash_extensions.rb:18:5:18:5 | h : Hash [element a] | provenance | | +| hash_extensions.rb:18:18:18:28 | call to source | hash_extensions.rb:18:9:18:30 | call to [] : Hash [element a] | provenance | | +| hash_extensions.rb:19:5:19:5 | x : Hash [element a] | hash_extensions.rb:20:10:20:10 | x : Hash [element a] | provenance | | +| hash_extensions.rb:19:9:19:9 | h : Hash [element a] | hash_extensions.rb:19:9:19:24 | call to symbolize_keys : Hash [element a] | provenance | | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys : Hash [element a] | hash_extensions.rb:19:5:19:5 | x : Hash [element a] | provenance | | +| hash_extensions.rb:20:10:20:10 | x : Hash [element a] | hash_extensions.rb:20:10:20:14 | ...[...] | provenance | | +| hash_extensions.rb:26:5:26:5 | h : Hash [element :a] | hash_extensions.rb:27:9:27:9 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:26:9:26:26 | call to [] : Hash [element :a] | hash_extensions.rb:26:5:26:5 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:9:26:26 | call to [] : Hash [element :a] | provenance | | +| hash_extensions.rb:27:5:27:5 | x : Hash [element :a] | hash_extensions.rb:28:10:28:10 | x : Hash [element :a] | provenance | | +| hash_extensions.rb:27:9:27:9 | h : Hash [element :a] | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys : Hash [element :a] | provenance | | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys : Hash [element :a] | hash_extensions.rb:27:5:27:5 | x : Hash [element :a] | provenance | | +| hash_extensions.rb:28:10:28:10 | x : Hash [element :a] | hash_extensions.rb:28:10:28:15 | ...[...] | provenance | | +| hash_extensions.rb:34:5:34:5 | h : Hash [element a] | hash_extensions.rb:35:9:35:9 | h : Hash [element a] | provenance | | +| hash_extensions.rb:34:9:34:30 | call to [] : Hash [element a] | hash_extensions.rb:34:5:34:5 | h : Hash [element a] | provenance | | +| hash_extensions.rb:34:18:34:28 | call to source | hash_extensions.rb:34:9:34:30 | call to [] : Hash [element a] | provenance | | +| hash_extensions.rb:35:5:35:5 | x : Hash [element a] | hash_extensions.rb:36:10:36:10 | x : Hash [element a] | provenance | | +| hash_extensions.rb:35:9:35:9 | h : Hash [element a] | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys : Hash [element a] | provenance | | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys : Hash [element a] | hash_extensions.rb:35:5:35:5 | x : Hash [element a] | provenance | | +| hash_extensions.rb:36:10:36:10 | x : Hash [element a] | hash_extensions.rb:36:10:36:14 | ...[...] | provenance | | +| hash_extensions.rb:42:5:42:5 | h : Hash [element :a] | hash_extensions.rb:43:9:43:9 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:42:9:42:26 | call to [] : Hash [element :a] | hash_extensions.rb:42:5:42:5 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:9:42:26 | call to [] : Hash [element :a] | provenance | | +| hash_extensions.rb:43:5:43:5 | x : Hash [element :a] | hash_extensions.rb:44:10:44:10 | x : Hash [element :a] | provenance | | +| hash_extensions.rb:43:9:43:9 | h : Hash [element :a] | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access : Hash [element :a] | provenance | | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access : Hash [element :a] | hash_extensions.rb:43:5:43:5 | x : Hash [element :a] | provenance | | +| hash_extensions.rb:44:10:44:10 | x : Hash [element :a] | hash_extensions.rb:44:10:44:15 | ...[...] | provenance | | +| hash_extensions.rb:50:5:50:5 | h : Hash [element :a] | hash_extensions.rb:51:9:51:9 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:50:5:50:5 | h : Hash [element :b] | hash_extensions.rb:51:9:51:9 | h : Hash [element :b] | provenance | | +| hash_extensions.rb:50:5:50:5 | h : Hash [element :d] | hash_extensions.rb:51:9:51:9 | h : Hash [element :d] | provenance | | +| hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :a] | hash_extensions.rb:50:5:50:5 | h : Hash [element :a] | provenance | | +| hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :b] | hash_extensions.rb:50:5:50:5 | h : Hash [element :b] | provenance | | +| hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :d] | hash_extensions.rb:50:5:50:5 | h : Hash [element :d] | provenance | | +| hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :a] | provenance | | +| hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :b] | provenance | | +| hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :d] | provenance | | +| hash_extensions.rb:51:5:51:5 | x : [collection] [element :a] | hash_extensions.rb:58:10:58:10 | x : [collection] [element :a] | provenance | | +| hash_extensions.rb:51:5:51:5 | x : [collection] [element :b] | hash_extensions.rb:59:10:59:10 | x : [collection] [element :b] | provenance | | +| hash_extensions.rb:51:9:51:9 | [post] h : Hash [element :d] | hash_extensions.rb:56:10:56:10 | h : Hash [element :d] | provenance | | +| hash_extensions.rb:51:9:51:9 | h : Hash [element :a] | hash_extensions.rb:51:9:51:29 | call to extract! : [collection] [element :a] | provenance | | +| hash_extensions.rb:51:9:51:9 | h : Hash [element :b] | hash_extensions.rb:51:9:51:29 | call to extract! : [collection] [element :b] | provenance | | +| hash_extensions.rb:51:9:51:9 | h : Hash [element :d] | hash_extensions.rb:51:9:51:9 | [post] h : Hash [element :d] | provenance | | +| hash_extensions.rb:51:9:51:29 | call to extract! : [collection] [element :a] | hash_extensions.rb:51:5:51:5 | x : [collection] [element :a] | provenance | | +| hash_extensions.rb:51:9:51:29 | call to extract! : [collection] [element :b] | hash_extensions.rb:51:5:51:5 | x : [collection] [element :b] | provenance | | +| hash_extensions.rb:56:10:56:10 | h : Hash [element :d] | hash_extensions.rb:56:10:56:14 | ...[...] | provenance | | +| hash_extensions.rb:58:10:58:10 | x : [collection] [element :a] | hash_extensions.rb:58:10:58:14 | ...[...] | provenance | | +| hash_extensions.rb:59:10:59:10 | x : [collection] [element :b] | hash_extensions.rb:59:10:59:14 | ...[...] | provenance | | +| hash_extensions.rb:67:5:67:10 | values : Array [element 0] | hash_extensions.rb:68:9:68:14 | values : Array [element 0] | provenance | | +| hash_extensions.rb:67:5:67:10 | values : Array [element 1] | hash_extensions.rb:68:9:68:14 | values : Array [element 1] | provenance | | +| hash_extensions.rb:67:5:67:10 | values : Array [element 2] | hash_extensions.rb:68:9:68:14 | values : Array [element 2] | provenance | | +| hash_extensions.rb:67:14:67:52 | call to [] : Array [element 0] | hash_extensions.rb:67:5:67:10 | values : Array [element 0] | provenance | | +| hash_extensions.rb:67:14:67:52 | call to [] : Array [element 1] | hash_extensions.rb:67:5:67:10 | values : Array [element 1] | provenance | | +| hash_extensions.rb:67:14:67:52 | call to [] : Array [element 2] | hash_extensions.rb:67:5:67:10 | values : Array [element 2] | provenance | | +| hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:14:67:52 | call to [] : Array [element 0] | provenance | | +| hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:14:67:52 | call to [] : Array [element 1] | provenance | | +| hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:14:67:52 | call to [] : Array [element 2] | provenance | | +| hash_extensions.rb:68:5:68:5 | h : [collection] [element] | hash_extensions.rb:73:10:73:10 | h : [collection] [element] | provenance | | +| hash_extensions.rb:68:5:68:5 | h : [collection] [element] | hash_extensions.rb:74:10:74:10 | h : [collection] [element] | provenance | | +| hash_extensions.rb:68:9:68:14 | values : Array [element 0] | hash_extensions.rb:68:9:71:7 | call to index_by : [collection] [element] | provenance | | +| hash_extensions.rb:68:9:68:14 | values : Array [element 0] | hash_extensions.rb:68:29:68:33 | value | provenance | | +| hash_extensions.rb:68:9:68:14 | values : Array [element 1] | hash_extensions.rb:68:9:71:7 | call to index_by : [collection] [element] | provenance | | +| hash_extensions.rb:68:9:68:14 | values : Array [element 1] | hash_extensions.rb:68:29:68:33 | value | provenance | | +| hash_extensions.rb:68:9:68:14 | values : Array [element 2] | hash_extensions.rb:68:9:71:7 | call to index_by : [collection] [element] | provenance | | +| hash_extensions.rb:68:9:68:14 | values : Array [element 2] | hash_extensions.rb:68:29:68:33 | value | provenance | | +| hash_extensions.rb:68:9:71:7 | call to index_by : [collection] [element] | hash_extensions.rb:68:5:68:5 | h : [collection] [element] | provenance | | | hash_extensions.rb:68:29:68:33 | value | hash_extensions.rb:69:14:69:18 | value | provenance | | -| hash_extensions.rb:73:10:73:10 | h [element] | hash_extensions.rb:73:10:73:16 | ...[...] | provenance | | -| hash_extensions.rb:74:10:74:10 | h [element] | hash_extensions.rb:74:10:74:16 | ...[...] | provenance | | -| hash_extensions.rb:80:5:80:10 | values [element 0] | hash_extensions.rb:81:9:81:14 | values [element 0] | provenance | | -| hash_extensions.rb:80:5:80:10 | values [element 1] | hash_extensions.rb:81:9:81:14 | values [element 1] | provenance | | -| hash_extensions.rb:80:5:80:10 | values [element 2] | hash_extensions.rb:81:9:81:14 | values [element 2] | provenance | | -| hash_extensions.rb:80:14:80:52 | call to [] [element 0] | hash_extensions.rb:80:5:80:10 | values [element 0] | provenance | | -| hash_extensions.rb:80:14:80:52 | call to [] [element 1] | hash_extensions.rb:80:5:80:10 | values [element 1] | provenance | | -| hash_extensions.rb:80:14:80:52 | call to [] [element 2] | hash_extensions.rb:80:5:80:10 | values [element 2] | provenance | | -| hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:14:80:52 | call to [] [element 0] | provenance | | -| hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:14:80:52 | call to [] [element 1] | provenance | | -| hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:14:80:52 | call to [] [element 2] | provenance | | -| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:86:10:86:10 | h [element] | provenance | | -| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:87:10:87:10 | h [element] | provenance | | -| hash_extensions.rb:81:9:81:14 | values [element 0] | hash_extensions.rb:81:31:81:33 | key | provenance | | -| hash_extensions.rb:81:9:81:14 | values [element 1] | hash_extensions.rb:81:31:81:33 | key | provenance | | -| hash_extensions.rb:81:9:81:14 | values [element 2] | hash_extensions.rb:81:31:81:33 | key | provenance | | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] | hash_extensions.rb:81:5:81:5 | h [element] | provenance | | +| hash_extensions.rb:73:10:73:10 | h : [collection] [element] | hash_extensions.rb:73:10:73:16 | ...[...] | provenance | | +| hash_extensions.rb:74:10:74:10 | h : [collection] [element] | hash_extensions.rb:74:10:74:16 | ...[...] | provenance | | +| hash_extensions.rb:80:5:80:10 | values : Array [element 0] | hash_extensions.rb:81:9:81:14 | values : Array [element 0] | provenance | | +| hash_extensions.rb:80:5:80:10 | values : Array [element 1] | hash_extensions.rb:81:9:81:14 | values : Array [element 1] | provenance | | +| hash_extensions.rb:80:5:80:10 | values : Array [element 2] | hash_extensions.rb:81:9:81:14 | values : Array [element 2] | provenance | | +| hash_extensions.rb:80:14:80:52 | call to [] : Array [element 0] | hash_extensions.rb:80:5:80:10 | values : Array [element 0] | provenance | | +| hash_extensions.rb:80:14:80:52 | call to [] : Array [element 1] | hash_extensions.rb:80:5:80:10 | values : Array [element 1] | provenance | | +| hash_extensions.rb:80:14:80:52 | call to [] : Array [element 2] | hash_extensions.rb:80:5:80:10 | values : Array [element 2] | provenance | | +| hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:14:80:52 | call to [] : Array [element 0] | provenance | | +| hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:14:80:52 | call to [] : Array [element 1] | provenance | | +| hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:14:80:52 | call to [] : Array [element 2] | provenance | | +| hash_extensions.rb:81:5:81:5 | h : [collection] [element] | hash_extensions.rb:86:10:86:10 | h : [collection] [element] | provenance | | +| hash_extensions.rb:81:5:81:5 | h : [collection] [element] | hash_extensions.rb:87:10:87:10 | h : [collection] [element] | provenance | | +| hash_extensions.rb:81:9:81:14 | values : Array [element 0] | hash_extensions.rb:81:31:81:33 | key | provenance | | +| hash_extensions.rb:81:9:81:14 | values : Array [element 1] | hash_extensions.rb:81:31:81:33 | key | provenance | | +| hash_extensions.rb:81:9:81:14 | values : Array [element 2] | hash_extensions.rb:81:31:81:33 | key | provenance | | +| hash_extensions.rb:81:9:84:7 | call to index_with : [collection] [element] | hash_extensions.rb:81:5:81:5 | h : [collection] [element] | provenance | | | hash_extensions.rb:81:31:81:33 | key | hash_extensions.rb:82:14:82:16 | key | provenance | | -| hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:81:9:84:7 | call to index_with [element] | provenance | | -| hash_extensions.rb:86:10:86:10 | h [element] | hash_extensions.rb:86:10:86:16 | ...[...] | provenance | | -| hash_extensions.rb:87:10:87:10 | h [element] | hash_extensions.rb:87:10:87:16 | ...[...] | provenance | | -| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:91:10:91:10 | j [element] | provenance | | -| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:92:10:92:10 | j [element] | provenance | | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] | hash_extensions.rb:89:5:89:5 | j [element] | provenance | | -| hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:89:9:89:38 | call to index_with [element] | provenance | | -| hash_extensions.rb:91:10:91:10 | j [element] | hash_extensions.rb:91:10:91:16 | ...[...] | provenance | | -| hash_extensions.rb:92:10:92:10 | j [element] | hash_extensions.rb:92:10:92:16 | ...[...] | provenance | | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :id] | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :name] | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:98:15:98:56 | call to [] [element :id] | hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :id] | provenance | | -| hash_extensions.rb:98:15:98:56 | call to [] [element :name] | hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :name] | provenance | | -| hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:15:98:56 | call to [] [element :id] | provenance | | -| hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:15:98:56 | call to [] [element :name] | provenance | | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | hash_extensions.rb:99:10:99:25 | call to pick | provenance | | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | hash_extensions.rb:100:10:100:27 | call to pick | provenance | | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | provenance | | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | hash_extensions.rb:101:10:101:35 | ...[...] | provenance | | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | hash_extensions.rb:102:10:102:32 | call to pick [element 1] | provenance | | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | hash_extensions.rb:102:10:102:35 | ...[...] | provenance | | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | hash_extensions.rb:103:10:103:32 | call to pick [element 0] | provenance | | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | hash_extensions.rb:103:10:103:35 | ...[...] | provenance | | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | hash_extensions.rb:104:10:104:32 | call to pick [element 1] | provenance | | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | hash_extensions.rb:104:10:104:35 | ...[...] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | provenance | | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | provenance | | -| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :id] | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | provenance | | -| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :name] | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | provenance | | -| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :id] | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | provenance | | -| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :name] | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | provenance | | -| hash_extensions.rb:110:15:110:56 | call to [] [element :id] | hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :id] | provenance | | -| hash_extensions.rb:110:15:110:56 | call to [] [element :name] | hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :name] | provenance | | -| hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:15:110:56 | call to [] [element :id] | provenance | | -| hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:15:110:56 | call to [] [element :name] | provenance | | -| hash_extensions.rb:110:59:110:101 | call to [] [element :id] | hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :id] | provenance | | -| hash_extensions.rb:110:59:110:101 | call to [] [element :name] | hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :name] | provenance | | -| hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:59:110:101 | call to [] [element :id] | provenance | | -| hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:59:110:101 | call to [] [element :name] | provenance | | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | provenance | | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | provenance | | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] | hash_extensions.rb:111:10:111:31 | ...[...] | provenance | | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | provenance | | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | provenance | | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | provenance | | +| hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:81:9:84:7 | call to index_with : [collection] [element] | provenance | | +| hash_extensions.rb:86:10:86:10 | h : [collection] [element] | hash_extensions.rb:86:10:86:16 | ...[...] | provenance | | +| hash_extensions.rb:87:10:87:10 | h : [collection] [element] | hash_extensions.rb:87:10:87:16 | ...[...] | provenance | | +| hash_extensions.rb:89:5:89:5 | j : [collection] [element] | hash_extensions.rb:91:10:91:10 | j : [collection] [element] | provenance | | +| hash_extensions.rb:89:5:89:5 | j : [collection] [element] | hash_extensions.rb:92:10:92:10 | j : [collection] [element] | provenance | | +| hash_extensions.rb:89:9:89:38 | call to index_with : [collection] [element] | hash_extensions.rb:89:5:89:5 | j : [collection] [element] | provenance | | +| hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:89:9:89:38 | call to index_with : [collection] [element] | provenance | | +| hash_extensions.rb:91:10:91:10 | j : [collection] [element] | hash_extensions.rb:91:10:91:16 | ...[...] | provenance | | +| hash_extensions.rb:92:10:92:10 | j : [collection] [element] | hash_extensions.rb:92:10:92:16 | ...[...] | provenance | | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :id] | hash_extensions.rb:99:10:99:15 | values : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :id] | hash_extensions.rb:101:10:101:15 | values : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :id] | hash_extensions.rb:104:10:104:15 | values : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :name] | hash_extensions.rb:100:10:100:15 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :name] | hash_extensions.rb:102:10:102:15 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :name] | hash_extensions.rb:103:10:103:15 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:98:14:98:102 | call to [] : Array [element 0, element :id] | hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:98:14:98:102 | call to [] : Array [element 0, element :name] | hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:98:15:98:56 | call to [] : Hash [element :id] | hash_extensions.rb:98:14:98:102 | call to [] : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:98:15:98:56 | call to [] : Hash [element :name] | hash_extensions.rb:98:14:98:102 | call to [] : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:15:98:56 | call to [] : Hash [element :id] | provenance | | +| hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:15:98:56 | call to [] : Hash [element :name] | provenance | | +| hash_extensions.rb:99:10:99:15 | values : Array [element 0, element :id] | hash_extensions.rb:99:10:99:25 | call to pick | provenance | | +| hash_extensions.rb:100:10:100:15 | values : Array [element 0, element :name] | hash_extensions.rb:100:10:100:27 | call to pick | provenance | | +| hash_extensions.rb:101:10:101:15 | values : Array [element 0, element :id] | hash_extensions.rb:101:10:101:32 | call to pick : [collection] [element 0] | provenance | | +| hash_extensions.rb:101:10:101:32 | call to pick : [collection] [element 0] | hash_extensions.rb:101:10:101:35 | ...[...] | provenance | | +| hash_extensions.rb:102:10:102:15 | values : Array [element 0, element :name] | hash_extensions.rb:102:10:102:32 | call to pick : [collection] [element 1] | provenance | | +| hash_extensions.rb:102:10:102:32 | call to pick : [collection] [element 1] | hash_extensions.rb:102:10:102:35 | ...[...] | provenance | | +| hash_extensions.rb:103:10:103:15 | values : Array [element 0, element :name] | hash_extensions.rb:103:10:103:32 | call to pick : [collection] [element 0] | provenance | | +| hash_extensions.rb:103:10:103:32 | call to pick : [collection] [element 0] | hash_extensions.rb:103:10:103:35 | ...[...] | provenance | | +| hash_extensions.rb:104:10:104:15 | values : Array [element 0, element :id] | hash_extensions.rb:104:10:104:32 | call to pick : [collection] [element 1] | provenance | | +| hash_extensions.rb:104:10:104:32 | call to pick : [collection] [element 1] | hash_extensions.rb:104:10:104:35 | ...[...] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :id] | hash_extensions.rb:112:10:112:15 | values : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :id] | hash_extensions.rb:115:10:115:15 | values : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :name] | hash_extensions.rb:111:10:111:15 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :name] | hash_extensions.rb:113:10:113:15 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :name] | hash_extensions.rb:114:10:114:15 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :id] | hash_extensions.rb:112:10:112:15 | values : Array [element 1, element :id] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :id] | hash_extensions.rb:115:10:115:15 | values : Array [element 1, element :id] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :name] | hash_extensions.rb:111:10:111:15 | values : Array [element 1, element :name] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :name] | hash_extensions.rb:113:10:113:15 | values : Array [element 1, element :name] | provenance | | +| hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :name] | hash_extensions.rb:114:10:114:15 | values : Array [element 1, element :name] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 0, element :id] | hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 0, element :name] | hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 1, element :id] | hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :id] | provenance | | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 1, element :name] | hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :name] | provenance | | +| hash_extensions.rb:110:15:110:56 | call to [] : Hash [element :id] | hash_extensions.rb:110:14:110:102 | call to [] : Array [element 0, element :id] | provenance | | +| hash_extensions.rb:110:15:110:56 | call to [] : Hash [element :name] | hash_extensions.rb:110:14:110:102 | call to [] : Array [element 0, element :name] | provenance | | +| hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:15:110:56 | call to [] : Hash [element :id] | provenance | | +| hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:15:110:56 | call to [] : Hash [element :name] | provenance | | +| hash_extensions.rb:110:59:110:101 | call to [] : Hash [element :id] | hash_extensions.rb:110:14:110:102 | call to [] : Array [element 1, element :id] | provenance | | +| hash_extensions.rb:110:59:110:101 | call to [] : Hash [element :name] | hash_extensions.rb:110:14:110:102 | call to [] : Array [element 1, element :name] | provenance | | +| hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:59:110:101 | call to [] : Hash [element :id] | provenance | | +| hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:59:110:101 | call to [] : Hash [element :name] | provenance | | +| hash_extensions.rb:111:10:111:15 | values : Array [element 0, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck : [collection] [element] | provenance | | +| hash_extensions.rb:111:10:111:15 | values : Array [element 1, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck : [collection] [element] | provenance | | +| hash_extensions.rb:111:10:111:28 | call to pluck : [collection] [element] | hash_extensions.rb:111:10:111:31 | ...[...] | provenance | | +| hash_extensions.rb:112:10:112:15 | values : Array [element 0, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck : [collection] [element, element 0] | provenance | | +| hash_extensions.rb:112:10:112:15 | values : Array [element 1, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck : [collection] [element, element 0] | provenance | | +| hash_extensions.rb:112:10:112:33 | call to pluck : [collection] [element, element 0] | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | provenance | | | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | hash_extensions.rb:112:10:112:39 | ...[...] | provenance | | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | provenance | | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | provenance | | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | provenance | | +| hash_extensions.rb:113:10:113:15 | values : Array [element 0, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck : [collection] [element, element 1] | provenance | | +| hash_extensions.rb:113:10:113:15 | values : Array [element 1, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck : [collection] [element, element 1] | provenance | | +| hash_extensions.rb:113:10:113:33 | call to pluck : [collection] [element, element 1] | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | provenance | | | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | hash_extensions.rb:113:10:113:39 | ...[...] | provenance | | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | provenance | | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | provenance | | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | provenance | | +| hash_extensions.rb:114:10:114:15 | values : Array [element 0, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck : [collection] [element, element 0] | provenance | | +| hash_extensions.rb:114:10:114:15 | values : Array [element 1, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck : [collection] [element, element 0] | provenance | | +| hash_extensions.rb:114:10:114:33 | call to pluck : [collection] [element, element 0] | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | provenance | | | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | hash_extensions.rb:114:10:114:39 | ...[...] | provenance | | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | provenance | | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | provenance | | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | provenance | | +| hash_extensions.rb:115:10:115:15 | values : Array [element 0, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck : [collection] [element, element 1] | provenance | | +| hash_extensions.rb:115:10:115:15 | values : Array [element 1, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck : [collection] [element, element 1] | provenance | | +| hash_extensions.rb:115:10:115:33 | call to pluck : [collection] [element, element 1] | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | provenance | | | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | hash_extensions.rb:115:10:115:39 | ...[...] | provenance | | -| hash_extensions.rb:122:5:122:10 | single [element 0] | hash_extensions.rb:125:10:125:15 | single [element 0] | provenance | | -| hash_extensions.rb:122:14:122:26 | call to [] [element 0] | hash_extensions.rb:122:5:122:10 | single [element 0] | provenance | | -| hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:14:122:26 | call to [] [element 0] | provenance | | -| hash_extensions.rb:123:5:123:9 | multi [element 0] | hash_extensions.rb:126:10:126:14 | multi [element 0] | provenance | | -| hash_extensions.rb:123:13:123:38 | call to [] [element 0] | hash_extensions.rb:123:5:123:9 | multi [element 0] | provenance | | -| hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:13:123:38 | call to [] [element 0] | provenance | | -| hash_extensions.rb:125:10:125:15 | single [element 0] | hash_extensions.rb:125:10:125:20 | call to sole | provenance | | -| hash_extensions.rb:126:10:126:14 | multi [element 0] | hash_extensions.rb:126:10:126:19 | call to sole | provenance | | +| hash_extensions.rb:122:5:122:10 | single : Array [element 0] | hash_extensions.rb:125:10:125:15 | single : Array [element 0] | provenance | | +| hash_extensions.rb:122:14:122:26 | call to [] : Array [element 0] | hash_extensions.rb:122:5:122:10 | single : Array [element 0] | provenance | | +| hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:14:122:26 | call to [] : Array [element 0] | provenance | | +| hash_extensions.rb:123:5:123:9 | multi : Array [element 0] | hash_extensions.rb:126:10:126:14 | multi : Array [element 0] | provenance | | +| hash_extensions.rb:123:13:123:38 | call to [] : Array [element 0] | hash_extensions.rb:123:5:123:9 | multi : Array [element 0] | provenance | | +| hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:13:123:38 | call to [] : Array [element 0] | provenance | | +| hash_extensions.rb:125:10:125:15 | single : Array [element 0] | hash_extensions.rb:125:10:125:20 | call to sole | provenance | | +| hash_extensions.rb:126:10:126:14 | multi : Array [element 0] | hash_extensions.rb:126:10:126:19 | call to sole | provenance | | nodes -| active_support.rb:180:5:180:5 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:180:9:180:18 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| active_support.rb:180:5:180:5 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:180:9:180:18 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | active_support.rb:180:10:180:17 | call to source | semmle.label | call to source | -| active_support.rb:181:5:181:5 | y [element] | semmle.label | y [element] | -| active_support.rb:181:9:181:9 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:181:9:181:23 | call to compact_blank [element] | semmle.label | call to compact_blank [element] | -| active_support.rb:182:10:182:10 | y [element] | semmle.label | y [element] | +| active_support.rb:181:5:181:5 | y : [collection] [element] | semmle.label | y : [collection] [element] | +| active_support.rb:181:9:181:9 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:181:9:181:23 | call to compact_blank : [collection] [element] | semmle.label | call to compact_blank : [collection] [element] | +| active_support.rb:182:10:182:10 | y : [collection] [element] | semmle.label | y : [collection] [element] | | active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:186:9:186:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| active_support.rb:186:5:186:5 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:186:9:186:22 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | active_support.rb:186:10:186:18 | call to source | semmle.label | call to source | -| active_support.rb:187:5:187:5 | y [element] | semmle.label | y [element] | -| active_support.rb:187:9:187:9 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:187:9:187:21 | call to excluding [element] | semmle.label | call to excluding [element] | -| active_support.rb:188:10:188:10 | y [element] | semmle.label | y [element] | +| active_support.rb:187:5:187:5 | y : [collection] [element] | semmle.label | y : [collection] [element] | +| active_support.rb:187:9:187:9 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:187:9:187:21 | call to excluding : [collection] [element] | semmle.label | call to excluding : [collection] [element] | +| active_support.rb:188:10:188:10 | y : [collection] [element] | semmle.label | y : [collection] [element] | | active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:192:5:192:5 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:192:9:192:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| active_support.rb:192:5:192:5 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:192:9:192:22 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | active_support.rb:192:10:192:18 | call to source | semmle.label | call to source | -| active_support.rb:193:5:193:5 | y [element] | semmle.label | y [element] | -| active_support.rb:193:9:193:9 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:193:9:193:19 | call to without [element] | semmle.label | call to without [element] | -| active_support.rb:194:10:194:10 | y [element] | semmle.label | y [element] | +| active_support.rb:193:5:193:5 | y : [collection] [element] | semmle.label | y : [collection] [element] | +| active_support.rb:193:9:193:9 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:193:9:193:19 | call to without : [collection] [element] | semmle.label | call to without : [collection] [element] | +| active_support.rb:194:10:194:10 | y : [collection] [element] | semmle.label | y : [collection] [element] | | active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:198:5:198:5 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:198:9:198:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| active_support.rb:198:5:198:5 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:198:9:198:22 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | active_support.rb:198:10:198:18 | call to source | semmle.label | call to source | -| active_support.rb:199:5:199:5 | y [element] | semmle.label | y [element] | -| active_support.rb:199:9:199:9 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:199:9:199:37 | call to in_order_of [element] | semmle.label | call to in_order_of [element] | -| active_support.rb:200:10:200:10 | y [element] | semmle.label | y [element] | +| active_support.rb:199:5:199:5 | y : [collection] [element] | semmle.label | y : [collection] [element] | +| active_support.rb:199:9:199:9 | x : Array [element 0] | semmle.label | x : Array [element 0] | +| active_support.rb:199:9:199:37 | call to in_order_of : [collection] [element] | semmle.label | call to in_order_of : [collection] [element] | +| active_support.rb:200:10:200:10 | y : [collection] [element] | semmle.label | y : [collection] [element] | | active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:204:5:204:5 | a [element 0] | semmle.label | a [element 0] | -| active_support.rb:204:9:204:22 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| active_support.rb:204:5:204:5 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| active_support.rb:204:9:204:22 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | active_support.rb:204:10:204:18 | call to source | semmle.label | call to source | -| active_support.rb:205:5:205:5 | b [element 0] | semmle.label | b [element 0] | -| active_support.rb:205:5:205:5 | b [element] | semmle.label | b [element] | -| active_support.rb:205:9:205:9 | a [element 0] | semmle.label | a [element 0] | -| active_support.rb:205:9:205:41 | call to including [element 0] | semmle.label | call to including [element 0] | -| active_support.rb:205:9:205:41 | call to including [element] | semmle.label | call to including [element] | +| active_support.rb:205:5:205:5 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| active_support.rb:205:5:205:5 | b : [collection] [element] | semmle.label | b : [collection] [element] | +| active_support.rb:205:9:205:9 | a : Array [element 0] | semmle.label | a : Array [element 0] | +| active_support.rb:205:9:205:41 | call to including : [collection] [element 0] | semmle.label | call to including : [collection] [element 0] | +| active_support.rb:205:9:205:41 | call to including : [collection] [element] | semmle.label | call to including : [collection] [element] | | active_support.rb:205:21:205:29 | call to source | semmle.label | call to source | | active_support.rb:205:32:205:40 | call to source | semmle.label | call to source | -| active_support.rb:206:10:206:10 | a [element 0] | semmle.label | a [element 0] | +| active_support.rb:206:10:206:10 | a : Array [element 0] | semmle.label | a : Array [element 0] | | active_support.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:208:10:208:10 | b [element 0] | semmle.label | b [element 0] | -| active_support.rb:208:10:208:10 | b [element] | semmle.label | b [element] | +| active_support.rb:208:10:208:10 | b : [collection] [element 0] | semmle.label | b : [collection] [element 0] | +| active_support.rb:208:10:208:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | active_support.rb:208:10:208:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:209:10:209:10 | b [element] | semmle.label | b [element] | +| active_support.rb:209:10:209:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | active_support.rb:209:10:209:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:210:10:210:10 | b [element] | semmle.label | b [element] | +| active_support.rb:210:10:210:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | active_support.rb:210:10:210:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:211:10:211:10 | b [element] | semmle.label | b [element] | +| active_support.rb:211:10:211:10 | b : [collection] [element] | semmle.label | b : [collection] [element] | | active_support.rb:211:10:211:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:282:3:282:3 | x | semmle.label | x | | active_support.rb:282:7:282:16 | call to source | semmle.label | call to source | @@ -302,198 +302,198 @@ nodes | active_support.rb:290:7:290:16 | call to source | semmle.label | call to source | | active_support.rb:291:8:291:8 | x | semmle.label | x | | active_support.rb:291:8:291:17 | call to deep_dup | semmle.label | call to deep_dup | -| hash_extensions.rb:2:5:2:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:2:9:2:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_extensions.rb:2:5:2:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:2:9:2:26 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_extensions.rb:2:14:2:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:3:5:3:5 | x [element :a] | semmle.label | x [element :a] | -| hash_extensions.rb:3:9:3:9 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element :a] | semmle.label | call to stringify_keys [element :a] | -| hash_extensions.rb:4:10:4:10 | x [element :a] | semmle.label | x [element :a] | +| hash_extensions.rb:3:5:3:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_extensions.rb:3:9:3:9 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys : Hash [element :a] | semmle.label | call to stringify_keys : Hash [element :a] | +| hash_extensions.rb:4:10:4:10 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | | hash_extensions.rb:4:10:4:15 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:10:5:10:5 | h [element a] | semmle.label | h [element a] | -| hash_extensions.rb:10:9:10:30 | call to [] [element a] | semmle.label | call to [] [element a] | +| hash_extensions.rb:10:5:10:5 | h : Hash [element a] | semmle.label | h : Hash [element a] | +| hash_extensions.rb:10:9:10:30 | call to [] : Hash [element a] | semmle.label | call to [] : Hash [element a] | | hash_extensions.rb:10:18:10:28 | call to source | semmle.label | call to source | -| hash_extensions.rb:11:5:11:5 | x [element a] | semmle.label | x [element a] | -| hash_extensions.rb:11:9:11:9 | h [element a] | semmle.label | h [element a] | -| hash_extensions.rb:11:9:11:20 | call to to_options [element a] | semmle.label | call to to_options [element a] | -| hash_extensions.rb:12:10:12:10 | x [element a] | semmle.label | x [element a] | +| hash_extensions.rb:11:5:11:5 | x : Hash [element a] | semmle.label | x : Hash [element a] | +| hash_extensions.rb:11:9:11:9 | h : Hash [element a] | semmle.label | h : Hash [element a] | +| hash_extensions.rb:11:9:11:20 | call to to_options : Hash [element a] | semmle.label | call to to_options : Hash [element a] | +| hash_extensions.rb:12:10:12:10 | x : Hash [element a] | semmle.label | x : Hash [element a] | | hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:18:5:18:5 | h [element a] | semmle.label | h [element a] | -| hash_extensions.rb:18:9:18:30 | call to [] [element a] | semmle.label | call to [] [element a] | +| hash_extensions.rb:18:5:18:5 | h : Hash [element a] | semmle.label | h : Hash [element a] | +| hash_extensions.rb:18:9:18:30 | call to [] : Hash [element a] | semmle.label | call to [] : Hash [element a] | | hash_extensions.rb:18:18:18:28 | call to source | semmle.label | call to source | -| hash_extensions.rb:19:5:19:5 | x [element a] | semmle.label | x [element a] | -| hash_extensions.rb:19:9:19:9 | h [element a] | semmle.label | h [element a] | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element a] | semmle.label | call to symbolize_keys [element a] | -| hash_extensions.rb:20:10:20:10 | x [element a] | semmle.label | x [element a] | +| hash_extensions.rb:19:5:19:5 | x : Hash [element a] | semmle.label | x : Hash [element a] | +| hash_extensions.rb:19:9:19:9 | h : Hash [element a] | semmle.label | h : Hash [element a] | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys : Hash [element a] | semmle.label | call to symbolize_keys : Hash [element a] | +| hash_extensions.rb:20:10:20:10 | x : Hash [element a] | semmle.label | x : Hash [element a] | | hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:26:5:26:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:26:9:26:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_extensions.rb:26:5:26:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:26:9:26:26 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_extensions.rb:26:14:26:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:27:5:27:5 | x [element :a] | semmle.label | x [element :a] | -| hash_extensions.rb:27:9:27:9 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element :a] | semmle.label | call to deep_stringify_keys [element :a] | -| hash_extensions.rb:28:10:28:10 | x [element :a] | semmle.label | x [element :a] | +| hash_extensions.rb:27:5:27:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_extensions.rb:27:9:27:9 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys : Hash [element :a] | semmle.label | call to deep_stringify_keys : Hash [element :a] | +| hash_extensions.rb:28:10:28:10 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | | hash_extensions.rb:28:10:28:15 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:34:5:34:5 | h [element a] | semmle.label | h [element a] | -| hash_extensions.rb:34:9:34:30 | call to [] [element a] | semmle.label | call to [] [element a] | +| hash_extensions.rb:34:5:34:5 | h : Hash [element a] | semmle.label | h : Hash [element a] | +| hash_extensions.rb:34:9:34:30 | call to [] : Hash [element a] | semmle.label | call to [] : Hash [element a] | | hash_extensions.rb:34:18:34:28 | call to source | semmle.label | call to source | -| hash_extensions.rb:35:5:35:5 | x [element a] | semmle.label | x [element a] | -| hash_extensions.rb:35:9:35:9 | h [element a] | semmle.label | h [element a] | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element a] | semmle.label | call to deep_symbolize_keys [element a] | -| hash_extensions.rb:36:10:36:10 | x [element a] | semmle.label | x [element a] | +| hash_extensions.rb:35:5:35:5 | x : Hash [element a] | semmle.label | x : Hash [element a] | +| hash_extensions.rb:35:9:35:9 | h : Hash [element a] | semmle.label | h : Hash [element a] | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys : Hash [element a] | semmle.label | call to deep_symbolize_keys : Hash [element a] | +| hash_extensions.rb:36:10:36:10 | x : Hash [element a] | semmle.label | x : Hash [element a] | | hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:42:5:42:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:42:9:42:26 | call to [] [element :a] | semmle.label | call to [] [element :a] | +| hash_extensions.rb:42:5:42:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:42:9:42:26 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | | hash_extensions.rb:42:14:42:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:43:5:43:5 | x [element :a] | semmle.label | x [element :a] | -| hash_extensions.rb:43:9:43:9 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element :a] | semmle.label | call to with_indifferent_access [element :a] | -| hash_extensions.rb:44:10:44:10 | x [element :a] | semmle.label | x [element :a] | +| hash_extensions.rb:43:5:43:5 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | +| hash_extensions.rb:43:9:43:9 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access : Hash [element :a] | semmle.label | call to with_indifferent_access : Hash [element :a] | +| hash_extensions.rb:44:10:44:10 | x : Hash [element :a] | semmle.label | x : Hash [element :a] | | hash_extensions.rb:44:10:44:15 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:50:5:50:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:50:5:50:5 | h [element :b] | semmle.label | h [element :b] | -| hash_extensions.rb:50:5:50:5 | h [element :d] | semmle.label | h [element :d] | -| hash_extensions.rb:50:9:50:63 | call to [] [element :a] | semmle.label | call to [] [element :a] | -| hash_extensions.rb:50:9:50:63 | call to [] [element :b] | semmle.label | call to [] [element :b] | -| hash_extensions.rb:50:9:50:63 | call to [] [element :d] | semmle.label | call to [] [element :d] | +| hash_extensions.rb:50:5:50:5 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:50:5:50:5 | h : Hash [element :b] | semmle.label | h : Hash [element :b] | +| hash_extensions.rb:50:5:50:5 | h : Hash [element :d] | semmle.label | h : Hash [element :d] | +| hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :a] | semmle.label | call to [] : Hash [element :a] | +| hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :b] | semmle.label | call to [] : Hash [element :b] | +| hash_extensions.rb:50:9:50:63 | call to [] : Hash [element :d] | semmle.label | call to [] : Hash [element :d] | | hash_extensions.rb:50:14:50:23 | call to taint | semmle.label | call to taint | | hash_extensions.rb:50:29:50:38 | call to taint | semmle.label | call to taint | | hash_extensions.rb:50:52:50:61 | call to taint | semmle.label | call to taint | -| hash_extensions.rb:51:5:51:5 | x [element :a] | semmle.label | x [element :a] | -| hash_extensions.rb:51:5:51:5 | x [element :b] | semmle.label | x [element :b] | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | semmle.label | [post] h [element :d] | -| hash_extensions.rb:51:9:51:9 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:51:9:51:9 | h [element :b] | semmle.label | h [element :b] | -| hash_extensions.rb:51:9:51:9 | h [element :d] | semmle.label | h [element :d] | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | semmle.label | call to extract! [element :a] | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | semmle.label | call to extract! [element :b] | -| hash_extensions.rb:56:10:56:10 | h [element :d] | semmle.label | h [element :d] | +| hash_extensions.rb:51:5:51:5 | x : [collection] [element :a] | semmle.label | x : [collection] [element :a] | +| hash_extensions.rb:51:5:51:5 | x : [collection] [element :b] | semmle.label | x : [collection] [element :b] | +| hash_extensions.rb:51:9:51:9 | [post] h : Hash [element :d] | semmle.label | [post] h : Hash [element :d] | +| hash_extensions.rb:51:9:51:9 | h : Hash [element :a] | semmle.label | h : Hash [element :a] | +| hash_extensions.rb:51:9:51:9 | h : Hash [element :b] | semmle.label | h : Hash [element :b] | +| hash_extensions.rb:51:9:51:9 | h : Hash [element :d] | semmle.label | h : Hash [element :d] | +| hash_extensions.rb:51:9:51:29 | call to extract! : [collection] [element :a] | semmle.label | call to extract! : [collection] [element :a] | +| hash_extensions.rb:51:9:51:29 | call to extract! : [collection] [element :b] | semmle.label | call to extract! : [collection] [element :b] | +| hash_extensions.rb:56:10:56:10 | h : Hash [element :d] | semmle.label | h : Hash [element :d] | | hash_extensions.rb:56:10:56:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:58:10:58:10 | x [element :a] | semmle.label | x [element :a] | +| hash_extensions.rb:58:10:58:10 | x : [collection] [element :a] | semmle.label | x : [collection] [element :a] | | hash_extensions.rb:58:10:58:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:59:10:59:10 | x [element :b] | semmle.label | x [element :b] | +| hash_extensions.rb:59:10:59:10 | x : [collection] [element :b] | semmle.label | x : [collection] [element :b] | | hash_extensions.rb:59:10:59:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:67:5:67:10 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:67:5:67:10 | values [element 1] | semmle.label | values [element 1] | -| hash_extensions.rb:67:5:67:10 | values [element 2] | semmle.label | values [element 2] | -| hash_extensions.rb:67:14:67:52 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| hash_extensions.rb:67:14:67:52 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| hash_extensions.rb:67:14:67:52 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| hash_extensions.rb:67:5:67:10 | values : Array [element 0] | semmle.label | values : Array [element 0] | +| hash_extensions.rb:67:5:67:10 | values : Array [element 1] | semmle.label | values : Array [element 1] | +| hash_extensions.rb:67:5:67:10 | values : Array [element 2] | semmle.label | values : Array [element 2] | +| hash_extensions.rb:67:14:67:52 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| hash_extensions.rb:67:14:67:52 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| hash_extensions.rb:67:14:67:52 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | hash_extensions.rb:67:15:67:25 | call to source | semmle.label | call to source | | hash_extensions.rb:67:28:67:38 | call to source | semmle.label | call to source | | hash_extensions.rb:67:41:67:51 | call to source | semmle.label | call to source | -| hash_extensions.rb:68:5:68:5 | h [element] | semmle.label | h [element] | -| hash_extensions.rb:68:9:68:14 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:68:9:68:14 | values [element 1] | semmle.label | values [element 1] | -| hash_extensions.rb:68:9:68:14 | values [element 2] | semmle.label | values [element 2] | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] | semmle.label | call to index_by [element] | +| hash_extensions.rb:68:5:68:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| hash_extensions.rb:68:9:68:14 | values : Array [element 0] | semmle.label | values : Array [element 0] | +| hash_extensions.rb:68:9:68:14 | values : Array [element 1] | semmle.label | values : Array [element 1] | +| hash_extensions.rb:68:9:68:14 | values : Array [element 2] | semmle.label | values : Array [element 2] | +| hash_extensions.rb:68:9:71:7 | call to index_by : [collection] [element] | semmle.label | call to index_by : [collection] [element] | | hash_extensions.rb:68:29:68:33 | value | semmle.label | value | | hash_extensions.rb:69:14:69:18 | value | semmle.label | value | -| hash_extensions.rb:73:10:73:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:73:10:73:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | hash_extensions.rb:73:10:73:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:74:10:74:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:74:10:74:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | hash_extensions.rb:74:10:74:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:80:5:80:10 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:80:5:80:10 | values [element 1] | semmle.label | values [element 1] | -| hash_extensions.rb:80:5:80:10 | values [element 2] | semmle.label | values [element 2] | -| hash_extensions.rb:80:14:80:52 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| hash_extensions.rb:80:14:80:52 | call to [] [element 1] | semmle.label | call to [] [element 1] | -| hash_extensions.rb:80:14:80:52 | call to [] [element 2] | semmle.label | call to [] [element 2] | +| hash_extensions.rb:80:5:80:10 | values : Array [element 0] | semmle.label | values : Array [element 0] | +| hash_extensions.rb:80:5:80:10 | values : Array [element 1] | semmle.label | values : Array [element 1] | +| hash_extensions.rb:80:5:80:10 | values : Array [element 2] | semmle.label | values : Array [element 2] | +| hash_extensions.rb:80:14:80:52 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| hash_extensions.rb:80:14:80:52 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | +| hash_extensions.rb:80:14:80:52 | call to [] : Array [element 2] | semmle.label | call to [] : Array [element 2] | | hash_extensions.rb:80:15:80:25 | call to source | semmle.label | call to source | | hash_extensions.rb:80:28:80:38 | call to source | semmle.label | call to source | | hash_extensions.rb:80:41:80:51 | call to source | semmle.label | call to source | -| hash_extensions.rb:81:5:81:5 | h [element] | semmle.label | h [element] | -| hash_extensions.rb:81:9:81:14 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:81:9:81:14 | values [element 1] | semmle.label | values [element 1] | -| hash_extensions.rb:81:9:81:14 | values [element 2] | semmle.label | values [element 2] | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] | semmle.label | call to index_with [element] | +| hash_extensions.rb:81:5:81:5 | h : [collection] [element] | semmle.label | h : [collection] [element] | +| hash_extensions.rb:81:9:81:14 | values : Array [element 0] | semmle.label | values : Array [element 0] | +| hash_extensions.rb:81:9:81:14 | values : Array [element 1] | semmle.label | values : Array [element 1] | +| hash_extensions.rb:81:9:81:14 | values : Array [element 2] | semmle.label | values : Array [element 2] | +| hash_extensions.rb:81:9:84:7 | call to index_with : [collection] [element] | semmle.label | call to index_with : [collection] [element] | | hash_extensions.rb:81:31:81:33 | key | semmle.label | key | | hash_extensions.rb:82:14:82:16 | key | semmle.label | key | | hash_extensions.rb:83:9:83:19 | call to source | semmle.label | call to source | -| hash_extensions.rb:86:10:86:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:86:10:86:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | hash_extensions.rb:86:10:86:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:87:10:87:10 | h [element] | semmle.label | h [element] | +| hash_extensions.rb:87:10:87:10 | h : [collection] [element] | semmle.label | h : [collection] [element] | | hash_extensions.rb:87:10:87:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:89:5:89:5 | j [element] | semmle.label | j [element] | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] | semmle.label | call to index_with [element] | +| hash_extensions.rb:89:5:89:5 | j : [collection] [element] | semmle.label | j : [collection] [element] | +| hash_extensions.rb:89:9:89:38 | call to index_with : [collection] [element] | semmle.label | call to index_with : [collection] [element] | | hash_extensions.rb:89:27:89:37 | call to source | semmle.label | call to source | -| hash_extensions.rb:91:10:91:10 | j [element] | semmle.label | j [element] | +| hash_extensions.rb:91:10:91:10 | j : [collection] [element] | semmle.label | j : [collection] [element] | | hash_extensions.rb:91:10:91:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:92:10:92:10 | j [element] | semmle.label | j [element] | +| hash_extensions.rb:92:10:92:10 | j : [collection] [element] | semmle.label | j : [collection] [element] | | hash_extensions.rb:92:10:92:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :id] | semmle.label | call to [] [element 0, element :id] | -| hash_extensions.rb:98:14:98:102 | call to [] [element 0, element :name] | semmle.label | call to [] [element 0, element :name] | -| hash_extensions.rb:98:15:98:56 | call to [] [element :id] | semmle.label | call to [] [element :id] | -| hash_extensions.rb:98:15:98:56 | call to [] [element :name] | semmle.label | call to [] [element :name] | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :id] | semmle.label | values : Array [element 0, element :id] | +| hash_extensions.rb:98:5:98:10 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | +| hash_extensions.rb:98:14:98:102 | call to [] : Array [element 0, element :id] | semmle.label | call to [] : Array [element 0, element :id] | +| hash_extensions.rb:98:14:98:102 | call to [] : Array [element 0, element :name] | semmle.label | call to [] : Array [element 0, element :name] | +| hash_extensions.rb:98:15:98:56 | call to [] : Hash [element :id] | semmle.label | call to [] : Hash [element :id] | +| hash_extensions.rb:98:15:98:56 | call to [] : Hash [element :name] | semmle.label | call to [] : Hash [element :name] | | hash_extensions.rb:98:21:98:31 | call to source | semmle.label | call to source | | hash_extensions.rb:98:40:98:54 | call to source | semmle.label | call to source | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | +| hash_extensions.rb:99:10:99:15 | values : Array [element 0, element :id] | semmle.label | values : Array [element 0, element :id] | | hash_extensions.rb:99:10:99:25 | call to pick | semmle.label | call to pick | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | +| hash_extensions.rb:100:10:100:15 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | | hash_extensions.rb:100:10:100:27 | call to pick | semmle.label | call to pick | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | +| hash_extensions.rb:101:10:101:15 | values : Array [element 0, element :id] | semmle.label | values : Array [element 0, element :id] | +| hash_extensions.rb:101:10:101:32 | call to pick : [collection] [element 0] | semmle.label | call to pick : [collection] [element 0] | | hash_extensions.rb:101:10:101:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | +| hash_extensions.rb:102:10:102:15 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | +| hash_extensions.rb:102:10:102:32 | call to pick : [collection] [element 1] | semmle.label | call to pick : [collection] [element 1] | | hash_extensions.rb:102:10:102:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | +| hash_extensions.rb:103:10:103:15 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | +| hash_extensions.rb:103:10:103:32 | call to pick : [collection] [element 0] | semmle.label | call to pick : [collection] [element 0] | | hash_extensions.rb:103:10:103:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | +| hash_extensions.rb:104:10:104:15 | values : Array [element 0, element :id] | semmle.label | values : Array [element 0, element :id] | +| hash_extensions.rb:104:10:104:32 | call to pick : [collection] [element 1] | semmle.label | call to pick : [collection] [element 1] | | hash_extensions.rb:104:10:104:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :id] | semmle.label | call to [] [element 0, element :id] | -| hash_extensions.rb:110:14:110:102 | call to [] [element 0, element :name] | semmle.label | call to [] [element 0, element :name] | -| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :id] | semmle.label | call to [] [element 1, element :id] | -| hash_extensions.rb:110:14:110:102 | call to [] [element 1, element :name] | semmle.label | call to [] [element 1, element :name] | -| hash_extensions.rb:110:15:110:56 | call to [] [element :id] | semmle.label | call to [] [element :id] | -| hash_extensions.rb:110:15:110:56 | call to [] [element :name] | semmle.label | call to [] [element :name] | +| hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :id] | semmle.label | values : Array [element 0, element :id] | +| hash_extensions.rb:110:5:110:10 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | +| hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :id] | semmle.label | values : Array [element 1, element :id] | +| hash_extensions.rb:110:5:110:10 | values : Array [element 1, element :name] | semmle.label | values : Array [element 1, element :name] | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 0, element :id] | semmle.label | call to [] : Array [element 0, element :id] | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 0, element :name] | semmle.label | call to [] : Array [element 0, element :name] | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 1, element :id] | semmle.label | call to [] : Array [element 1, element :id] | +| hash_extensions.rb:110:14:110:102 | call to [] : Array [element 1, element :name] | semmle.label | call to [] : Array [element 1, element :name] | +| hash_extensions.rb:110:15:110:56 | call to [] : Hash [element :id] | semmle.label | call to [] : Hash [element :id] | +| hash_extensions.rb:110:15:110:56 | call to [] : Hash [element :name] | semmle.label | call to [] : Hash [element :name] | | hash_extensions.rb:110:21:110:31 | call to source | semmle.label | call to source | | hash_extensions.rb:110:40:110:54 | call to source | semmle.label | call to source | -| hash_extensions.rb:110:59:110:101 | call to [] [element :id] | semmle.label | call to [] [element :id] | -| hash_extensions.rb:110:59:110:101 | call to [] [element :name] | semmle.label | call to [] [element :name] | +| hash_extensions.rb:110:59:110:101 | call to [] : Hash [element :id] | semmle.label | call to [] : Hash [element :id] | +| hash_extensions.rb:110:59:110:101 | call to [] : Hash [element :name] | semmle.label | call to [] : Hash [element :name] | | hash_extensions.rb:110:65:110:75 | call to source | semmle.label | call to source | | hash_extensions.rb:110:84:110:99 | call to source | semmle.label | call to source | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] | semmle.label | call to pluck [element] | +| hash_extensions.rb:111:10:111:15 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | +| hash_extensions.rb:111:10:111:15 | values : Array [element 1, element :name] | semmle.label | values : Array [element 1, element :name] | +| hash_extensions.rb:111:10:111:28 | call to pluck : [collection] [element] | semmle.label | call to pluck : [collection] [element] | | hash_extensions.rb:111:10:111:31 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | +| hash_extensions.rb:112:10:112:15 | values : Array [element 0, element :id] | semmle.label | values : Array [element 0, element :id] | +| hash_extensions.rb:112:10:112:15 | values : Array [element 1, element :id] | semmle.label | values : Array [element 1, element :id] | +| hash_extensions.rb:112:10:112:33 | call to pluck : [collection] [element, element 0] | semmle.label | call to pluck : [collection] [element, element 0] | | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:112:10:112:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | +| hash_extensions.rb:113:10:113:15 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | +| hash_extensions.rb:113:10:113:15 | values : Array [element 1, element :name] | semmle.label | values : Array [element 1, element :name] | +| hash_extensions.rb:113:10:113:33 | call to pluck : [collection] [element, element 1] | semmle.label | call to pluck : [collection] [element, element 1] | | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:113:10:113:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | +| hash_extensions.rb:114:10:114:15 | values : Array [element 0, element :name] | semmle.label | values : Array [element 0, element :name] | +| hash_extensions.rb:114:10:114:15 | values : Array [element 1, element :name] | semmle.label | values : Array [element 1, element :name] | +| hash_extensions.rb:114:10:114:33 | call to pluck : [collection] [element, element 0] | semmle.label | call to pluck : [collection] [element, element 0] | | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:114:10:114:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | +| hash_extensions.rb:115:10:115:15 | values : Array [element 0, element :id] | semmle.label | values : Array [element 0, element :id] | +| hash_extensions.rb:115:10:115:15 | values : Array [element 1, element :id] | semmle.label | values : Array [element 1, element :id] | +| hash_extensions.rb:115:10:115:33 | call to pluck : [collection] [element, element 1] | semmle.label | call to pluck : [collection] [element, element 1] | | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:122:5:122:10 | single [element 0] | semmle.label | single [element 0] | -| hash_extensions.rb:122:14:122:26 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| hash_extensions.rb:122:5:122:10 | single : Array [element 0] | semmle.label | single : Array [element 0] | +| hash_extensions.rb:122:14:122:26 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | hash_extensions.rb:122:15:122:25 | call to source | semmle.label | call to source | -| hash_extensions.rb:123:5:123:9 | multi [element 0] | semmle.label | multi [element 0] | -| hash_extensions.rb:123:13:123:38 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| hash_extensions.rb:123:5:123:9 | multi : Array [element 0] | semmle.label | multi : Array [element 0] | +| hash_extensions.rb:123:13:123:38 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | hash_extensions.rb:123:14:123:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:125:10:125:15 | single [element 0] | semmle.label | single [element 0] | +| hash_extensions.rb:125:10:125:15 | single : Array [element 0] | semmle.label | single : Array [element 0] | | hash_extensions.rb:125:10:125:20 | call to sole | semmle.label | call to sole | -| hash_extensions.rb:126:10:126:14 | multi [element 0] | semmle.label | multi [element 0] | +| hash_extensions.rb:126:10:126:14 | multi : Array [element 0] | semmle.label | multi : Array [element 0] | | hash_extensions.rb:126:10:126:19 | call to sole | semmle.label | call to sole | subpaths testFailures diff --git a/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected b/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected index c5639c0245c..443b47f989e 100644 --- a/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected +++ b/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected @@ -57,7 +57,6 @@ pathnameInstances | Pathname.rb:39:12:39:19 | foo_path | | Pathname.rb:41:1:41:3 | p08 | | Pathname.rb:42:1:42:3 | p01 | -| file://:0:0:0:0 | [summary param] position 0 in + | | file://:0:0:0:0 | [summary param] self in + | | file://:0:0:0:0 | [summary param] self in Pathname;Method[cleanpath] | | file://:0:0:0:0 | [summary param] self in Pathname;Method[expand_path] | @@ -134,7 +133,6 @@ fileNameSources | Pathname.rb:39:12:39:19 | foo_path | | Pathname.rb:41:1:41:3 | p08 | | Pathname.rb:42:1:42:3 | p01 | -| file://:0:0:0:0 | [summary param] position 0 in + | | file://:0:0:0:0 | [summary param] self in + | | file://:0:0:0:0 | [summary param] self in Pathname;Method[cleanpath] | | file://:0:0:0:0 | [summary param] self in Pathname;Method[expand_path] | diff --git a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected index a321bd2cfdf..a33a21d0313 100644 --- a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected +++ b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected @@ -3,8 +3,8 @@ edges | app.rb:75:5:75:8 | [post] self [@foo] | app.rb:76:32:76:35 | self [@foo] | provenance | | | app.rb:75:12:75:17 | call to params | app.rb:75:12:75:24 | ...[...] | provenance | | | app.rb:75:12:75:24 | ...[...] | app.rb:75:5:75:8 | [post] self [@foo] | provenance | | -| app.rb:76:25:76:36 | call to [] [element :foo] | views/index.erb:2:10:2:12 | call to foo | provenance | | -| app.rb:76:32:76:35 | @foo | app.rb:76:25:76:36 | call to [] [element :foo] | provenance | | +| app.rb:76:25:76:36 | call to [] : Hash [element :foo] | views/index.erb:2:10:2:12 | call to foo | provenance | | +| app.rb:76:32:76:35 | @foo | app.rb:76:25:76:36 | call to [] : Hash [element :foo] | provenance | | | app.rb:76:32:76:35 | self [@foo] | app.rb:76:32:76:35 | @foo | provenance | | | app.rb:95:10:95:14 | self [@user] | app.rb:95:10:95:14 | @user | provenance | | | app.rb:103:5:103:9 | [post] self [@user] | app.rb:95:10:95:14 | self [@user] | provenance | | @@ -13,7 +13,7 @@ nodes | app.rb:75:5:75:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | app.rb:75:12:75:17 | call to params | semmle.label | call to params | | app.rb:75:12:75:24 | ...[...] | semmle.label | ...[...] | -| app.rb:76:25:76:36 | call to [] [element :foo] | semmle.label | call to [] [element :foo] | +| app.rb:76:25:76:36 | call to [] : Hash [element :foo] | semmle.label | call to [] : Hash [element :foo] | | app.rb:76:32:76:35 | @foo | semmle.label | @foo | | app.rb:76:32:76:35 | self [@foo] | semmle.label | self [@foo] | | app.rb:95:10:95:14 | @user | semmle.label | @user | diff --git a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected index fe4bad4c957..cdb6045d4da 100644 --- a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected +++ b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected @@ -8,14 +8,14 @@ edges | ErbInjection.rb:8:16:11:14 | ... % ... | ErbInjection.rb:8:5:8:12 | bad_text | provenance | | | ErbInjection.rb:11:11:11:14 | name | ErbInjection.rb:8:16:11:14 | ... % ... | provenance | | | SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:11:11:11:14 | name | provenance | | -| SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:14:23:14:34 | { ... } [captured bad_text] | provenance | | -| SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:23:23:23:35 | { ... } [captured bad2_text] | provenance | AdditionalTaintStep | +| SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:14:23:14:34 | { ... } : [lambda] [captured bad_text] | provenance | | +| SlimInjection.rb:5:5:5:8 | name | SlimInjection.rb:23:23:23:35 | { ... } : [lambda] [captured bad2_text] : String | provenance | AdditionalTaintStep | | SlimInjection.rb:5:12:5:17 | call to params | SlimInjection.rb:5:12:5:24 | ...[...] | provenance | | | SlimInjection.rb:5:12:5:24 | ...[...] | SlimInjection.rb:5:5:5:8 | name | provenance | | -| SlimInjection.rb:8:16:11:14 | ... % ... | SlimInjection.rb:14:23:14:34 | { ... } [captured bad_text] | provenance | | +| SlimInjection.rb:8:16:11:14 | ... % ... | SlimInjection.rb:14:23:14:34 | { ... } : [lambda] [captured bad_text] | provenance | | | SlimInjection.rb:11:11:11:14 | name | SlimInjection.rb:8:16:11:14 | ... % ... | provenance | | -| SlimInjection.rb:14:23:14:34 | { ... } [captured bad_text] | SlimInjection.rb:14:25:14:32 | bad_text | provenance | heuristic-callback | -| SlimInjection.rb:23:23:23:35 | { ... } [captured bad2_text] | SlimInjection.rb:23:25:23:33 | bad2_text | provenance | heuristic-callback | +| SlimInjection.rb:14:23:14:34 | { ... } : [lambda] [captured bad_text] | SlimInjection.rb:14:25:14:32 | bad_text | provenance | heuristic-callback | +| SlimInjection.rb:23:23:23:35 | { ... } : [lambda] [captured bad2_text] : String | SlimInjection.rb:23:25:23:33 | bad2_text | provenance | heuristic-callback | nodes | ErbInjection.rb:5:5:5:8 | name | semmle.label | name | | ErbInjection.rb:5:12:5:17 | call to params | semmle.label | call to params | @@ -30,9 +30,9 @@ nodes | SlimInjection.rb:5:12:5:24 | ...[...] | semmle.label | ...[...] | | SlimInjection.rb:8:16:11:14 | ... % ... | semmle.label | ... % ... | | SlimInjection.rb:11:11:11:14 | name | semmle.label | name | -| SlimInjection.rb:14:23:14:34 | { ... } [captured bad_text] | semmle.label | { ... } [captured bad_text] | +| SlimInjection.rb:14:23:14:34 | { ... } : [lambda] [captured bad_text] | semmle.label | { ... } : [lambda] [captured bad_text] | | SlimInjection.rb:14:25:14:32 | bad_text | semmle.label | bad_text | -| SlimInjection.rb:23:23:23:35 | { ... } [captured bad2_text] | semmle.label | { ... } [captured bad2_text] | +| SlimInjection.rb:23:23:23:35 | { ... } : [lambda] [captured bad2_text] : String | semmle.label | { ... } : [lambda] [captured bad2_text] : String | | SlimInjection.rb:23:25:23:33 | bad2_text | semmle.label | bad2_text | subpaths #select diff --git a/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected b/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected index af3a962886b..96c98574ec4 100644 --- a/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected @@ -24,10 +24,10 @@ edges | ArchiveApiPathTraversal.rb:10:11:10:23 | ...[...] | ArchiveApiPathTraversal.rb:67:13:67:16 | file | provenance | | | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] | provenance | | | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] | ArchiveApiPathTraversal.rb:75:11:75:18 | filename | provenance | | -| ArchiveApiPathTraversal.rb:49:17:49:27 | destination | ArchiveApiPathTraversal.rb:50:36:64:7 | do ... end [captured destination] | provenance | | -| ArchiveApiPathTraversal.rb:50:36:64:7 | do ... end [captured destination] | ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end [captured destination] | provenance | heuristic-callback | -| ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end [captured destination] | ArchiveApiPathTraversal.rb:52:38:52:48 | destination | provenance | | -| ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end [captured destination] | ArchiveApiPathTraversal.rb:52:38:52:48 | destination | provenance | heuristic-callback | +| ArchiveApiPathTraversal.rb:49:17:49:27 | destination | ArchiveApiPathTraversal.rb:50:36:64:7 | do ... end : [lambda] [captured destination] | provenance | | +| ArchiveApiPathTraversal.rb:50:36:64:7 | do ... end : [lambda] [captured destination] | ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end : [lambda] [captured destination] | provenance | heuristic-callback | +| ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end : [lambda] [captured destination] | ArchiveApiPathTraversal.rb:52:38:52:48 | destination | provenance | | +| ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end : [lambda] [captured destination] | ArchiveApiPathTraversal.rb:52:38:52:48 | destination | provenance | heuristic-callback | | ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | provenance | | | ArchiveApiPathTraversal.rb:52:28:52:67 | call to join | ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file | provenance | | | ArchiveApiPathTraversal.rb:52:38:52:48 | destination | ArchiveApiPathTraversal.rb:52:28:52:67 | call to join | provenance | | @@ -40,8 +40,8 @@ edges | tainted_path.rb:10:12:10:43 | call to absolute_path | tainted_path.rb:10:5:10:8 | path | provenance | | | tainted_path.rb:10:31:10:36 | call to params | tainted_path.rb:10:31:10:43 | ...[...] | provenance | | | tainted_path.rb:10:31:10:43 | ...[...] | tainted_path.rb:10:12:10:43 | call to absolute_path | provenance | | -| tainted_path.rb:16:5:16:8 | path | tainted_path.rb:17:26:17:29 | path | provenance | | -| tainted_path.rb:16:15:16:41 | call to dirname | tainted_path.rb:16:5:16:8 | path | provenance | AdditionalTaintStep | +| tainted_path.rb:16:5:16:8 | path : String | tainted_path.rb:17:26:17:29 | path | provenance | | +| tainted_path.rb:16:15:16:41 | call to dirname | tainted_path.rb:16:5:16:8 | path : String | provenance | AdditionalTaintStep | | tainted_path.rb:16:28:16:33 | call to params | tainted_path.rb:16:28:16:40 | ...[...] | provenance | | | tainted_path.rb:16:28:16:40 | ...[...] | tainted_path.rb:16:15:16:41 | call to dirname | provenance | | | tainted_path.rb:22:5:22:8 | path | tainted_path.rb:23:26:23:29 | path | provenance | | @@ -94,8 +94,8 @@ nodes | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params | semmle.label | call to params | | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] | semmle.label | ...[...] | | ArchiveApiPathTraversal.rb:49:17:49:27 | destination | semmle.label | destination | -| ArchiveApiPathTraversal.rb:50:36:64:7 | do ... end [captured destination] | semmle.label | do ... end [captured destination] | -| ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end [captured destination] | semmle.label | do ... end [captured destination] | +| ArchiveApiPathTraversal.rb:50:36:64:7 | do ... end : [lambda] [captured destination] | semmle.label | do ... end : [lambda] [captured destination] | +| ArchiveApiPathTraversal.rb:51:16:63:9 | do ... end : [lambda] [captured destination] | semmle.label | do ... end : [lambda] [captured destination] | | ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file | semmle.label | destination_file | | ArchiveApiPathTraversal.rb:52:28:52:67 | call to join | semmle.label | call to join | | ArchiveApiPathTraversal.rb:52:38:52:48 | destination | semmle.label | destination | @@ -113,7 +113,7 @@ nodes | tainted_path.rb:10:31:10:36 | call to params | semmle.label | call to params | | tainted_path.rb:10:31:10:43 | ...[...] | semmle.label | ...[...] | | tainted_path.rb:11:26:11:29 | path | semmle.label | path | -| tainted_path.rb:16:5:16:8 | path | semmle.label | path | +| tainted_path.rb:16:5:16:8 | path : String | semmle.label | path : String | | tainted_path.rb:16:15:16:41 | call to dirname | semmle.label | call to dirname | | tainted_path.rb:16:28:16:33 | call to params | semmle.label | call to params | | tainted_path.rb:16:28:16:40 | ...[...] | semmle.label | ...[...] | diff --git a/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected b/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected index ae05501bfa7..622777da09e 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected +++ b/ruby/ql/test/query-tests/security/cwe-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected @@ -13,9 +13,9 @@ edges | impl/unsafeShell.rb:51:17:51:17 | x | impl/unsafeShell.rb:54:29:54:29 | x | provenance | | | impl/unsafeShell.rb:57:21:57:21 | x | impl/unsafeShell.rb:58:23:58:23 | x | provenance | | | impl/unsafeShell.rb:61:20:61:20 | x | impl/unsafeShell.rb:63:14:63:14 | x | provenance | | -| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | impl/unsafeShell.rb:64:14:64:16 | arr | provenance | | -| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | impl/unsafeShell.rb:68:14:68:16 | arr | provenance | | -| impl/unsafeShell.rb:63:14:63:14 | x | impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | provenance | | +| impl/unsafeShell.rb:63:5:63:7 | [post] arr : [collection] [element] | impl/unsafeShell.rb:64:14:64:16 | arr | provenance | | +| impl/unsafeShell.rb:63:5:63:7 | [post] arr : [collection] [element] | impl/unsafeShell.rb:68:14:68:16 | arr | provenance | | +| impl/unsafeShell.rb:63:14:63:14 | x | impl/unsafeShell.rb:63:5:63:7 | [post] arr : [collection] [element] | provenance | | nodes | impl/sub/notImported.rb:2:12:2:17 | target | semmle.label | target | | impl/sub/notImported.rb:3:19:3:27 | #{...} | semmle.label | #{...} | @@ -43,7 +43,7 @@ nodes | impl/unsafeShell.rb:57:21:57:21 | x | semmle.label | x | | impl/unsafeShell.rb:58:23:58:23 | x | semmle.label | x | | impl/unsafeShell.rb:61:20:61:20 | x | semmle.label | x | -| impl/unsafeShell.rb:63:5:63:7 | [post] arr [element] | semmle.label | [post] arr [element] | +| impl/unsafeShell.rb:63:5:63:7 | [post] arr : [collection] [element] | semmle.label | [post] arr : [collection] [element] | | impl/unsafeShell.rb:63:14:63:14 | x | semmle.label | x | | impl/unsafeShell.rb:64:14:64:16 | arr | semmle.label | arr | | impl/unsafeShell.rb:68:14:68:16 | arr | semmle.label | arr | diff --git a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected index 8434b2761e0..1d6cef0f55e 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected @@ -15,16 +15,16 @@ edges | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | provenance | Config | | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | provenance | | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:82:6:82:17 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:85:36:85:47 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | app/views/foo/bars/show.html.erb:86:28:86:39 | call to display_text | provenance | | -| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:82:6:82:17 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:85:36:85:47 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | app/views/foo/bars/show.html.erb:86:28:86:39 | call to display_text | provenance | | +| app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | provenance | | | app/controllers/foo/bars_controller.rb:30:5:30:7 | str | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | provenance | | | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | provenance | | | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] | app/controllers/foo/bars_controller.rb:30:5:30:7 | str | provenance | | @@ -36,19 +36,19 @@ edges | app/controllers/foo/bars_controller.rb:36:34:36:51 | ...[...] | app/controllers/foo/bars_controller.rb:36:5:36:52 | call to t | provenance | | | app/controllers/foo/bars_controller.rb:37:42:37:47 | call to params | app/controllers/foo/bars_controller.rb:37:42:37:59 | ...[...] | provenance | | | app/controllers/foo/bars_controller.rb:37:42:37:59 | ...[...] | app/controllers/foo/bars_controller.rb:37:5:37:60 | call to translate | provenance | | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | -| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | provenance | | -| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | provenance | | -| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | provenance | | -| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | provenance | | -| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | provenance | | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | provenance | | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | +| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | provenance | | +| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns : Hash [element :display_text] | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | provenance | | +| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns : Hash [element :display_text] | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text, element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text, element] | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text] | provenance | | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... : [collection] [element] | app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text, element] | provenance | | | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | provenance | | -| app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | provenance | | +| app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... : [collection] [element] | provenance | | | app/views/foo/bars/show.html.erb:53:29:53:34 | call to params | app/views/foo/bars/show.html.erb:53:29:53:44 | ...[...] | provenance | | | app/views/foo/bars/show.html.erb:56:13:56:18 | call to params | app/views/foo/bars/show.html.erb:56:13:56:28 | ...[...] | provenance | | | app/views/foo/bars/show.html.erb:73:19:73:24 | call to params | app/views/foo/bars/show.html.erb:73:19:73:34 | ...[...] | provenance | | @@ -70,7 +70,7 @@ nodes | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params | semmle.label | call to params | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | semmle.label | ... = ... | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] | semmle.label | ...[...] | -| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | +| app/controllers/foo/bars_controller.rb:26:37:26:76 | call to [] : Hash [element :display_text] | semmle.label | call to [] : Hash [element :display_text] | | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt | semmle.label | dt | | app/controllers/foo/bars_controller.rb:30:5:30:7 | str | semmle.label | str | | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params | semmle.label | call to params | @@ -89,23 +89,23 @@ nodes | app/controllers/foo/bars_controller.rb:37:42:37:47 | call to params | semmle.label | call to params | | app/controllers/foo/bars_controller.rb:37:42:37:59 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | semmle.label | call to local_assigns [element :display_text, element] | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text, element] | semmle.label | call to local_assigns : Hash [element :display_text, element] | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | semmle.label | @user_website | | app/views/foo/bars/show.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | semmle.label | ...[...] | -| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | semmle.label | ...[...] | -| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/bars/show.html.erb:17:15:17:32 | ...[...] | semmle.label | ...[...] | | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | semmle.label | call to display_text | | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | semmle.label | @instance_text | -| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text, element] | semmle.label | call to [] [element :display_text, element] | -| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text, element] | semmle.label | call to [] : Hash [element :display_text, element] | +| app/views/foo/bars/show.html.erb:43:48:43:89 | call to [] : Hash [element :display_text] | semmle.label | call to [] : Hash [element :display_text] | | app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... | semmle.label | ... + ... | -| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... [element] | semmle.label | ... + ... [element] | +| app/views/foo/bars/show.html.erb:43:64:43:87 | ... + ... : [collection] [element] | semmle.label | ... + ... : [collection] [element] | | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text | semmle.label | call to display_text | | app/views/foo/bars/show.html.erb:46:5:46:13 | call to user_name | semmle.label | call to user_name | | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | semmle.label | call to user_name_memo | diff --git a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected index ac33b45f06f..2d7c846edd8 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected @@ -3,50 +3,50 @@ edges | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | provenance | | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | provenance | | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | provenance | Config | -| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | provenance | | -| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | provenance | | -| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | provenance | | -| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | provenance | | -| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | provenance | | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | -| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | provenance | | -| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | provenance | | -| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | provenance | | -| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | provenance | | -| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | -| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | provenance | | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | provenance | | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | provenance | | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | provenance | | +| app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | provenance | | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | provenance | | +| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns : Hash [element :display_text] | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | provenance | | +| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns : Hash [element :display_text] | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | provenance | | +| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns : Hash [element :display_text] | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text, element] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text, element] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text, element] | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text] | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | provenance | | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text] | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | provenance | | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text] | provenance | | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : [collection] [element] | app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text, element] | provenance | | | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | provenance | | -| app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | provenance | | +| app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : [collection] [element] | provenance | | | app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | provenance | AdditionalTaintStep | nodes | app/controllers/foo/stores_controller.rb:8:5:8:6 | dt | semmle.label | dt | | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read | semmle.label | call to read | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt | semmle.label | dt | -| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | +| app/controllers/foo/stores_controller.rb:13:39:13:78 | call to [] : Hash [element :display_text] | semmle.label | call to [] : Hash [element :display_text] | | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt | semmle.label | dt | | app/views/foo/bars/_widget.html.erb:5:9:5:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text, element] | semmle.label | call to local_assigns [element :display_text, element] | -| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text, element] | semmle.label | call to local_assigns : Hash [element :display_text, element] | +| app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | semmle.label | ...[...] | | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | semmle.label | call to display_text | -| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/stores/show.html.erb:5:9:5:21 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/stores/show.html.erb:5:9:5:36 | ...[...] | semmle.label | ...[...] | -| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/stores/show.html.erb:9:9:9:21 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/stores/show.html.erb:9:9:9:26 | ...[...] | semmle.label | ...[...] | -| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns [element :display_text] | semmle.label | call to local_assigns [element :display_text] | +| app/views/foo/stores/show.html.erb:14:15:14:27 | call to local_assigns : Hash [element :display_text] | semmle.label | call to local_assigns : Hash [element :display_text] | | app/views/foo/stores/show.html.erb:14:15:14:32 | ...[...] | semmle.label | ...[...] | | app/views/foo/stores/show.html.erb:32:3:32:14 | call to display_text | semmle.label | call to display_text | | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | semmle.label | @instance_text | -| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text, element] | semmle.label | call to [] [element :display_text, element] | -| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] [element :display_text] | semmle.label | call to [] [element :display_text] | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text, element] | semmle.label | call to [] : Hash [element :display_text, element] | +| app/views/foo/stores/show.html.erb:40:48:40:89 | call to [] : Hash [element :display_text] | semmle.label | call to [] : Hash [element :display_text] | | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... | semmle.label | ... + ... | -| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... [element] | semmle.label | ... + ... [element] | +| app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : [collection] [element] | semmle.label | ... + ... : [collection] [element] | | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text | semmle.label | call to display_text | | app/views/foo/stores/show.html.erb:46:5:46:16 | call to handle | semmle.label | call to handle | | app/views/foo/stores/show.html.erb:63:3:63:18 | call to handle | semmle.label | call to handle | diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected index a4a254806aa..069cb34810f 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -11,12 +11,12 @@ edges | ActiveRecordInjection.rb:50:29:50:39 | ...[...] | ActiveRecordInjection.rb:50:20:50:42 | "id = '#{...}'" | provenance | AdditionalTaintStep | | ActiveRecordInjection.rb:55:30:55:35 | call to params | ActiveRecordInjection.rb:55:30:55:40 | ...[...] | provenance | | | ActiveRecordInjection.rb:55:30:55:40 | ...[...] | ActiveRecordInjection.rb:55:21:55:43 | "id = '#{...}'" | provenance | AdditionalTaintStep | -| ActiveRecordInjection.rb:59:22:59:44 | "id = '#{...}'" | ActiveRecordInjection.rb:59:21:59:45 | call to [] | provenance | | +| ActiveRecordInjection.rb:59:22:59:44 | "id = '#{...}'" : String | ActiveRecordInjection.rb:59:21:59:45 | call to [] | provenance | | | ActiveRecordInjection.rb:59:31:59:36 | call to params | ActiveRecordInjection.rb:59:31:59:41 | ...[...] | provenance | | -| ActiveRecordInjection.rb:59:31:59:41 | ...[...] | ActiveRecordInjection.rb:59:22:59:44 | "id = '#{...}'" | provenance | AdditionalTaintStep | -| ActiveRecordInjection.rb:64:23:64:45 | "id = '#{...}'" | ActiveRecordInjection.rb:64:22:64:46 | call to [] | provenance | | +| ActiveRecordInjection.rb:59:31:59:41 | ...[...] | ActiveRecordInjection.rb:59:22:59:44 | "id = '#{...}'" : String | provenance | AdditionalTaintStep | +| ActiveRecordInjection.rb:64:23:64:45 | "id = '#{...}'" : String | ActiveRecordInjection.rb:64:22:64:46 | call to [] | provenance | | | ActiveRecordInjection.rb:64:32:64:37 | call to params | ActiveRecordInjection.rb:64:32:64:42 | ...[...] | provenance | | -| ActiveRecordInjection.rb:64:32:64:42 | ...[...] | ActiveRecordInjection.rb:64:23:64:45 | "id = '#{...}'" | provenance | AdditionalTaintStep | +| ActiveRecordInjection.rb:64:32:64:42 | ...[...] | ActiveRecordInjection.rb:64:23:64:45 | "id = '#{...}'" : String | provenance | AdditionalTaintStep | | ActiveRecordInjection.rb:69:21:69:26 | call to params | ActiveRecordInjection.rb:69:21:69:35 | ...[...] | provenance | | | ActiveRecordInjection.rb:69:21:69:35 | ...[...] | ActiveRecordInjection.rb:68:16:68:21 | <<-SQL | provenance | AdditionalTaintStep | | ActiveRecordInjection.rb:75:34:75:39 | call to params | ActiveRecordInjection.rb:75:34:75:44 | ...[...] | provenance | | @@ -51,12 +51,10 @@ edges | ActiveRecordInjection.rb:129:29:129:34 | call to params | ActiveRecordInjection.rb:129:29:129:39 | ...[...] | provenance | | | ActiveRecordInjection.rb:135:5:135:6 | ps | ActiveRecordInjection.rb:136:11:136:12 | ps | provenance | | | ActiveRecordInjection.rb:135:10:135:15 | call to params | ActiveRecordInjection.rb:135:5:135:6 | ps | provenance | | -| ActiveRecordInjection.rb:136:5:136:7 | uid | ActiveRecordInjection.rb:137:5:137:9 | uidEq | provenance | AdditionalTaintStep | +| ActiveRecordInjection.rb:136:5:136:7 | uid | ActiveRecordInjection.rb:137:5:137:9 | uidEq : String | provenance | AdditionalTaintStep | | ActiveRecordInjection.rb:136:11:136:12 | ps | ActiveRecordInjection.rb:136:11:136:17 | ...[...] | provenance | | | ActiveRecordInjection.rb:136:11:136:17 | ...[...] | ActiveRecordInjection.rb:136:5:136:7 | uid | provenance | | -| ActiveRecordInjection.rb:137:5:137:9 | uidEq | ActiveRecordInjection.rb:141:20:141:32 | ... + ... | provenance | | -| ActiveRecordInjection.rb:137:5:137:9 | uidEq | ActiveRecordInjection.rb:141:28:141:32 | uidEq | provenance | | -| ActiveRecordInjection.rb:141:28:141:32 | uidEq | ActiveRecordInjection.rb:141:20:141:32 | ... + ... | provenance | | +| ActiveRecordInjection.rb:137:5:137:9 | uidEq : String | ActiveRecordInjection.rb:141:20:141:32 | ... + ... | provenance | | | ActiveRecordInjection.rb:174:21:174:26 | call to params | ActiveRecordInjection.rb:174:21:174:44 | ...[...] | provenance | | | ActiveRecordInjection.rb:174:21:174:26 | call to params | ActiveRecordInjection.rb:174:21:174:44 | ...[...] | provenance | | | ActiveRecordInjection.rb:174:21:174:44 | ...[...] | ActiveRecordInjection.rb:27:22:27:30 | condition | provenance | | @@ -64,9 +62,9 @@ edges | ActiveRecordInjection.rb:188:59:188:74 | ...[...] | ActiveRecordInjection.rb:188:27:188:76 | "this is an unsafe annotation:..." | provenance | AdditionalTaintStep | | ActiveRecordInjection.rb:199:5:199:13 | my_params | ActiveRecordInjection.rb:200:47:200:55 | my_params | provenance | | | ActiveRecordInjection.rb:199:17:199:32 | call to permitted_params | ActiveRecordInjection.rb:199:5:199:13 | my_params | provenance | | -| ActiveRecordInjection.rb:200:5:200:9 | query | ActiveRecordInjection.rb:201:37:201:41 | query | provenance | | +| ActiveRecordInjection.rb:200:5:200:9 | query : String | ActiveRecordInjection.rb:201:37:201:41 | query | provenance | | | ActiveRecordInjection.rb:200:47:200:55 | my_params | ActiveRecordInjection.rb:200:47:200:65 | ...[...] | provenance | | -| ActiveRecordInjection.rb:200:47:200:65 | ...[...] | ActiveRecordInjection.rb:200:5:200:9 | query | provenance | AdditionalTaintStep | +| ActiveRecordInjection.rb:200:47:200:65 | ...[...] | ActiveRecordInjection.rb:200:5:200:9 | query : String | provenance | AdditionalTaintStep | | ActiveRecordInjection.rb:206:5:206:10 | call to params | ActiveRecordInjection.rb:206:5:206:27 | call to require | provenance | | | ActiveRecordInjection.rb:206:5:206:27 | call to require | ActiveRecordInjection.rb:206:5:206:59 | call to permit | provenance | | | ActiveRecordInjection.rb:206:5:206:59 | call to permit | ActiveRecordInjection.rb:199:17:199:32 | call to permitted_params | provenance | | @@ -83,18 +81,18 @@ edges | ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | provenance | AdditionalTaintStep | | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:4:12:4:29 | ...[...] | provenance | | | ArelInjection.rb:4:12:4:29 | ...[...] | ArelInjection.rb:4:5:4:8 | name | provenance | | -| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:13:5:13:8 | qry1 | provenance | AdditionalTaintStep | -| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:19:5:19:8 | qry2 | provenance | AdditionalTaintStep | -| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:31:5:31:8 | qry3 | provenance | AdditionalTaintStep | -| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:43:5:43:8 | qry3 | provenance | AdditionalTaintStep | +| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:13:5:13:8 | qry1 : String | provenance | AdditionalTaintStep | +| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:19:5:19:8 | qry2 : String | provenance | AdditionalTaintStep | +| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:31:5:31:8 | qry3 : String | provenance | AdditionalTaintStep | +| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:43:5:43:8 | qry3 : String | provenance | AdditionalTaintStep | | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:6:12:6:24 | ...[...] | provenance | | | PgInjection.rb:6:12:6:24 | ...[...] | PgInjection.rb:6:5:6:8 | name | provenance | | -| PgInjection.rb:13:5:13:8 | qry1 | PgInjection.rb:14:15:14:18 | qry1 | provenance | | -| PgInjection.rb:13:5:13:8 | qry1 | PgInjection.rb:15:21:15:24 | qry1 | provenance | | -| PgInjection.rb:19:5:19:8 | qry2 | PgInjection.rb:20:22:20:25 | qry2 | provenance | | -| PgInjection.rb:19:5:19:8 | qry2 | PgInjection.rb:21:28:21:31 | qry2 | provenance | | -| PgInjection.rb:31:5:31:8 | qry3 | PgInjection.rb:32:29:32:32 | qry3 | provenance | | -| PgInjection.rb:43:5:43:8 | qry3 | PgInjection.rb:44:29:44:32 | qry3 | provenance | | +| PgInjection.rb:13:5:13:8 | qry1 : String | PgInjection.rb:14:15:14:18 | qry1 | provenance | | +| PgInjection.rb:13:5:13:8 | qry1 : String | PgInjection.rb:15:21:15:24 | qry1 | provenance | | +| PgInjection.rb:19:5:19:8 | qry2 : String | PgInjection.rb:20:22:20:25 | qry2 | provenance | | +| PgInjection.rb:19:5:19:8 | qry2 : String | PgInjection.rb:21:28:21:31 | qry2 | provenance | | +| PgInjection.rb:31:5:31:8 | qry3 : String | PgInjection.rb:32:29:32:32 | qry3 | provenance | | +| PgInjection.rb:43:5:43:8 | qry3 : String | PgInjection.rb:44:29:44:32 | qry3 | provenance | | nodes | ActiveRecordInjection.rb:8:25:8:28 | name | semmle.label | name | | ActiveRecordInjection.rb:8:31:8:34 | pass | semmle.label | pass | @@ -114,11 +112,11 @@ nodes | ActiveRecordInjection.rb:55:30:55:35 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:55:30:55:40 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:59:21:59:45 | call to [] | semmle.label | call to [] | -| ActiveRecordInjection.rb:59:22:59:44 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | +| ActiveRecordInjection.rb:59:22:59:44 | "id = '#{...}'" : String | semmle.label | "id = '#{...}'" : String | | ActiveRecordInjection.rb:59:31:59:36 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:59:31:59:41 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:64:22:64:46 | call to [] | semmle.label | call to [] | -| ActiveRecordInjection.rb:64:23:64:45 | "id = '#{...}'" | semmle.label | "id = '#{...}'" | +| ActiveRecordInjection.rb:64:23:64:45 | "id = '#{...}'" : String | semmle.label | "id = '#{...}'" : String | | ActiveRecordInjection.rb:64:32:64:37 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:64:32:64:42 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:68:16:68:21 | <<-SQL | semmle.label | <<-SQL | @@ -179,9 +177,8 @@ nodes | ActiveRecordInjection.rb:136:5:136:7 | uid | semmle.label | uid | | ActiveRecordInjection.rb:136:11:136:12 | ps | semmle.label | ps | | ActiveRecordInjection.rb:136:11:136:17 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:137:5:137:9 | uidEq | semmle.label | uidEq | +| ActiveRecordInjection.rb:137:5:137:9 | uidEq : String | semmle.label | uidEq : String | | ActiveRecordInjection.rb:141:20:141:32 | ... + ... | semmle.label | ... + ... | -| ActiveRecordInjection.rb:141:28:141:32 | uidEq | semmle.label | uidEq | | ActiveRecordInjection.rb:174:21:174:26 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:174:21:174:44 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:174:21:174:44 | ...[...] | semmle.label | ...[...] | @@ -190,7 +187,7 @@ nodes | ActiveRecordInjection.rb:188:59:188:74 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:199:5:199:13 | my_params | semmle.label | my_params | | ActiveRecordInjection.rb:199:17:199:32 | call to permitted_params | semmle.label | call to permitted_params | -| ActiveRecordInjection.rb:200:5:200:9 | query | semmle.label | query | +| ActiveRecordInjection.rb:200:5:200:9 | query : String | semmle.label | query : String | | ActiveRecordInjection.rb:200:47:200:55 | my_params | semmle.label | my_params | | ActiveRecordInjection.rb:200:47:200:65 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:201:37:201:41 | query | semmle.label | query | @@ -215,15 +212,15 @@ nodes | PgInjection.rb:6:5:6:8 | name | semmle.label | name | | PgInjection.rb:6:12:6:17 | call to params | semmle.label | call to params | | PgInjection.rb:6:12:6:24 | ...[...] | semmle.label | ...[...] | -| PgInjection.rb:13:5:13:8 | qry1 | semmle.label | qry1 | +| PgInjection.rb:13:5:13:8 | qry1 : String | semmle.label | qry1 : String | | PgInjection.rb:14:15:14:18 | qry1 | semmle.label | qry1 | | PgInjection.rb:15:21:15:24 | qry1 | semmle.label | qry1 | -| PgInjection.rb:19:5:19:8 | qry2 | semmle.label | qry2 | +| PgInjection.rb:19:5:19:8 | qry2 : String | semmle.label | qry2 : String | | PgInjection.rb:20:22:20:25 | qry2 | semmle.label | qry2 | | PgInjection.rb:21:28:21:31 | qry2 | semmle.label | qry2 | -| PgInjection.rb:31:5:31:8 | qry3 | semmle.label | qry3 | +| PgInjection.rb:31:5:31:8 | qry3 : String | semmle.label | qry3 : String | | PgInjection.rb:32:29:32:32 | qry3 | semmle.label | qry3 | -| PgInjection.rb:43:5:43:8 | qry3 | semmle.label | qry3 | +| PgInjection.rb:43:5:43:8 | qry3 : String | semmle.label | qry3 : String | | PgInjection.rb:44:29:44:32 | qry3 | semmle.label | qry3 | subpaths #select diff --git a/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected b/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected index 3ce4b8ebe03..f598d37e32a 100644 --- a/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected @@ -15,19 +15,19 @@ nodes | CodeInjection.rb:78:12:78:17 | call to params | semmle.label | call to params | | CodeInjection.rb:78:12:78:24 | ...[...] | semmle.label | ...[...] | | CodeInjection.rb:80:16:80:19 | code | semmle.label | code | -| CodeInjection.rb:86:10:86:25 | ... + ... [element] | semmle.label | ... + ... [element] | +| CodeInjection.rb:86:10:86:25 | ... + ... : [collection] [element] | semmle.label | ... + ... : [collection] [element] | | CodeInjection.rb:86:10:86:37 | ... + ... | semmle.label | ... + ... | | CodeInjection.rb:86:22:86:25 | code | semmle.label | code | | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | semmle.label | "prefix_#{...}_suffix" | | CodeInjection.rb:90:10:90:13 | code | semmle.label | code | -| CodeInjection.rb:101:3:102:5 | self in index [@foo] | semmle.label | self in index [@foo] | +| CodeInjection.rb:101:3:102:5 | self in index : PostsController [@foo] | semmle.label | self in index : PostsController [@foo] | | CodeInjection.rb:105:5:105:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | CodeInjection.rb:105:12:105:17 | call to params | semmle.label | call to params | | CodeInjection.rb:105:12:105:23 | ...[...] | semmle.label | ...[...] | -| CodeInjection.rb:108:3:109:5 | self in bar [@foo] | semmle.label | self in bar [@foo] | -| CodeInjection.rb:111:3:113:5 | self in baz [@foo] | semmle.label | self in baz [@foo] | +| CodeInjection.rb:108:3:109:5 | self in bar : PostsController [@foo] | semmle.label | self in bar : PostsController [@foo] | +| CodeInjection.rb:111:3:113:5 | self in baz : PostsController [@foo] | semmle.label | self in baz : PostsController [@foo] | | CodeInjection.rb:112:10:112:13 | @foo | semmle.label | @foo | -| CodeInjection.rb:112:10:112:13 | self [@foo] | semmle.label | self [@foo] | +| CodeInjection.rb:112:10:112:13 | self : PostsController [@foo] | semmle.label | self : PostsController [@foo] | edges | CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:8:10:8:13 | code | provenance | | | CodeInjection.rb:5:5:5:8 | code | CodeInjection.rb:20:20:20:23 | code | provenance | | @@ -46,15 +46,15 @@ edges | CodeInjection.rb:78:5:78:8 | code | CodeInjection.rb:90:10:90:13 | code | provenance | | | CodeInjection.rb:78:12:78:17 | call to params | CodeInjection.rb:78:12:78:24 | ...[...] | provenance | | | CodeInjection.rb:78:12:78:24 | ...[...] | CodeInjection.rb:78:5:78:8 | code | provenance | | -| CodeInjection.rb:86:10:86:25 | ... + ... [element] | CodeInjection.rb:86:10:86:37 | ... + ... | provenance | | -| CodeInjection.rb:86:22:86:25 | code | CodeInjection.rb:86:10:86:25 | ... + ... [element] | provenance | | -| CodeInjection.rb:101:3:102:5 | self in index [@foo] | CodeInjection.rb:111:3:113:5 | self in baz [@foo] | provenance | | -| CodeInjection.rb:105:5:105:8 | [post] self [@foo] | CodeInjection.rb:108:3:109:5 | self in bar [@foo] | provenance | | +| CodeInjection.rb:86:10:86:25 | ... + ... : [collection] [element] | CodeInjection.rb:86:10:86:37 | ... + ... | provenance | | +| CodeInjection.rb:86:22:86:25 | code | CodeInjection.rb:86:10:86:25 | ... + ... : [collection] [element] | provenance | | +| CodeInjection.rb:101:3:102:5 | self in index : PostsController [@foo] | CodeInjection.rb:111:3:113:5 | self in baz : PostsController [@foo] | provenance | | +| CodeInjection.rb:105:5:105:8 | [post] self [@foo] | CodeInjection.rb:108:3:109:5 | self in bar : PostsController [@foo] | provenance | | | CodeInjection.rb:105:12:105:17 | call to params | CodeInjection.rb:105:12:105:23 | ...[...] | provenance | | | CodeInjection.rb:105:12:105:23 | ...[...] | CodeInjection.rb:105:5:105:8 | [post] self [@foo] | provenance | | -| CodeInjection.rb:108:3:109:5 | self in bar [@foo] | CodeInjection.rb:101:3:102:5 | self in index [@foo] | provenance | | -| CodeInjection.rb:111:3:113:5 | self in baz [@foo] | CodeInjection.rb:112:10:112:13 | self [@foo] | provenance | | -| CodeInjection.rb:112:10:112:13 | self [@foo] | CodeInjection.rb:112:10:112:13 | @foo | provenance | | +| CodeInjection.rb:108:3:109:5 | self in bar : PostsController [@foo] | CodeInjection.rb:101:3:102:5 | self in index : PostsController [@foo] | provenance | | +| CodeInjection.rb:111:3:113:5 | self in baz : PostsController [@foo] | CodeInjection.rb:112:10:112:13 | self : PostsController [@foo] | provenance | | +| CodeInjection.rb:112:10:112:13 | self : PostsController [@foo] | CodeInjection.rb:112:10:112:13 | @foo | provenance | | subpaths #select | CodeInjection.rb:8:10:8:13 | code | CodeInjection.rb:5:12:5:17 | call to params | CodeInjection.rb:8:10:8:13 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected index 4ff7b8aa338..eae7c03a716 100644 --- a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected +++ b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected @@ -4,26 +4,26 @@ edges | impl/unsafeCode.rb:12:12:12:12 | x | impl/unsafeCode.rb:13:33:13:33 | x | provenance | | | impl/unsafeCode.rb:28:17:28:22 | my_arr | impl/unsafeCode.rb:29:10:29:15 | my_arr | provenance | | | impl/unsafeCode.rb:32:21:32:21 | x | impl/unsafeCode.rb:33:12:33:12 | x | provenance | | -| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | impl/unsafeCode.rb:34:10:34:12 | arr | provenance | | -| impl/unsafeCode.rb:33:11:33:23 | call to [] [element 0] | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | provenance | | -| impl/unsafeCode.rb:33:12:33:12 | x | impl/unsafeCode.rb:33:11:33:23 | call to [] [element 0] | provenance | | +| impl/unsafeCode.rb:33:5:33:7 | arr : Array [element 0] | impl/unsafeCode.rb:34:10:34:12 | arr | provenance | | +| impl/unsafeCode.rb:33:11:33:23 | call to [] : Array [element 0] | impl/unsafeCode.rb:33:5:33:7 | arr : Array [element 0] | provenance | | +| impl/unsafeCode.rb:33:12:33:12 | x | impl/unsafeCode.rb:33:11:33:23 | call to [] : Array [element 0] | provenance | | | impl/unsafeCode.rb:37:15:37:15 | x | impl/unsafeCode.rb:39:14:39:14 | x | provenance | | -| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | impl/unsafeCode.rb:40:10:40:12 | arr | provenance | | -| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | impl/unsafeCode.rb:44:10:44:12 | arr | provenance | | -| impl/unsafeCode.rb:39:14:39:14 | x | impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | provenance | | +| impl/unsafeCode.rb:39:5:39:7 | [post] arr : [collection] [element] | impl/unsafeCode.rb:40:10:40:12 | arr | provenance | | +| impl/unsafeCode.rb:39:5:39:7 | [post] arr : [collection] [element] | impl/unsafeCode.rb:44:10:44:12 | arr | provenance | | +| impl/unsafeCode.rb:39:14:39:14 | x | impl/unsafeCode.rb:39:5:39:7 | [post] arr : [collection] [element] | provenance | | | impl/unsafeCode.rb:47:15:47:15 | x | impl/unsafeCode.rb:49:9:49:12 | #{...} | provenance | | | impl/unsafeCode.rb:54:21:54:21 | x | impl/unsafeCode.rb:55:22:55:22 | x | provenance | | | impl/unsafeCode.rb:59:21:59:21 | x | impl/unsafeCode.rb:60:17:60:17 | x | provenance | | | impl/unsafeCode.rb:59:24:59:24 | y | impl/unsafeCode.rb:63:30:63:30 | y | provenance | | -| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] | impl/unsafeCode.rb:61:10:61:12 | arr | provenance | | -| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | impl/unsafeCode.rb:60:5:60:7 | arr [element 0] | provenance | | -| impl/unsafeCode.rb:60:17:60:17 | x | impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | provenance | | -| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | impl/unsafeCode.rb:64:10:64:13 | arr2 | provenance | | -| impl/unsafeCode.rb:63:12:63:43 | call to [] [element 0] | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | provenance | | -| impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | impl/unsafeCode.rb:63:13:63:42 | call to join | provenance | | -| impl/unsafeCode.rb:63:13:63:42 | call to join | impl/unsafeCode.rb:63:12:63:43 | call to [] [element 0] | provenance | | -| impl/unsafeCode.rb:63:19:63:31 | call to [] [element 1] | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | provenance | | -| impl/unsafeCode.rb:63:30:63:30 | y | impl/unsafeCode.rb:63:19:63:31 | call to [] [element 1] | provenance | | +| impl/unsafeCode.rb:60:5:60:7 | arr : [collection] [element 0] | impl/unsafeCode.rb:61:10:61:12 | arr | provenance | | +| impl/unsafeCode.rb:60:11:60:18 | call to Array : [collection] [element 0] | impl/unsafeCode.rb:60:5:60:7 | arr : [collection] [element 0] | provenance | | +| impl/unsafeCode.rb:60:17:60:17 | x | impl/unsafeCode.rb:60:11:60:18 | call to Array : [collection] [element 0] | provenance | | +| impl/unsafeCode.rb:63:5:63:8 | arr2 : Array [element 0] | impl/unsafeCode.rb:64:10:64:13 | arr2 | provenance | | +| impl/unsafeCode.rb:63:12:63:43 | call to [] : Array [element 0] | impl/unsafeCode.rb:63:5:63:8 | arr2 : Array [element 0] | provenance | | +| impl/unsafeCode.rb:63:13:63:32 | call to Array : Array [element 1] | impl/unsafeCode.rb:63:13:63:42 | call to join | provenance | | +| impl/unsafeCode.rb:63:13:63:42 | call to join | impl/unsafeCode.rb:63:12:63:43 | call to [] : Array [element 0] | provenance | | +| impl/unsafeCode.rb:63:19:63:31 | call to [] : Array [element 1] | impl/unsafeCode.rb:63:13:63:32 | call to Array : Array [element 1] | provenance | | +| impl/unsafeCode.rb:63:30:63:30 | y | impl/unsafeCode.rb:63:19:63:31 | call to [] : Array [element 1] | provenance | | nodes | impl/unsafeCode.rb:2:12:2:17 | target | semmle.label | target | | impl/unsafeCode.rb:3:17:3:25 | #{...} | semmle.label | #{...} | @@ -34,12 +34,12 @@ nodes | impl/unsafeCode.rb:28:17:28:22 | my_arr | semmle.label | my_arr | | impl/unsafeCode.rb:29:10:29:15 | my_arr | semmle.label | my_arr | | impl/unsafeCode.rb:32:21:32:21 | x | semmle.label | x | -| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] | semmle.label | arr [element 0] | -| impl/unsafeCode.rb:33:11:33:23 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| impl/unsafeCode.rb:33:5:33:7 | arr : Array [element 0] | semmle.label | arr : Array [element 0] | +| impl/unsafeCode.rb:33:11:33:23 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | | impl/unsafeCode.rb:33:12:33:12 | x | semmle.label | x | | impl/unsafeCode.rb:34:10:34:12 | arr | semmle.label | arr | | impl/unsafeCode.rb:37:15:37:15 | x | semmle.label | x | -| impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] | semmle.label | [post] arr [element] | +| impl/unsafeCode.rb:39:5:39:7 | [post] arr : [collection] [element] | semmle.label | [post] arr : [collection] [element] | | impl/unsafeCode.rb:39:14:39:14 | x | semmle.label | x | | impl/unsafeCode.rb:40:10:40:12 | arr | semmle.label | arr | | impl/unsafeCode.rb:44:10:44:12 | arr | semmle.label | arr | @@ -49,15 +49,15 @@ nodes | impl/unsafeCode.rb:55:22:55:22 | x | semmle.label | x | | impl/unsafeCode.rb:59:21:59:21 | x | semmle.label | x | | impl/unsafeCode.rb:59:24:59:24 | y | semmle.label | y | -| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] | semmle.label | arr [element 0] | -| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] | semmle.label | call to Array [element 0] | +| impl/unsafeCode.rb:60:5:60:7 | arr : [collection] [element 0] | semmle.label | arr : [collection] [element 0] | +| impl/unsafeCode.rb:60:11:60:18 | call to Array : [collection] [element 0] | semmle.label | call to Array : [collection] [element 0] | | impl/unsafeCode.rb:60:17:60:17 | x | semmle.label | x | | impl/unsafeCode.rb:61:10:61:12 | arr | semmle.label | arr | -| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] | semmle.label | arr2 [element 0] | -| impl/unsafeCode.rb:63:12:63:43 | call to [] [element 0] | semmle.label | call to [] [element 0] | -| impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] | semmle.label | call to Array [element 1] | +| impl/unsafeCode.rb:63:5:63:8 | arr2 : Array [element 0] | semmle.label | arr2 : Array [element 0] | +| impl/unsafeCode.rb:63:12:63:43 | call to [] : Array [element 0] | semmle.label | call to [] : Array [element 0] | +| impl/unsafeCode.rb:63:13:63:32 | call to Array : Array [element 1] | semmle.label | call to Array : Array [element 1] | | impl/unsafeCode.rb:63:13:63:42 | call to join | semmle.label | call to join | -| impl/unsafeCode.rb:63:19:63:31 | call to [] [element 1] | semmle.label | call to [] [element 1] | +| impl/unsafeCode.rb:63:19:63:31 | call to [] : Array [element 1] | semmle.label | call to [] : Array [element 1] | | impl/unsafeCode.rb:63:30:63:30 | y | semmle.label | y | | impl/unsafeCode.rb:64:10:64:13 | arr2 | semmle.label | arr2 | subpaths diff --git a/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected b/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected index 4dbd42ac6c6..85299a98c28 100644 --- a/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected @@ -7,16 +7,16 @@ edges | app/controllers/users_controller.rb:15:19:15:30 | ...[...] | app/controllers/users_controller.rb:15:5:15:15 | unsanitized | provenance | | | app/controllers/users_controller.rb:17:31:17:41 | unsanitized | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | provenance | | | app/controllers/users_controller.rb:23:20:23:30 | unsanitized | app/controllers/users_controller.rb:23:20:23:44 | call to sub | provenance | | -| app/controllers/users_controller.rb:23:20:23:44 | call to sub | app/controllers/users_controller.rb:24:18:26:7 | do ... end [captured unsanitized2] | provenance | | +| app/controllers/users_controller.rb:23:20:23:44 | call to sub | app/controllers/users_controller.rb:24:18:26:7 | do ... end : [lambda] [captured unsanitized2] | provenance | | | app/controllers/users_controller.rb:23:20:23:44 | call to sub | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | provenance | | | app/controllers/users_controller.rb:23:20:23:44 | call to sub | app/controllers/users_controller.rb:27:28:27:39 | unsanitized2 | provenance | | -| app/controllers/users_controller.rb:24:18:26:7 | do ... end [captured unsanitized2] | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | provenance | heuristic-callback | +| app/controllers/users_controller.rb:24:18:26:7 | do ... end : [lambda] [captured unsanitized2] | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | provenance | heuristic-callback | | app/controllers/users_controller.rb:27:28:27:39 | unsanitized2 | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | provenance | | | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | app/controllers/users_controller.rb:33:19:33:31 | ...[...] | provenance | | -| app/controllers/users_controller.rb:33:19:33:31 | ...[...] | app/controllers/users_controller.rb:34:31:34:45 | { ... } [captured unsanitized] | provenance | | -| app/controllers/users_controller.rb:33:19:33:31 | ...[...] | app/controllers/users_controller.rb:35:31:35:57 | { ... } [captured unsanitized] | provenance | | -| app/controllers/users_controller.rb:34:31:34:45 | { ... } [captured unsanitized] | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | provenance | heuristic-callback | -| app/controllers/users_controller.rb:35:31:35:57 | { ... } [captured unsanitized] | app/controllers/users_controller.rb:35:45:35:55 | unsanitized | provenance | heuristic-callback | +| app/controllers/users_controller.rb:33:19:33:31 | ...[...] | app/controllers/users_controller.rb:34:31:34:45 | { ... } : [lambda] [captured unsanitized] | provenance | | +| app/controllers/users_controller.rb:33:19:33:31 | ...[...] | app/controllers/users_controller.rb:35:31:35:57 | { ... } : [lambda] [captured unsanitized] | provenance | | +| app/controllers/users_controller.rb:34:31:34:45 | { ... } : [lambda] [captured unsanitized] | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | provenance | heuristic-callback | +| app/controllers/users_controller.rb:35:31:35:57 | { ... } : [lambda] [captured unsanitized] | app/controllers/users_controller.rb:35:45:35:55 | unsanitized | provenance | heuristic-callback | | app/controllers/users_controller.rb:35:45:35:55 | unsanitized | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | provenance | | | app/controllers/users_controller.rb:49:19:49:24 | call to params | app/controllers/users_controller.rb:49:19:49:30 | ...[...] | provenance | | nodes @@ -28,15 +28,15 @@ nodes | app/controllers/users_controller.rb:17:31:17:41 | unsanitized | semmle.label | unsanitized | | app/controllers/users_controller.rb:23:20:23:30 | unsanitized | semmle.label | unsanitized | | app/controllers/users_controller.rb:23:20:23:44 | call to sub | semmle.label | call to sub | -| app/controllers/users_controller.rb:24:18:26:7 | do ... end [captured unsanitized2] | semmle.label | do ... end [captured unsanitized2] | +| app/controllers/users_controller.rb:24:18:26:7 | do ... end : [lambda] [captured unsanitized2] | semmle.label | do ... end : [lambda] [captured unsanitized2] | | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | semmle.label | unsanitized2 | | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | semmle.label | ... + ... | | app/controllers/users_controller.rb:27:28:27:39 | unsanitized2 | semmle.label | unsanitized2 | | app/controllers/users_controller.rb:33:19:33:25 | call to cookies | semmle.label | call to cookies | | app/controllers/users_controller.rb:33:19:33:31 | ...[...] | semmle.label | ...[...] | -| app/controllers/users_controller.rb:34:31:34:45 | { ... } [captured unsanitized] | semmle.label | { ... } [captured unsanitized] | +| app/controllers/users_controller.rb:34:31:34:45 | { ... } : [lambda] [captured unsanitized] | semmle.label | { ... } : [lambda] [captured unsanitized] | | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | semmle.label | unsanitized | -| app/controllers/users_controller.rb:35:31:35:57 | { ... } [captured unsanitized] | semmle.label | { ... } [captured unsanitized] | +| app/controllers/users_controller.rb:35:31:35:57 | { ... } : [lambda] [captured unsanitized] | semmle.label | { ... } : [lambda] [captured unsanitized] | | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | semmle.label | ... + ... | | app/controllers/users_controller.rb:35:45:35:55 | unsanitized | semmle.label | unsanitized | | app/controllers/users_controller.rb:49:19:49:24 | call to params | semmle.label | call to params | diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected index e0552212db1..7c2d4d259e3 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected @@ -1,47 +1,47 @@ edges -| logging.rb:3:1:3:8 | password | logging.rb:6:20:6:27 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:8:21:8:28 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:10:21:10:28 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:12:21:12:28 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:14:23:14:30 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:16:20:16:27 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:19:33:19:40 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:21:44:21:51 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:23:33:23:40 | password | provenance | | -| logging.rb:3:1:3:8 | password | logging.rb:26:18:26:34 | "pw: #{...}" | provenance | AdditionalTaintStep | -| logging.rb:3:1:3:8 | password | logging.rb:28:26:28:33 | password | provenance | | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:3:1:3:8 | password | provenance | | -| logging.rb:30:1:30:4 | hsh1 [element :password] | logging.rb:38:20:38:23 | hsh1 [element :password] | provenance | | -| logging.rb:30:8:30:55 | call to [] [element :password] | logging.rb:30:1:30:4 | hsh1 [element :password] | provenance | | -| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | logging.rb:30:8:30:55 | call to [] [element :password] | provenance | | -| logging.rb:34:1:34:4 | [post] hsh2 [element :password] | logging.rb:35:1:35:4 | hsh3 [element :password] | provenance | | -| logging.rb:34:1:34:4 | [post] hsh2 [element :password] | logging.rb:40:20:40:23 | hsh2 [element :password] | provenance | | -| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | logging.rb:34:1:34:4 | [post] hsh2 [element :password] | provenance | | -| logging.rb:35:1:35:4 | hsh3 [element :password] | logging.rb:42:20:42:23 | hsh3 [element :password] | provenance | | -| logging.rb:38:20:38:23 | hsh1 [element :password] | logging.rb:38:20:38:34 | ...[...] | provenance | | -| logging.rb:40:20:40:23 | hsh2 [element :password] | logging.rb:40:20:40:34 | ...[...] | provenance | | -| logging.rb:42:20:42:23 | hsh3 [element :password] | logging.rb:42:20:42:34 | ...[...] | provenance | | -| logging.rb:64:1:64:31 | password_masked_ineffective_sub | logging.rb:68:35:68:65 | password_masked_ineffective_sub | provenance | | -| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:64:1:64:31 | password_masked_ineffective_sub | provenance | | -| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | provenance | | -| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex | provenance | | -| logging.rb:66:1:66:32 | password_masked_ineffective_gsub | logging.rb:70:36:70:67 | password_masked_ineffective_gsub | provenance | | -| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:66:1:66:32 | password_masked_ineffective_gsub | provenance | | -| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | provenance | | -| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:6:20:6:27 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:8:21:8:28 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:10:21:10:28 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:12:21:12:28 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:14:23:14:30 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:16:20:16:27 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:19:33:19:40 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:21:44:21:51 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:23:33:23:40 | password | provenance | | +| logging.rb:3:1:3:8 | password : String | logging.rb:26:18:26:34 | "pw: #{...}" | provenance | AdditionalTaintStep | +| logging.rb:3:1:3:8 | password : String | logging.rb:28:26:28:33 | password | provenance | | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:3:1:3:8 | password : String | provenance | | +| logging.rb:30:1:30:4 | hsh1 : Hash [element :password] : String | logging.rb:38:20:38:23 | hsh1 : Hash [element :password] : String | provenance | | +| logging.rb:30:8:30:55 | call to [] : Hash [element :password] : String | logging.rb:30:1:30:4 | hsh1 : Hash [element :password] : String | provenance | | +| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : String | logging.rb:30:8:30:55 | call to [] : Hash [element :password] : String | provenance | | +| logging.rb:34:1:34:4 | [post] hsh2 : [collection] [element :password] : String | logging.rb:35:1:35:4 | hsh3 : [collection] [element :password] : String | provenance | | +| logging.rb:34:1:34:4 | [post] hsh2 : [collection] [element :password] : String | logging.rb:40:20:40:23 | hsh2 : [collection] [element :password] : String | provenance | | +| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : String | logging.rb:34:1:34:4 | [post] hsh2 : [collection] [element :password] : String | provenance | | +| logging.rb:35:1:35:4 | hsh3 : [collection] [element :password] : String | logging.rb:42:20:42:23 | hsh3 : [collection] [element :password] : String | provenance | | +| logging.rb:38:20:38:23 | hsh1 : Hash [element :password] : String | logging.rb:38:20:38:34 | ...[...] | provenance | | +| logging.rb:40:20:40:23 | hsh2 : [collection] [element :password] : String | logging.rb:40:20:40:34 | ...[...] | provenance | | +| logging.rb:42:20:42:23 | hsh3 : [collection] [element :password] : String | logging.rb:42:20:42:34 | ...[...] | provenance | | +| logging.rb:64:1:64:31 | password_masked_ineffective_sub : String | logging.rb:68:35:68:65 | password_masked_ineffective_sub : String | provenance | | +| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : String | logging.rb:64:1:64:31 | password_masked_ineffective_sub : String | provenance | | +| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : String | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | provenance | | +| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : String | logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : String | provenance | | +| logging.rb:66:1:66:32 | password_masked_ineffective_gsub : String | logging.rb:70:36:70:67 | password_masked_ineffective_gsub : String | provenance | | +| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : String | logging.rb:66:1:66:32 | password_masked_ineffective_gsub : String | provenance | | +| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : String | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | provenance | | +| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : String | logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : String | provenance | | | logging.rb:68:1:68:31 | password_masked_ineffective_sub | logging.rb:74:20:74:50 | password_masked_ineffective_sub | provenance | | -| logging.rb:68:35:68:65 | password_masked_ineffective_sub | logging.rb:68:35:68:88 | call to sub | provenance | | +| logging.rb:68:35:68:65 | password_masked_ineffective_sub : String | logging.rb:68:35:68:88 | call to sub | provenance | | | logging.rb:68:35:68:88 | call to sub | logging.rb:68:1:68:31 | password_masked_ineffective_sub | provenance | | | logging.rb:70:1:70:32 | password_masked_ineffective_gsub | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | provenance | | -| logging.rb:70:36:70:67 | password_masked_ineffective_gsub | logging.rb:70:36:70:86 | call to gsub | provenance | | +| logging.rb:70:36:70:67 | password_masked_ineffective_gsub : String | logging.rb:70:36:70:86 | call to gsub | provenance | | | logging.rb:70:36:70:86 | call to gsub | logging.rb:70:1:70:32 | password_masked_ineffective_gsub | provenance | | -| logging.rb:82:9:82:16 | password | logging.rb:84:15:84:22 | password | provenance | | -| logging.rb:87:1:87:12 | password_arg | logging.rb:88:5:88:16 | password_arg | provenance | | -| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | logging.rb:87:1:87:12 | password_arg | provenance | | -| logging.rb:88:5:88:16 | password_arg | logging.rb:82:9:82:16 | password | provenance | | +| logging.rb:82:9:82:16 | password : String | logging.rb:84:15:84:22 | password | provenance | | +| logging.rb:87:1:87:12 | password_arg : String | logging.rb:88:5:88:16 | password_arg : String | provenance | | +| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : String | logging.rb:87:1:87:12 | password_arg : String | provenance | | +| logging.rb:88:5:88:16 | password_arg : String | logging.rb:82:9:82:16 | password : String | provenance | | nodes -| logging.rb:3:1:3:8 | password | semmle.label | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | semmle.label | "043697b96909e03ca907599d6420555f" | +| logging.rb:3:1:3:8 | password : String | semmle.label | password : String | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | semmle.label | "043697b96909e03ca907599d6420555f" : String | | logging.rb:6:20:6:27 | password | semmle.label | password | | logging.rb:8:21:8:28 | password | semmle.label | password | | logging.rb:10:21:10:28 | password | semmle.label | password | @@ -53,62 +53,62 @@ nodes | logging.rb:23:33:23:40 | password | semmle.label | password | | logging.rb:26:18:26:34 | "pw: #{...}" | semmle.label | "pw: #{...}" | | logging.rb:28:26:28:33 | password | semmle.label | password | -| logging.rb:30:1:30:4 | hsh1 [element :password] | semmle.label | hsh1 [element :password] | -| logging.rb:30:8:30:55 | call to [] [element :password] | semmle.label | call to [] [element :password] | -| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | semmle.label | "aec5058e61f7f122998b1a30ee2c66b6" | -| logging.rb:34:1:34:4 | [post] hsh2 [element :password] | semmle.label | [post] hsh2 [element :password] | -| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | semmle.label | "beeda625d7306b45784d91ea0336e201" | -| logging.rb:35:1:35:4 | hsh3 [element :password] | semmle.label | hsh3 [element :password] | -| logging.rb:38:20:38:23 | hsh1 [element :password] | semmle.label | hsh1 [element :password] | +| logging.rb:30:1:30:4 | hsh1 : Hash [element :password] : String | semmle.label | hsh1 : Hash [element :password] : String | +| logging.rb:30:8:30:55 | call to [] : Hash [element :password] : String | semmle.label | call to [] : Hash [element :password] : String | +| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : String | semmle.label | "aec5058e61f7f122998b1a30ee2c66b6" : String | +| logging.rb:34:1:34:4 | [post] hsh2 : [collection] [element :password] : String | semmle.label | [post] hsh2 : [collection] [element :password] : String | +| logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : String | semmle.label | "beeda625d7306b45784d91ea0336e201" : String | +| logging.rb:35:1:35:4 | hsh3 : [collection] [element :password] : String | semmle.label | hsh3 : [collection] [element :password] : String | +| logging.rb:38:20:38:23 | hsh1 : Hash [element :password] : String | semmle.label | hsh1 : Hash [element :password] : String | | logging.rb:38:20:38:34 | ...[...] | semmle.label | ...[...] | -| logging.rb:40:20:40:23 | hsh2 [element :password] | semmle.label | hsh2 [element :password] | +| logging.rb:40:20:40:23 | hsh2 : [collection] [element :password] : String | semmle.label | hsh2 : [collection] [element :password] : String | | logging.rb:40:20:40:34 | ...[...] | semmle.label | ...[...] | -| logging.rb:42:20:42:23 | hsh3 [element :password] | semmle.label | hsh3 [element :password] | +| logging.rb:42:20:42:23 | hsh3 : [collection] [element :password] : String | semmle.label | hsh3 : [collection] [element :password] : String | | logging.rb:42:20:42:34 | ...[...] | semmle.label | ...[...] | -| logging.rb:64:1:64:31 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | -| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" | -| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex | semmle.label | password_masked_ineffective_sub_ex | -| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" | -| logging.rb:66:1:66:32 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | -| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | semmle.label | "a7e3747b19930d4f4b8181047194832f" | -| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex | semmle.label | password_masked_ineffective_gsub_ex | -| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | semmle.label | "a7e3747b19930d4f4b8181047194832f" | +| logging.rb:64:1:64:31 | password_masked_ineffective_sub : String | semmle.label | password_masked_ineffective_sub : String | +| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : String | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" : String | +| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : String | semmle.label | password_masked_ineffective_sub_ex : String | +| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : String | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" : String | +| logging.rb:66:1:66:32 | password_masked_ineffective_gsub : String | semmle.label | password_masked_ineffective_gsub : String | +| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : String | semmle.label | "a7e3747b19930d4f4b8181047194832f" : String | +| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : String | semmle.label | password_masked_ineffective_gsub_ex : String | +| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : String | semmle.label | "a7e3747b19930d4f4b8181047194832f" : String | | logging.rb:68:1:68:31 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | -| logging.rb:68:35:68:65 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | +| logging.rb:68:35:68:65 | password_masked_ineffective_sub : String | semmle.label | password_masked_ineffective_sub : String | | logging.rb:68:35:68:88 | call to sub | semmle.label | call to sub | | logging.rb:70:1:70:32 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | -| logging.rb:70:36:70:67 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | +| logging.rb:70:36:70:67 | password_masked_ineffective_gsub : String | semmle.label | password_masked_ineffective_gsub : String | | logging.rb:70:36:70:86 | call to gsub | semmle.label | call to gsub | | logging.rb:74:20:74:50 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | semmle.label | password_masked_ineffective_sub_ex | | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | semmle.label | password_masked_ineffective_gsub_ex | -| logging.rb:82:9:82:16 | password | semmle.label | password | +| logging.rb:82:9:82:16 | password : String | semmle.label | password : String | | logging.rb:84:15:84:22 | password | semmle.label | password | -| logging.rb:87:1:87:12 | password_arg | semmle.label | password_arg | -| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | semmle.label | "65f2950df2f0e2c38d7ba2ccca767291" | -| logging.rb:88:5:88:16 | password_arg | semmle.label | password_arg | +| logging.rb:87:1:87:12 | password_arg : String | semmle.label | password_arg : String | +| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : String | semmle.label | "65f2950df2f0e2c38d7ba2ccca767291" : String | +| logging.rb:88:5:88:16 | password_arg : String | semmle.label | password_arg : String | subpaths #select -| logging.rb:6:20:6:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:6:20:6:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:8:21:8:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:8:21:8:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:10:21:10:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:10:21:10:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:12:21:12:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:12:21:12:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:14:23:14:30 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:14:23:14:30 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:16:20:16:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:16:20:16:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:19:33:19:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:19:33:19:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:21:44:21:51 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:21:44:21:51 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:23:33:23:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:23:33:23:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:26:18:26:34 | "pw: #{...}" | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:26:18:26:34 | "pw: #{...}" | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:28:26:28:33 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | logging.rb:28:26:28:33 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | -| logging.rb:38:20:38:34 | ...[...] | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | logging.rb:38:20:38:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | a write to password | -| logging.rb:40:20:40:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | logging.rb:40:20:40:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | -| logging.rb:42:20:42:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | logging.rb:42:20:42:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | -| logging.rb:74:20:74:50 | password_masked_ineffective_sub | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:74:20:74:50 | password_masked_ineffective_sub | This logs sensitive data returned by $@ as clear text. | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub | +| logging.rb:6:20:6:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:6:20:6:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:8:21:8:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:8:21:8:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:10:21:10:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:10:21:10:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:12:21:12:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:12:21:12:28 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:14:23:14:30 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:14:23:14:30 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:16:20:16:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:16:20:16:27 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:19:33:19:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:19:33:19:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:21:44:21:51 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:21:44:21:51 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:23:33:23:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:23:33:23:40 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:26:18:26:34 | "pw: #{...}" | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:26:18:26:34 | "pw: #{...}" | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:28:26:28:33 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : String | logging.rb:28:26:28:33 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:38:20:38:34 | ...[...] | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : String | logging.rb:38:20:38:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" | a write to password | +| logging.rb:40:20:40:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : String | logging.rb:40:20:40:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | +| logging.rb:42:20:42:34 | ...[...] | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : String | logging.rb:42:20:42:34 | ...[...] | This logs sensitive data returned by $@ as clear text. | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" | a write to password | +| logging.rb:74:20:74:50 | password_masked_ineffective_sub | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : String | logging.rb:74:20:74:50 | password_masked_ineffective_sub | This logs sensitive data returned by $@ as clear text. | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub | | logging.rb:74:20:74:50 | password_masked_ineffective_sub | logging.rb:68:35:68:88 | call to sub | logging.rb:74:20:74:50 | password_masked_ineffective_sub | This logs sensitive data returned by $@ as clear text. | logging.rb:68:35:68:88 | call to sub | an assignment to password_masked_ineffective_sub | -| logging.rb:76:20:76:51 | password_masked_ineffective_gsub | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | This logs sensitive data returned by $@ as clear text. | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub | +| logging.rb:76:20:76:51 | password_masked_ineffective_gsub | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : String | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | This logs sensitive data returned by $@ as clear text. | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub | | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | logging.rb:70:36:70:86 | call to gsub | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | This logs sensitive data returned by $@ as clear text. | logging.rb:70:36:70:86 | call to gsub | an assignment to password_masked_ineffective_gsub | -| logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub_ex | -| logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub_ex | +| logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : String | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub_ex | +| logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : String | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | This logs sensitive data returned by $@ as clear text. | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub_ex | | logging.rb:84:15:84:22 | password | logging.rb:84:15:84:22 | password | logging.rb:84:15:84:22 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:84:15:84:22 | password | a parameter password | -| logging.rb:84:15:84:22 | password | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | logging.rb:84:15:84:22 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | an assignment to password_arg | +| logging.rb:84:15:84:22 | password | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : String | logging.rb:84:15:84:22 | password | This logs sensitive data returned by $@ as clear text. | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" | an assignment to password_arg | diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected index 3bfe42e97d0..2a1c5c56465 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected @@ -1,147 +1,151 @@ edges -| app/controllers/users_controller.rb:3:5:3:16 | new_password | app/controllers/users_controller.rb:5:39:5:50 | new_password | provenance | | -| app/controllers/users_controller.rb:3:5:3:16 | new_password | app/controllers/users_controller.rb:7:41:7:52 | new_password | provenance | | -| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | app/controllers/users_controller.rb:3:5:3:16 | new_password | provenance | | -| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:13:42:13:53 | new_password | provenance | | -| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | provenance | | -| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | provenance | | -| app/controllers/users_controller.rb:11:5:11:16 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | provenance | | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:11:5:11:16 | new_password | provenance | | +| app/controllers/users_controller.rb:3:5:3:16 | new_password : String | app/controllers/users_controller.rb:5:39:5:50 | new_password | provenance | | +| app/controllers/users_controller.rb:3:5:3:16 | new_password : String | app/controllers/users_controller.rb:7:41:7:52 | new_password | provenance | | +| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : String | app/controllers/users_controller.rb:3:5:3:16 | new_password : String | provenance | | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : String | app/controllers/users_controller.rb:13:42:13:53 | new_password | provenance | | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : String | app/controllers/users_controller.rb:15:49:15:60 | new_password | provenance | | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : String | app/controllers/users_controller.rb:15:49:15:60 | new_password : String | provenance | | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : String | app/controllers/users_controller.rb:15:87:15:98 | new_password | provenance | | +| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : String | app/controllers/users_controller.rb:11:5:11:16 | new_password : String | provenance | | | app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | provenance | | -| app/controllers/users_controller.rb:19:5:19:16 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | provenance | | -| app/controllers/users_controller.rb:19:5:19:16 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | provenance | | -| app/controllers/users_controller.rb:19:5:19:16 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | provenance | | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | app/controllers/users_controller.rb:19:5:19:16 | new_password | provenance | | +| app/controllers/users_controller.rb:15:49:15:60 | new_password : String | app/controllers/users_controller.rb:15:87:15:98 | new_password | provenance | | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : String | app/controllers/users_controller.rb:21:45:21:56 | new_password | provenance | | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : String | app/controllers/users_controller.rb:21:45:21:56 | new_password : String | provenance | | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : String | app/controllers/users_controller.rb:21:83:21:94 | new_password | provenance | | +| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : String | app/controllers/users_controller.rb:19:5:19:16 | new_password : String | provenance | | | app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | provenance | | -| app/controllers/users_controller.rb:26:5:26:16 | new_password | app/controllers/users_controller.rb:28:27:28:38 | new_password | provenance | | -| app/controllers/users_controller.rb:26:5:26:16 | new_password | app/controllers/users_controller.rb:30:28:30:39 | new_password | provenance | | -| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | app/controllers/users_controller.rb:26:5:26:16 | new_password | provenance | | -| app/controllers/users_controller.rb:35:5:35:16 | new_password | app/controllers/users_controller.rb:37:39:37:50 | new_password | provenance | | -| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | app/controllers/users_controller.rb:35:5:35:16 | new_password | provenance | | -| app/controllers/users_controller.rb:42:5:42:16 | new_password | app/controllers/users_controller.rb:44:21:44:32 | new_password | provenance | | -| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | app/controllers/users_controller.rb:42:5:42:16 | new_password | provenance | | -| app/controllers/users_controller.rb:58:5:58:16 | new_password | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | provenance | AdditionalTaintStep | -| app/controllers/users_controller.rb:58:5:58:16 | new_password | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | provenance | AdditionalTaintStep | -| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | app/controllers/users_controller.rb:58:5:58:16 | new_password | provenance | | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :SSN] | app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :SSN] | provenance | | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :credit_card_number] | app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :credit_card_number] | provenance | | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :password] | app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :password] | provenance | | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 1, element :password] | app/controllers/users_controller.rb:85:5:85:8 | info [element 1, element :password] | provenance | | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :SSN] | app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :SSN] | provenance | | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :credit_card_number] | app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :credit_card_number] | provenance | | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :password] | app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :password] | provenance | | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 1, element :password] | app/controllers/users_controller.rb:76:5:76:8 | info [element 1, element :password] | provenance | | -| app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :SSN] | app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :SSN] | provenance | | -| app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :credit_card_number] | app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :credit_card_number] | provenance | | -| app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :password] | app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :password] | provenance | | -| app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" | app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :password] | provenance | | -| app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" | app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :credit_card_number] | provenance | | -| app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" | app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :SSN] | provenance | | -| app/controllers/users_controller.rb:83:7:83:39 | call to [] [element :password] | app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 1, element :password] | provenance | | -| app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" | app/controllers/users_controller.rb:83:7:83:39 | call to [] [element :password] | provenance | | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :SSN] | app/controllers/users_controller.rb:85:19:85:21 | inf [element :SSN] | provenance | | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :credit_card_number] | app/controllers/users_controller.rb:85:19:85:21 | inf [element :credit_card_number] | provenance | | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :password] | app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] | provenance | | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 1, element :password] | app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] | provenance | | -| app/controllers/users_controller.rb:85:19:85:21 | inf [element :SSN] | app/controllers/users_controller.rb:87:20:87:22 | inf | provenance | | -| app/controllers/users_controller.rb:85:19:85:21 | inf [element :credit_card_number] | app/controllers/users_controller.rb:87:20:87:22 | inf | provenance | | -| app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] | app/controllers/users_controller.rb:87:20:87:22 | inf | provenance | | -| app/models/user.rb:3:5:3:16 | new_password | app/models/user.rb:5:27:5:38 | new_password | provenance | | -| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | app/models/user.rb:3:5:3:16 | new_password | provenance | | -| app/models/user.rb:9:5:9:16 | new_password | app/models/user.rb:11:22:11:33 | new_password | provenance | | -| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | app/models/user.rb:9:5:9:16 | new_password | provenance | | -| app/models/user.rb:15:5:15:16 | new_password | app/models/user.rb:17:21:17:32 | new_password | provenance | | -| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | app/models/user.rb:15:5:15:16 | new_password | provenance | | +| app/controllers/users_controller.rb:21:45:21:56 | new_password : String | app/controllers/users_controller.rb:21:83:21:94 | new_password | provenance | | +| app/controllers/users_controller.rb:26:5:26:16 | new_password : String | app/controllers/users_controller.rb:28:27:28:38 | new_password | provenance | | +| app/controllers/users_controller.rb:26:5:26:16 | new_password : String | app/controllers/users_controller.rb:30:28:30:39 | new_password | provenance | | +| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : String | app/controllers/users_controller.rb:26:5:26:16 | new_password : String | provenance | | +| app/controllers/users_controller.rb:35:5:35:16 | new_password : String | app/controllers/users_controller.rb:37:39:37:50 | new_password | provenance | | +| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : String | app/controllers/users_controller.rb:35:5:35:16 | new_password : String | provenance | | +| app/controllers/users_controller.rb:42:5:42:16 | new_password : String | app/controllers/users_controller.rb:44:21:44:32 | new_password | provenance | | +| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : String | app/controllers/users_controller.rb:42:5:42:16 | new_password : String | provenance | | +| app/controllers/users_controller.rb:58:5:58:16 | new_password : String | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | provenance | AdditionalTaintStep | +| app/controllers/users_controller.rb:58:5:58:16 | new_password : String | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | provenance | AdditionalTaintStep | +| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : String | app/controllers/users_controller.rb:58:5:58:16 | new_password : String | provenance | | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :SSN] : String | app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :SSN] : String | provenance | | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :credit_card_number] : String | app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :credit_card_number] : String | provenance | | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :password] : String | app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :password] : String | provenance | | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 1, element :password] : String | app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 1, element :password] : String | provenance | | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :SSN] : String | app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :SSN] : String | provenance | | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :credit_card_number] : String | app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :credit_card_number] : String | provenance | | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :password] : String | app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :password] : String | provenance | | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 1, element :password] : String | app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 1, element :password] : String | provenance | | +| app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :SSN] : String | app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :SSN] : String | provenance | | +| app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :credit_card_number] : String | app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :credit_card_number] : String | provenance | | +| app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :password] : String | app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :password] : String | provenance | | +| app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" : String | app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :password] : String | provenance | | +| app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" : String | app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :credit_card_number] : String | provenance | | +| app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" : String | app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :SSN] : String | provenance | | +| app/controllers/users_controller.rb:83:7:83:39 | call to [] : Hash [element :password] : String | app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 1, element :password] : String | provenance | | +| app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" : String | app/controllers/users_controller.rb:83:7:83:39 | call to [] : Hash [element :password] : String | provenance | | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :SSN] : String | app/controllers/users_controller.rb:85:19:85:21 | inf [element :SSN] : String | provenance | | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :credit_card_number] : String | app/controllers/users_controller.rb:85:19:85:21 | inf [element :credit_card_number] : String | provenance | | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :password] : String | app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] : String | provenance | | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 1, element :password] : String | app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] : String | provenance | | +| app/controllers/users_controller.rb:85:19:85:21 | inf [element :SSN] : String | app/controllers/users_controller.rb:87:20:87:22 | inf | provenance | | +| app/controllers/users_controller.rb:85:19:85:21 | inf [element :credit_card_number] : String | app/controllers/users_controller.rb:87:20:87:22 | inf | provenance | | +| app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] : String | app/controllers/users_controller.rb:87:20:87:22 | inf | provenance | | +| app/models/user.rb:3:5:3:16 | new_password : String | app/models/user.rb:5:27:5:38 | new_password | provenance | | +| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : String | app/models/user.rb:3:5:3:16 | new_password : String | provenance | | +| app/models/user.rb:9:5:9:16 | new_password : String | app/models/user.rb:11:22:11:33 | new_password | provenance | | +| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : String | app/models/user.rb:9:5:9:16 | new_password : String | provenance | | +| app/models/user.rb:15:5:15:16 | new_password : String | app/models/user.rb:17:21:17:32 | new_password | provenance | | +| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : String | app/models/user.rb:15:5:15:16 | new_password : String | provenance | | nodes -| app/controllers/users_controller.rb:3:5:3:16 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | semmle.label | "043697b96909e03ca907599d6420555f" | +| app/controllers/users_controller.rb:3:5:3:16 | new_password : String | semmle.label | new_password : String | +| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : String | semmle.label | "043697b96909e03ca907599d6420555f" : String | | app/controllers/users_controller.rb:5:39:5:50 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:7:41:7:52 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:11:5:11:16 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | semmle.label | "083c9e1da4cc0c2f5480bb4dbe6ff141" | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : String | semmle.label | new_password : String | +| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : String | semmle.label | "083c9e1da4cc0c2f5480bb4dbe6ff141" : String | | app/controllers/users_controller.rb:13:42:13:53 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:15:49:15:60 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:15:49:15:60 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:15:49:15:60 | new_password : String | semmle.label | new_password : String | | app/controllers/users_controller.rb:15:87:15:98 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:19:5:19:16 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | semmle.label | "504d224a806cf8073cd14ef08242d422" | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : String | semmle.label | new_password : String | +| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : String | semmle.label | "504d224a806cf8073cd14ef08242d422" : String | | app/controllers/users_controller.rb:21:45:21:56 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:21:45:21:56 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:21:45:21:56 | new_password : String | semmle.label | new_password : String | | app/controllers/users_controller.rb:21:83:21:94 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:26:5:26:16 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | semmle.label | "7d6ae08394c3f284506dca70f05995f6" | +| app/controllers/users_controller.rb:26:5:26:16 | new_password : String | semmle.label | new_password : String | +| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : String | semmle.label | "7d6ae08394c3f284506dca70f05995f6" : String | | app/controllers/users_controller.rb:28:27:28:38 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:30:28:30:39 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:35:5:35:16 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | semmle.label | "ff295f8648a406c37fbe378377320e4c" | +| app/controllers/users_controller.rb:35:5:35:16 | new_password : String | semmle.label | new_password : String | +| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : String | semmle.label | "ff295f8648a406c37fbe378377320e4c" : String | | app/controllers/users_controller.rb:37:39:37:50 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:42:5:42:16 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | semmle.label | "78ffbec583b546bd073efd898f833184" | +| app/controllers/users_controller.rb:42:5:42:16 | new_password : String | semmle.label | new_password : String | +| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : String | semmle.label | "78ffbec583b546bd073efd898f833184" : String | | app/controllers/users_controller.rb:44:21:44:32 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:58:5:58:16 | new_password | semmle.label | new_password | -| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | semmle.label | "0157af7c38cbdd24f1616de4e5321861" | +| app/controllers/users_controller.rb:58:5:58:16 | new_password : String | semmle.label | new_password : String | +| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : String | semmle.label | "0157af7c38cbdd24f1616de4e5321861" : String | | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | semmle.label | "password: #{...}\\n" | | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | semmle.label | "password: #{...}" | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :SSN] | semmle.label | info [element 0, element :SSN] | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :credit_card_number] | semmle.label | info [element 0, element :credit_card_number] | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 0, element :password] | semmle.label | info [element 0, element :password] | -| app/controllers/users_controller.rb:76:5:76:8 | info [element 1, element :password] | semmle.label | info [element 1, element :password] | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :SSN] | semmle.label | call to [] [element 0, element :SSN] | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :credit_card_number] | semmle.label | call to [] [element 0, element :credit_card_number] | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 0, element :password] | semmle.label | call to [] [element 0, element :password] | -| app/controllers/users_controller.rb:76:12:84:5 | call to [] [element 1, element :password] | semmle.label | call to [] [element 1, element :password] | -| app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :SSN] | semmle.label | call to [] [element :SSN] | -| app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :credit_card_number] | semmle.label | call to [] [element :credit_card_number] | -| app/controllers/users_controller.rb:77:7:82:7 | call to [] [element :password] | semmle.label | call to [] [element :password] | -| app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" | semmle.label | "aaaaaaaaaa" | -| app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" | semmle.label | "0000-0000-0000-0000" | -| app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" | semmle.label | "000-00-00000" | -| app/controllers/users_controller.rb:83:7:83:39 | call to [] [element :password] | semmle.label | call to [] [element :password] | -| app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" | semmle.label | "bbbbbbb" | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :SSN] | semmle.label | info [element 0, element :SSN] | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :credit_card_number] | semmle.label | info [element 0, element :credit_card_number] | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 0, element :password] | semmle.label | info [element 0, element :password] | -| app/controllers/users_controller.rb:85:5:85:8 | info [element 1, element :password] | semmle.label | info [element 1, element :password] | -| app/controllers/users_controller.rb:85:19:85:21 | inf [element :SSN] | semmle.label | inf [element :SSN] | -| app/controllers/users_controller.rb:85:19:85:21 | inf [element :credit_card_number] | semmle.label | inf [element :credit_card_number] | -| app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] | semmle.label | inf [element :password] | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :SSN] : String | semmle.label | info : Array [element 0, element :SSN] : String | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :credit_card_number] : String | semmle.label | info : Array [element 0, element :credit_card_number] : String | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 0, element :password] : String | semmle.label | info : Array [element 0, element :password] : String | +| app/controllers/users_controller.rb:76:5:76:8 | info : Array [element 1, element :password] : String | semmle.label | info : Array [element 1, element :password] : String | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :SSN] : String | semmle.label | call to [] : Array [element 0, element :SSN] : String | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :credit_card_number] : String | semmle.label | call to [] : Array [element 0, element :credit_card_number] : String | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 0, element :password] : String | semmle.label | call to [] : Array [element 0, element :password] : String | +| app/controllers/users_controller.rb:76:12:84:5 | call to [] : Array [element 1, element :password] : String | semmle.label | call to [] : Array [element 1, element :password] : String | +| app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :SSN] : String | semmle.label | call to [] : Hash [element :SSN] : String | +| app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :credit_card_number] : String | semmle.label | call to [] : Hash [element :credit_card_number] : String | +| app/controllers/users_controller.rb:77:7:82:7 | call to [] : Hash [element :password] : String | semmle.label | call to [] : Hash [element :password] : String | +| app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" : String | semmle.label | "aaaaaaaaaa" : String | +| app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" : String | semmle.label | "0000-0000-0000-0000" : String | +| app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" : String | semmle.label | "000-00-00000" : String | +| app/controllers/users_controller.rb:83:7:83:39 | call to [] : Hash [element :password] : String | semmle.label | call to [] : Hash [element :password] : String | +| app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" : String | semmle.label | "bbbbbbb" : String | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :SSN] : String | semmle.label | info : Array [element 0, element :SSN] : String | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :credit_card_number] : String | semmle.label | info : Array [element 0, element :credit_card_number] : String | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 0, element :password] : String | semmle.label | info : Array [element 0, element :password] : String | +| app/controllers/users_controller.rb:85:5:85:8 | info : Array [element 1, element :password] : String | semmle.label | info : Array [element 1, element :password] : String | +| app/controllers/users_controller.rb:85:19:85:21 | inf [element :SSN] : String | semmle.label | inf [element :SSN] : String | +| app/controllers/users_controller.rb:85:19:85:21 | inf [element :credit_card_number] : String | semmle.label | inf [element :credit_card_number] : String | +| app/controllers/users_controller.rb:85:19:85:21 | inf [element :password] : String | semmle.label | inf [element :password] : String | | app/controllers/users_controller.rb:87:20:87:22 | inf | semmle.label | inf | -| app/models/user.rb:3:5:3:16 | new_password | semmle.label | new_password | -| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | semmle.label | "06c38c6a8a9c11a9d3b209a3193047b4" | +| app/models/user.rb:3:5:3:16 | new_password : String | semmle.label | new_password : String | +| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : String | semmle.label | "06c38c6a8a9c11a9d3b209a3193047b4" : String | | app/models/user.rb:5:27:5:38 | new_password | semmle.label | new_password | -| app/models/user.rb:9:5:9:16 | new_password | semmle.label | new_password | -| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | semmle.label | "52652fb5c709fb6b9b5a0194af7c6067" | +| app/models/user.rb:9:5:9:16 | new_password : String | semmle.label | new_password : String | +| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : String | semmle.label | "52652fb5c709fb6b9b5a0194af7c6067" : String | | app/models/user.rb:11:22:11:33 | new_password | semmle.label | new_password | -| app/models/user.rb:15:5:15:16 | new_password | semmle.label | new_password | -| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | semmle.label | "f982bf2531c149a8a1444a951b12e830" | +| app/models/user.rb:15:5:15:16 | new_password : String | semmle.label | new_password : String | +| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : String | semmle.label | "f982bf2531c149a8a1444a951b12e830" : String | | app/models/user.rb:17:21:17:32 | new_password | semmle.label | new_password | subpaths #select -| app/controllers/users_controller.rb:5:39:5:50 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | app/controllers/users_controller.rb:5:39:5:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | -| app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | app/controllers/users_controller.rb:7:41:7:52 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | +| app/controllers/users_controller.rb:5:39:5:50 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : String | app/controllers/users_controller.rb:5:39:5:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | +| app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : String | app/controllers/users_controller.rb:7:41:7:52 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" | an assignment to new_password | | app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:7:41:7:52 | new_password | app/controllers/users_controller.rb:7:41:7:52 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:7:41:7:52 | new_password | a write to password | -| app/controllers/users_controller.rb:13:42:13:53 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:13:42:13:53 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | -| app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:15:49:15:60 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | +| app/controllers/users_controller.rb:13:42:13:53 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : String | app/controllers/users_controller.rb:13:42:13:53 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | +| app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : String | app/controllers/users_controller.rb:15:49:15:60 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | | app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:15:49:15:60 | new_password | a write to password | -| app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | +| app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : String | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" | an assignment to new_password | | app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:15:49:15:60 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:15:49:15:60 | new_password | a write to password | | app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | app/controllers/users_controller.rb:15:87:15:98 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:15:87:15:98 | new_password | a write to password | -| app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | app/controllers/users_controller.rb:21:45:21:56 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | +| app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : String | app/controllers/users_controller.rb:21:45:21:56 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | | app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:21:45:21:56 | new_password | a write to password | -| app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | +| app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : String | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" | an assignment to new_password | | app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:21:45:21:56 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:21:45:21:56 | new_password | a write to password | | app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | app/controllers/users_controller.rb:21:83:21:94 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:21:83:21:94 | new_password | a write to password | -| app/controllers/users_controller.rb:28:27:28:38 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | app/controllers/users_controller.rb:28:27:28:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | -| app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | app/controllers/users_controller.rb:30:28:30:39 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | +| app/controllers/users_controller.rb:28:27:28:38 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : String | app/controllers/users_controller.rb:28:27:28:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | +| app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : String | app/controllers/users_controller.rb:30:28:30:39 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" | an assignment to new_password | | app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:30:28:30:39 | new_password | app/controllers/users_controller.rb:30:28:30:39 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:30:28:30:39 | new_password | a write to password | -| app/controllers/users_controller.rb:37:39:37:50 | new_password | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | app/controllers/users_controller.rb:37:39:37:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | an assignment to new_password | -| app/controllers/users_controller.rb:44:21:44:32 | new_password | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | app/controllers/users_controller.rb:44:21:44:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | an assignment to new_password | -| app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | -| app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | -| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" | a write to password | -| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" | a write to credit_card_number | -| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" | a write to SSN | -| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" | a write to password | -| app/models/user.rb:5:27:5:38 | new_password | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | app/models/user.rb:5:27:5:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | an assignment to new_password | -| app/models/user.rb:11:22:11:33 | new_password | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | app/models/user.rb:11:22:11:33 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | an assignment to new_password | -| app/models/user.rb:17:21:17:32 | new_password | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | app/models/user.rb:17:21:17:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | an assignment to new_password | +| app/controllers/users_controller.rb:37:39:37:50 | new_password | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : String | app/controllers/users_controller.rb:37:39:37:50 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" | an assignment to new_password | +| app/controllers/users_controller.rb:44:21:44:32 | new_password | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : String | app/controllers/users_controller.rb:44:21:44:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" | an assignment to new_password | +| app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : String | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | +| app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : String | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" | an assignment to new_password | +| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" : String | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:79:19:79:30 | "aaaaaaaaaa" | a write to password | +| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" : String | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:80:29:80:49 | "0000-0000-0000-0000" | a write to credit_card_number | +| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" : String | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:81:14:81:27 | "000-00-00000" | a write to SSN | +| app/controllers/users_controller.rb:87:20:87:22 | inf | app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" : String | app/controllers/users_controller.rb:87:20:87:22 | inf | This stores sensitive data returned by $@ as clear text. | app/controllers/users_controller.rb:83:30:83:38 | "bbbbbbb" | a write to password | +| app/models/user.rb:5:27:5:38 | new_password | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : String | app/models/user.rb:5:27:5:38 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" | an assignment to new_password | +| app/models/user.rb:11:22:11:33 | new_password | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : String | app/models/user.rb:11:22:11:33 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" | an assignment to new_password | +| app/models/user.rb:17:21:17:32 | new_password | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : String | app/models/user.rb:17:21:17:32 | new_password | This stores sensitive data returned by $@ as clear text. | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" | an assignment to new_password | diff --git a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected index 2983a67c4ca..2935e15cbd6 100644 --- a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected +++ b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected @@ -1,35 +1,35 @@ edges -| tst.rb:1:7:1:7 | r | tst.rb:2:4:2:4 | r | provenance | | -| tst.rb:2:3:2:5 | call to [] [element 0] | tst.rb:2:3:2:15 | call to pack | provenance | Config | -| tst.rb:2:4:2:4 | r | tst.rb:2:3:2:5 | call to [] [element 0] | provenance | | -| tst.rb:5:1:5:23 | totally_harmless_string | tst.rb:7:8:7:30 | totally_harmless_string | provenance | | -| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | tst.rb:5:1:5:23 | totally_harmless_string | provenance | | -| tst.rb:7:8:7:30 | totally_harmless_string | tst.rb:1:7:1:7 | r | provenance | | -| tst.rb:7:8:7:30 | totally_harmless_string | tst.rb:7:6:7:31 | call to e | provenance | Config | -| tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:1:7:1:7 | r | provenance | | -| tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:10:9:10:25 | call to e | provenance | Config | -| tst.rb:16:1:16:27 | another_questionable_string | tst.rb:17:6:17:32 | another_questionable_string | provenance | | -| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | tst.rb:16:1:16:27 | another_questionable_string | provenance | | -| tst.rb:17:6:17:32 | another_questionable_string | tst.rb:17:6:17:38 | call to strip | provenance | Config | +| tst.rb:1:7:1:7 | r : String | tst.rb:2:4:2:4 | r : String | provenance | | +| tst.rb:2:3:2:5 | call to [] : Array [element 0] : String | tst.rb:2:3:2:15 | call to pack | provenance | Config | +| tst.rb:2:4:2:4 | r : String | tst.rb:2:3:2:5 | call to [] : Array [element 0] : String | provenance | | +| tst.rb:5:1:5:23 | totally_harmless_string : String | tst.rb:7:8:7:30 | totally_harmless_string : String | provenance | | +| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : String | tst.rb:5:1:5:23 | totally_harmless_string : String | provenance | | +| tst.rb:7:8:7:30 | totally_harmless_string : String | tst.rb:1:7:1:7 | r : String | provenance | | +| tst.rb:7:8:7:30 | totally_harmless_string : String | tst.rb:7:6:7:31 | call to e | provenance | Config | +| tst.rb:10:11:10:24 | "666f6f626172" : String | tst.rb:1:7:1:7 | r : String | provenance | | +| tst.rb:10:11:10:24 | "666f6f626172" : String | tst.rb:10:9:10:25 | call to e | provenance | Config | +| tst.rb:16:1:16:27 | another_questionable_string : String | tst.rb:17:6:17:32 | another_questionable_string : String | provenance | | +| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : String | tst.rb:16:1:16:27 | another_questionable_string : String | provenance | | +| tst.rb:17:6:17:32 | another_questionable_string : String | tst.rb:17:6:17:38 | call to strip | provenance | Config | nodes -| tst.rb:1:7:1:7 | r | semmle.label | r | -| tst.rb:2:3:2:5 | call to [] [element 0] | semmle.label | call to [] [element 0] | +| tst.rb:1:7:1:7 | r : String | semmle.label | r : String | +| tst.rb:2:3:2:5 | call to [] : Array [element 0] : String | semmle.label | call to [] : Array [element 0] : String | | tst.rb:2:3:2:15 | call to pack | semmle.label | call to pack | -| tst.rb:2:4:2:4 | r | semmle.label | r | -| tst.rb:5:1:5:23 | totally_harmless_string | semmle.label | totally_harmless_string | -| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | semmle.label | "707574732822636f646520696e6a6..." | +| tst.rb:2:4:2:4 | r : String | semmle.label | r : String | +| tst.rb:5:1:5:23 | totally_harmless_string : String | semmle.label | totally_harmless_string : String | +| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : String | semmle.label | "707574732822636f646520696e6a6..." : String | | tst.rb:7:6:7:31 | call to e | semmle.label | call to e | -| tst.rb:7:8:7:30 | totally_harmless_string | semmle.label | totally_harmless_string | +| tst.rb:7:8:7:30 | totally_harmless_string : String | semmle.label | totally_harmless_string : String | | tst.rb:10:9:10:25 | call to e | semmle.label | call to e | -| tst.rb:10:11:10:24 | "666f6f626172" | semmle.label | "666f6f626172" | -| tst.rb:16:1:16:27 | another_questionable_string | semmle.label | another_questionable_string | -| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | semmle.label | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | -| tst.rb:17:6:17:32 | another_questionable_string | semmle.label | another_questionable_string | +| tst.rb:10:11:10:24 | "666f6f626172" : String | semmle.label | "666f6f626172" : String | +| tst.rb:16:1:16:27 | another_questionable_string : String | semmle.label | another_questionable_string : String | +| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : String | semmle.label | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : String | +| tst.rb:17:6:17:32 | another_questionable_string : String | semmle.label | another_questionable_string : String | | tst.rb:17:6:17:38 | call to strip | semmle.label | call to strip | subpaths -| tst.rb:7:8:7:30 | totally_harmless_string | tst.rb:1:7:1:7 | r | tst.rb:2:3:2:15 | call to pack | tst.rb:7:6:7:31 | call to e | -| tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:1:7:1:7 | r | tst.rb:2:3:2:15 | call to pack | tst.rb:10:9:10:25 | call to e | +| tst.rb:7:8:7:30 | totally_harmless_string : String | tst.rb:1:7:1:7 | r : String | tst.rb:2:3:2:15 | call to pack | tst.rb:7:6:7:31 | call to e | +| tst.rb:10:11:10:24 | "666f6f626172" : String | tst.rb:1:7:1:7 | r : String | tst.rb:2:3:2:15 | call to pack | tst.rb:10:9:10:25 | call to e | #select -| tst.rb:7:6:7:31 | call to e | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | tst.rb:7:6:7:31 | call to e | $@ is interpreted as code. | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | Hard-coded data | -| tst.rb:10:9:10:25 | call to e | tst.rb:10:11:10:24 | "666f6f626172" | tst.rb:10:9:10:25 | call to e | $@ is interpreted as an import path. | tst.rb:10:11:10:24 | "666f6f626172" | Hard-coded data | -| tst.rb:17:6:17:38 | call to strip | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | tst.rb:17:6:17:38 | call to strip | $@ is interpreted as code. | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | Hard-coded data | +| tst.rb:7:6:7:31 | call to e | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : String | tst.rb:7:6:7:31 | call to e | $@ is interpreted as code. | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." | Hard-coded data | +| tst.rb:10:9:10:25 | call to e | tst.rb:10:11:10:24 | "666f6f626172" : String | tst.rb:10:9:10:25 | call to e | $@ is interpreted as an import path. | tst.rb:10:11:10:24 | "666f6f626172" | Hard-coded data | +| tst.rb:17:6:17:38 | call to strip | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : String | tst.rb:17:6:17:38 | call to strip | $@ is interpreted as code. | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." | Hard-coded data | diff --git a/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected b/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected index fe2f0f98422..802e76f63a5 100644 --- a/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected +++ b/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected @@ -1,25 +1,25 @@ edges -| FilePermissions.rb:51:3:51:6 | perm | FilePermissions.rb:53:19:53:22 | perm | provenance | | -| FilePermissions.rb:51:3:51:6 | perm | FilePermissions.rb:54:3:54:7 | perm2 | provenance | | -| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:3:51:6 | perm | provenance | | -| FilePermissions.rb:54:3:54:7 | perm2 | FilePermissions.rb:56:19:56:23 | perm2 | provenance | | -| FilePermissions.rb:58:3:58:6 | perm | FilePermissions.rb:59:3:59:7 | perm2 | provenance | | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:58:3:58:6 | perm | provenance | | -| FilePermissions.rb:59:3:59:7 | perm2 | FilePermissions.rb:61:19:61:23 | perm2 | provenance | | +| FilePermissions.rb:51:3:51:6 | perm : Integer | FilePermissions.rb:53:19:53:22 | perm | provenance | | +| FilePermissions.rb:51:3:51:6 | perm : Integer | FilePermissions.rb:54:3:54:7 | perm2 : Integer | provenance | | +| FilePermissions.rb:51:10:51:13 | 0777 : Integer | FilePermissions.rb:51:3:51:6 | perm : Integer | provenance | | +| FilePermissions.rb:54:3:54:7 | perm2 : Integer | FilePermissions.rb:56:19:56:23 | perm2 | provenance | | +| FilePermissions.rb:58:3:58:6 | perm : String | FilePermissions.rb:59:3:59:7 | perm2 : String | provenance | | +| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : String | FilePermissions.rb:58:3:58:6 | perm : String | provenance | | +| FilePermissions.rb:59:3:59:7 | perm2 : String | FilePermissions.rb:61:19:61:23 | perm2 | provenance | | nodes | FilePermissions.rb:5:19:5:22 | 0222 | semmle.label | 0222 | | FilePermissions.rb:7:19:7:22 | 0622 | semmle.label | 0622 | | FilePermissions.rb:9:19:9:22 | 0755 | semmle.label | 0755 | | FilePermissions.rb:11:19:11:22 | 0777 | semmle.label | 0777 | | FilePermissions.rb:28:13:28:16 | 0755 | semmle.label | 0755 | -| FilePermissions.rb:51:3:51:6 | perm | semmle.label | perm | -| FilePermissions.rb:51:10:51:13 | 0777 | semmle.label | 0777 | +| FilePermissions.rb:51:3:51:6 | perm : Integer | semmle.label | perm : Integer | +| FilePermissions.rb:51:10:51:13 | 0777 : Integer | semmle.label | 0777 : Integer | | FilePermissions.rb:53:19:53:22 | perm | semmle.label | perm | -| FilePermissions.rb:54:3:54:7 | perm2 | semmle.label | perm2 | +| FilePermissions.rb:54:3:54:7 | perm2 : Integer | semmle.label | perm2 : Integer | | FilePermissions.rb:56:19:56:23 | perm2 | semmle.label | perm2 | -| FilePermissions.rb:58:3:58:6 | perm | semmle.label | perm | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | semmle.label | "u=wrx,g=rwx,o=x" | -| FilePermissions.rb:59:3:59:7 | perm2 | semmle.label | perm2 | +| FilePermissions.rb:58:3:58:6 | perm : String | semmle.label | perm : String | +| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : String | semmle.label | "u=wrx,g=rwx,o=x" : String | +| FilePermissions.rb:59:3:59:7 | perm2 : String | semmle.label | perm2 : String | | FilePermissions.rb:61:19:61:23 | perm2 | semmle.label | perm2 | | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | semmle.label | "u=rwx,o+r" | | FilePermissions.rb:67:19:67:24 | "a+rw" | semmle.label | "a+rw" | @@ -31,9 +31,9 @@ subpaths | FilePermissions.rb:9:19:9:22 | 0755 | FilePermissions.rb:9:19:9:22 | 0755 | FilePermissions.rb:9:19:9:22 | 0755 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:9:3:9:32 | call to chmod | call to chmod | | FilePermissions.rb:11:19:11:22 | 0777 | FilePermissions.rb:11:19:11:22 | 0777 | FilePermissions.rb:11:19:11:22 | 0777 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:11:3:11:32 | call to chmod | call to chmod | | FilePermissions.rb:28:13:28:16 | 0755 | FilePermissions.rb:28:13:28:16 | 0755 | FilePermissions.rb:28:13:28:16 | 0755 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:28:3:28:26 | call to chmod | call to chmod | -| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:53:19:53:22 | perm | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:53:3:53:32 | call to chmod | call to chmod | -| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:56:19:56:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:56:3:56:33 | call to chmod | call to chmod | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:61:19:61:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:61:3:61:33 | call to chmod | call to chmod | +| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 : Integer | FilePermissions.rb:53:19:53:22 | perm | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:53:3:53:32 | call to chmod | call to chmod | +| FilePermissions.rb:51:10:51:13 | 0777 | FilePermissions.rb:51:10:51:13 | 0777 : Integer | FilePermissions.rb:56:19:56:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:56:3:56:33 | call to chmod | call to chmod | +| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" | FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : String | FilePermissions.rb:61:19:61:23 | perm2 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:61:3:61:33 | call to chmod | call to chmod | | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:63:3:63:39 | call to chmod | call to chmod | | FilePermissions.rb:67:19:67:24 | "a+rw" | FilePermissions.rb:67:19:67:24 | "a+rw" | FilePermissions.rb:67:19:67:24 | "a+rw" | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:67:3:67:34 | call to chmod | call to chmod | | FilePermissions.rb:72:21:72:24 | 0755 | FilePermissions.rb:72:21:72:24 | 0755 | FilePermissions.rb:72:21:72:24 | 0755 | This overly permissive mask used in $@ allows read or write access to others. | FilePermissions.rb:72:3:72:34 | call to chmod_R | call to chmod_R | diff --git a/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected b/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected index f144157acfe..a3f4ecb3ae9 100644 --- a/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected +++ b/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected @@ -1,55 +1,55 @@ edges -| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:1:23:1:30 | password | provenance | | -| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:1:33:1:36 | cert | provenance | | +| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : String | HardcodedCredentials.rb:1:23:1:30 | password | provenance | | +| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : String | HardcodedCredentials.rb:1:33:1:36 | cert | provenance | | | HardcodedCredentials.rb:18:19:18:72 | ... + ... | HardcodedCredentials.rb:1:23:1:30 | password | provenance | | -| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:18:19:18:72 | ... + ... | provenance | Config | -| HardcodedCredentials.rb:20:1:20:7 | pw_left | HardcodedCredentials.rb:22:6:22:12 | pw_left | provenance | | -| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:20:1:20:7 | pw_left | provenance | | -| HardcodedCredentials.rb:21:1:21:8 | pw_right | HardcodedCredentials.rb:22:16:22:23 | pw_right | provenance | | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:21:1:21:8 | pw_right | provenance | | +| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : String | HardcodedCredentials.rb:18:19:18:72 | ... + ... | provenance | Config | +| HardcodedCredentials.rb:20:1:20:7 | pw_left : String | HardcodedCredentials.rb:22:6:22:12 | pw_left : String | provenance | | +| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : String | HardcodedCredentials.rb:20:1:20:7 | pw_left : String | provenance | | +| HardcodedCredentials.rb:21:1:21:8 | pw_right : String | HardcodedCredentials.rb:22:16:22:23 | pw_right : String | provenance | | +| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : String | HardcodedCredentials.rb:21:1:21:8 | pw_right : String | provenance | | | HardcodedCredentials.rb:22:1:22:2 | pw | HardcodedCredentials.rb:23:19:23:20 | pw | provenance | | -| HardcodedCredentials.rb:22:6:22:12 | pw_left | HardcodedCredentials.rb:22:6:22:23 | ... + ... | provenance | Config | +| HardcodedCredentials.rb:22:6:22:12 | pw_left : String | HardcodedCredentials.rb:22:6:22:23 | ... + ... | provenance | Config | | HardcodedCredentials.rb:22:6:22:23 | ... + ... | HardcodedCredentials.rb:22:1:22:2 | pw | provenance | | -| HardcodedCredentials.rb:22:16:22:23 | pw_right | HardcodedCredentials.rb:22:6:22:23 | ... + ... | provenance | Config | +| HardcodedCredentials.rb:22:16:22:23 | pw_right : String | HardcodedCredentials.rb:22:6:22:23 | ... + ... | provenance | Config | | HardcodedCredentials.rb:23:19:23:20 | pw | HardcodedCredentials.rb:1:23:1:30 | password | provenance | | -| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:31:18:31:23 | passwd | provenance | | -| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:18:43:25 | username | provenance | | -| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:46:43:53 | password | provenance | | +| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : String | HardcodedCredentials.rb:31:18:31:23 | passwd | provenance | | +| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" : String | HardcodedCredentials.rb:43:18:43:25 | username | provenance | | +| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" : String | HardcodedCredentials.rb:43:46:43:53 | password | provenance | | nodes | HardcodedCredentials.rb:1:23:1:30 | password | semmle.label | password | | HardcodedCredentials.rb:1:33:1:36 | cert | semmle.label | cert | | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | semmle.label | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | semmle.label | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | -| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | semmle.label | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | -| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | semmle.label | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | +| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : String | semmle.label | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : String | | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | semmle.label | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | +| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : String | semmle.label | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : String | | HardcodedCredentials.rb:18:19:18:72 | ... + ... | semmle.label | ... + ... | -| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | semmle.label | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | -| HardcodedCredentials.rb:20:1:20:7 | pw_left | semmle.label | pw_left | -| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | semmle.label | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | -| HardcodedCredentials.rb:21:1:21:8 | pw_right | semmle.label | pw_right | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | semmle.label | "4fQuzXef4f2yow8KWvIJTA==" | +| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : String | semmle.label | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : String | +| HardcodedCredentials.rb:20:1:20:7 | pw_left : String | semmle.label | pw_left : String | +| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : String | semmle.label | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : String | +| HardcodedCredentials.rb:21:1:21:8 | pw_right : String | semmle.label | pw_right : String | +| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : String | semmle.label | "4fQuzXef4f2yow8KWvIJTA==" : String | | HardcodedCredentials.rb:22:1:22:2 | pw | semmle.label | pw | -| HardcodedCredentials.rb:22:6:22:12 | pw_left | semmle.label | pw_left | +| HardcodedCredentials.rb:22:6:22:12 | pw_left : String | semmle.label | pw_left : String | | HardcodedCredentials.rb:22:6:22:23 | ... + ... | semmle.label | ... + ... | -| HardcodedCredentials.rb:22:16:22:23 | pw_right | semmle.label | pw_right | +| HardcodedCredentials.rb:22:16:22:23 | pw_right : String | semmle.label | pw_right : String | | HardcodedCredentials.rb:23:19:23:20 | pw | semmle.label | pw | | HardcodedCredentials.rb:31:18:31:23 | passwd | semmle.label | passwd | -| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | semmle.label | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | +| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : String | semmle.label | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : String | | HardcodedCredentials.rb:43:18:43:25 | username | semmle.label | username | -| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | semmle.label | "user@test.com" | +| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" : String | semmle.label | "user@test.com" : String | | HardcodedCredentials.rb:43:46:43:53 | password | semmle.label | password | -| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | semmle.label | "abcdef123456" | +| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" : String | semmle.label | "abcdef123456" : String | subpaths #select | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | This hardcoded value is $@. | HardcodedCredentials.rb:4:20:4:65 | "xwjVWdfzfRlbcgKkbSfG/xSrUeHYq..." | used as credentials | | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | This hardcoded value is $@. | HardcodedCredentials.rb:8:30:8:75 | "X6BLgRWSAtAWG/GaHS+WGGW2K7zZF..." | used as credentials | -| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | -| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:1:33:1:36 | cert | This hardcoded value is $@. | HardcodedCredentials.rb:1:33:1:36 | cert | used as credentials | +| HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." | HardcodedCredentials.rb:12:19:12:64 | "4NQX/CqB5Ae98zFUmwj1DMpF7azsh..." : String | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | This hardcoded value is $@. | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | used as credentials | -| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | -| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | -| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:31:18:31:23 | passwd | This hardcoded value is $@. | HardcodedCredentials.rb:31:18:31:23 | passwd | used as credentials | -| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:18:43:25 | username | This hardcoded value is $@. | HardcodedCredentials.rb:43:18:43:25 | username | used as credentials | -| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:46:43:53 | password | This hardcoded value is $@. | HardcodedCredentials.rb:43:46:43:53 | password | used as credentials | +| HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : String | HardcodedCredentials.rb:1:33:1:36 | cert | This hardcoded value is $@. | HardcodedCredentials.rb:1:33:1:36 | cert | used as credentials | +| HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." | HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : String | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." | HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : String | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" | HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : String | HardcodedCredentials.rb:1:23:1:30 | password | This hardcoded value is $@. | HardcodedCredentials.rb:1:23:1:30 | password | used as credentials | +| HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." | HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : String | HardcodedCredentials.rb:31:18:31:23 | passwd | This hardcoded value is $@. | HardcodedCredentials.rb:31:18:31:23 | passwd | used as credentials | +| HardcodedCredentials.rb:43:29:43:43 | "user@test.com" | HardcodedCredentials.rb:43:29:43:43 | "user@test.com" : String | HardcodedCredentials.rb:43:18:43:25 | username | This hardcoded value is $@. | HardcodedCredentials.rb:43:18:43:25 | username | used as credentials | +| HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" | HardcodedCredentials.rb:43:57:43:70 | "abcdef123456" : String | HardcodedCredentials.rb:43:46:43:53 | password | This hardcoded value is $@. | HardcodedCredentials.rb:43:46:43:53 | password | used as credentials | diff --git a/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected b/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected index 2ea527a3fc6..67e59fb08c1 100644 --- a/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected +++ b/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected @@ -1,16 +1,16 @@ testFailures edges -| insecure_download.rb:31:5:31:7 | url | insecure_download.rb:33:15:33:17 | url | provenance | | -| insecure_download.rb:31:5:31:7 | url | insecure_download.rb:33:15:33:17 | url | provenance | | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:31:5:31:7 | url | provenance | | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:31:5:31:7 | url | provenance | | +| insecure_download.rb:31:5:31:7 | url : String | insecure_download.rb:33:15:33:17 | url | provenance | | +| insecure_download.rb:31:5:31:7 | url : String | insecure_download.rb:33:15:33:17 | url | provenance | | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | insecure_download.rb:31:5:31:7 | url : String | provenance | | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | insecure_download.rb:31:5:31:7 | url : String | provenance | | nodes | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | -| insecure_download.rb:31:5:31:7 | url | semmle.label | url | -| insecure_download.rb:31:5:31:7 | url | semmle.label | url | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | +| insecure_download.rb:31:5:31:7 | url : String | semmle.label | url : String | +| insecure_download.rb:31:5:31:7 | url : String | semmle.label | url : String | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | semmle.label | "http://example.org/unsafe.APK" : String | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | semmle.label | "http://example.org/unsafe.APK" : String | | insecure_download.rb:33:15:33:17 | url | semmle.label | url | | insecure_download.rb:33:15:33:17 | url | semmle.label | url | | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | semmle.label | "http://example.org/unsafe" | @@ -21,8 +21,8 @@ subpaths #select | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | $@ | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | $@ | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | -| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | -| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" | "http://example.org/unsafe.APK" | +| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | "http://example.org/unsafe.APK" : String | +| insecure_download.rb:33:15:33:17 | url | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : String | "http://example.org/unsafe.APK" : String | | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:33:15:33:17 | url | url | | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | insecure_download.rb:33:15:33:17 | url | $@ | insecure_download.rb:33:15:33:17 | url | url | | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | $@ | insecure_download.rb:37:42:37:68 | "http://example.org/unsafe" | "http://example.org/unsafe" | diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll index f46b62f51e2..e08d8467814 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll @@ -14,6 +14,9 @@ signature module InputSig DataFlowL /** Holds if `call` should be excluded from the consistency test `uniqueCallEnclosingCallable`. */ default predicate uniqueCallEnclosingCallableExclude(DataFlowLang::DataFlowCall call) { none() } + /** Holds if `n` should be excluded from the consistency test `uniqueType`. */ + default predicate uniqueTypeExclude(DataFlowLang::Node n) { none() } + /** Holds if `n` should be excluded from the consistency test `uniqueNodeLocation`. */ default predicate uniqueNodeLocationExclude(DataFlowLang::Node n) { none() } @@ -123,6 +126,7 @@ module MakeConsistency< n instanceof RelevantNode and c = count(getNodeType(n)) and c != 1 and + not Input::uniqueTypeExclude(n) and msg = "Node should have one type but has " + c + "." ) } From 37212cc43f03295af8cd4648bdb3b71500a52cab Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 20 Dec 2024 11:04:29 +0100 Subject: [PATCH 05/71] Ruby: Add change note --- ruby/ql/lib/change-notes/2024-12-20-data-flow-types.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ruby/ql/lib/change-notes/2024-12-20-data-flow-types.md diff --git a/ruby/ql/lib/change-notes/2024-12-20-data-flow-types.md b/ruby/ql/lib/change-notes/2024-12-20-data-flow-types.md new file mode 100644 index 00000000000..d47b8b77e7e --- /dev/null +++ b/ruby/ql/lib/change-notes/2024-12-20-data-flow-types.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Types are now being tracked in data flow, but only when the type of an object is obvious from the context. For example, `C.new` has guaranteed type `C`, while in `def add(x, y) { x + y }` we cannot assign a type to `x + y` (it could, for instance, be both `String` and `Integer`). Tracking types allows us to remove false-positive results when type incompatibility can be established. \ No newline at end of file From c77bf2b4ebb52afecf31e3eddfc3492b91a78f6b Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 3 Jan 2025 17:11:49 +0000 Subject: [PATCH 06/71] Rust: Add a test for sensitive data. --- .../test/library-tests/sensitivedata/test.rs | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 rust/ql/test/library-tests/sensitivedata/test.rs diff --git a/rust/ql/test/library-tests/sensitivedata/test.rs b/rust/ql/test/library-tests/sensitivedata/test.rs new file mode 100644 index 00000000000..e0c0c6aa50d --- /dev/null +++ b/rust/ql/test/library-tests/sensitivedata/test.rs @@ -0,0 +1,150 @@ + +fn get_string() -> String { "string".to_string() } + +fn sink(_: T) { } + +// --- tests --- + +struct MyStruct { + harmless: String, + password: String, + password_file_path: String, + password_enabled: String, +} + +impl MyStruct { + fn get_certificate(&self) -> String { return get_string() } + fn get_certificate_url(&self) -> String { return get_string() } + fn get_certificate_file(&self) -> String { return get_string() } +} + +fn get_password() -> String { get_string() } + +fn test_passwords( + password: &str, passwd: &str, my_password: &str, password_str: &str, pass_phrase: &str, + auth_key: &str, authenticationkey: &str, authKey: &str, + harmless: &str, encrypted_password: &str, password_hash: &str, + ms: &MyStruct +) { + // passwords + sink(password); // $ MISSING: sensitive=password + sink(passwd); // $ MISSING: sensitive=password + sink(my_password); // $ MISSING: sensitive=password + sink(password_str); // $ MISSING: sensitive=password + sink(pass_phrase); // $ MISSING: sensitive=password + sink(auth_key); // $ MISSING: sensitive=password + sink(authenticationkey); // $ MISSING: sensitive=password + sink(authKey); // $ MISSING: sensitive=password + + sink(ms); // $ MISSING: sensitive=password + sink(ms.password.as_str()); // $ MISSING: sensitive=password + + sink(get_password()); // $ MISSING: sensitive=password + let password2 = get_string(); + sink(password2); // $ MISSING: sensitive=password + + // not passwords + sink(harmless); + sink(encrypted_password); + sink(password_hash); + + sink(ms.harmless.as_str()); + sink(ms.password_file_path.as_str()); + sink(ms.password_enabled.as_str()); + + sink(get_string()); + let harmless2 = get_string(); + sink(harmless2); +} + +fn generate_secret_key() -> String { get_string() } +fn get_secure_key() -> String { get_string() } +fn get_private_key() -> String { get_string() } +fn get_public_key() -> String { get_string() } +fn get_secret_token() -> String { get_string() } +fn get_next_token() -> String { get_string() } + +fn test_credentials( + account_key: &str, accnt_key: &str, license_key: &str, secret_key: &str, is_secret: bool, num_accounts: i64, uid: i64, + ms: &MyStruct +) { + // credentials + sink(account_key); // $ MISSING: sensitive=secret + sink(accnt_key); // $ MISSING: sensitive=secret + sink(license_key); // $ MISSING: sensitive=secret + sink(secret_key); // $ MISSING: sensitive=secret + + sink(ms.get_certificate()); // $ MISSING: sensitive=certificate + + sink(generate_secret_key()); // $ MISSING: sensitive=secret + sink(get_secure_key()); // $ MISSING: sensitive=secret + sink(get_private_key()); // $ MISSING: sensitive=secret + sink(get_secret_token()); // $ MISSING: sensitive=secret + + // not credentials + sink(is_secret); + sink(num_accounts); + sink(uid); + + sink(ms.get_certificate_url()); + sink(ms.get_certificate_file()); + + sink(get_public_key()); + sink(get_next_token()); +} + +struct Financials { + harmless: String, + my_bank_account_number: String, + credit_card_no: String, + credit_rating: i32, + user_ccn: String +} + +struct MyPrivateInfo { + mobile_phone_num: String, + contact_email: String, + contact_e_mail_2: String, + my_ssn: String, + birthday: String, + emergency_contact: String, + name_of_employer: String, + + medical_notes: Vec, + latitude: f64, + longitude: Option, + + financials: Financials +} + +fn test_private_info( + info: &MyPrivateInfo +) { + // private info + sink(info.mobile_phone_num.as_str()); // $ MISSING: sensitive=private + sink(info.mobile_phone_num.to_string()); // $ MISSING: sensitive=private + sink(info.contact_email.as_str()); // $ MISSING: sensitive=private + sink(info.contact_e_mail_2.as_str()); // $ MISSING: sensitive=private + sink(info.my_ssn.as_str()); // $ MISSING: sensitive=private + sink(info.birthday.as_str()); // $ MISSING: sensitive=private + sink(info.emergency_contact.as_str()); // $ MISSING: sensitive=private + sink(info.name_of_employer.as_str()); // $ MISSING: sensitive=private + + sink(&info.medical_notes); // $ MISSING: sensitive=private + sink(info.medical_notes[0].as_str()); // $ MISSING: sensitive=private + for n in info.medical_notes.iter() { + sink(n.as_str()); // $ MISSING: sensitive=private + } + + sink(info.latitude); // $ MISSING: sensitive=private + let x = info.longitude.unwrap(); + sink(x); // $ MISSING: sensitive=private + + sink(info.financials.my_bank_account_number.as_str()); // $ MISSING: sensitive=private + sink(info.financials.credit_card_no.as_str()); // $ MISSING: sensitive=private + sink(info.financials.credit_rating); // $ MISSING: sensitive=private + sink(info.financials.user_ccn.as_str()); // $ MISSING: sensitive=private + + // not private info + sink(info.financials.harmless.as_str()); +} From 821eb4f3e648d79741aae304a7bd1d73f419bfe8 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 3 Jan 2025 17:21:57 +0000 Subject: [PATCH 07/71] Rust: Add sensitive data library. --- config/identical-files.json | 3 +- .../codeql/rust/security/SensitiveData.qll | 86 ++++++++ .../internal/SensitiveDataHeuristics.qll | 188 ++++++++++++++++++ .../sensitivedata/SensitiveData.expected | 0 .../sensitivedata/SensitiveData.ql | 36 ++++ .../test/library-tests/sensitivedata/test.rs | 36 ++-- 6 files changed, 330 insertions(+), 19 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/security/SensitiveData.qll create mode 100644 rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll create mode 100644 rust/ql/test/library-tests/sensitivedata/SensitiveData.expected create mode 100644 rust/ql/test/library-tests/sensitivedata/SensitiveData.ql diff --git a/config/identical-files.json b/config/identical-files.json index b066c443d9f..56aac560473 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -247,7 +247,8 @@ "javascript/ql/lib/semmle/javascript/security/internal/SensitiveDataHeuristics.qll", "python/ql/lib/semmle/python/security/internal/SensitiveDataHeuristics.qll", "ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll", - "swift/ql/lib/codeql/swift/security/internal/SensitiveDataHeuristics.qll" + "swift/ql/lib/codeql/swift/security/internal/SensitiveDataHeuristics.qll", + "rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll" ], "IncompleteUrlSubstringSanitization": [ "javascript/ql/src/Security/CWE-020/IncompleteUrlSubstringSanitization.qll", diff --git a/rust/ql/lib/codeql/rust/security/SensitiveData.qll b/rust/ql/lib/codeql/rust/security/SensitiveData.qll new file mode 100644 index 00000000000..a8164e3ab7c --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/SensitiveData.qll @@ -0,0 +1,86 @@ +/** + * Provides classes and predicates for identifying sensitive data. + * + * 'Sensitive' data is anything that should not be sent in unencrypted form. This library tries to + * guess where sensitive data may either be stored in a variable or produced by a method. + */ + +import rust +private import internal.SensitiveDataHeuristics +private import codeql.rust.dataflow.DataFlow + +/** + * A data flow node that might contain sensitive data. + */ +cached +abstract class SensitiveData extends DataFlow::Node { + /** + * Gets a classification of the kind of sensitive data this expression might contain. + */ + cached + abstract SensitiveDataClassification getClassification(); +} + +/** + * A function that might produce sensitive data. + */ +private class SensitiveDataFunction extends Function { + SensitiveDataClassification classification; + + SensitiveDataFunction() { + HeuristicNames::nameIndicatesSensitiveData(this.getName().getText(), classification) + } + + SensitiveDataClassification getClassification() { result = classification } +} + +/** + * A function call that might produce sensitive data. + */ +private class SensitiveDataCall extends SensitiveData { + SensitiveDataClassification classification; + + SensitiveDataCall() { + classification = + this.asExpr() + .getAstNode() + .(CallExprBase) + .getStaticTarget() + .(SensitiveDataFunction) + .getClassification() + } + + override SensitiveDataClassification getClassification() { result = classification } +} + +/** + * A variable that might contain sensitive data. + */ +private class SensitiveDataVariable extends Variable { + SensitiveDataClassification classification; + + SensitiveDataVariable() { + HeuristicNames::nameIndicatesSensitiveData(this.getName(), classification) + } + + SensitiveDataClassification getClassification() { result = classification } +} + +/** + * A variable access that might produce sensitive data. + */ +private class SensitiveVariableAccess extends SensitiveData { + SensitiveDataClassification classification; + + SensitiveVariableAccess() { + classification = + this.asExpr() + .getAstNode() + .(VariableAccess) + .getVariable() + .(SensitiveDataVariable) + .getClassification() + } + + override SensitiveDataClassification getClassification() { result = classification } +} diff --git a/rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll b/rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll new file mode 100644 index 00000000000..eb8a0c1fe75 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll @@ -0,0 +1,188 @@ +/** + * INTERNAL: Do not use. + * + * Provides classes and predicates for identifying strings that may indicate the presence of sensitive data. + * Such that we can share this logic across our CodeQL analysis of different languages. + * + * 'Sensitive' data in general is anything that should not be sent around in unencrypted form. + */ + +/** + * A classification of different kinds of sensitive data: + * + * - secret: generic secret or trusted data; + * - id: a user name or other account information; + * - password: a password or authorization key; + * - certificate: a certificate. + * - private: private data such as credit card numbers + * + * While classifications are represented as strings, this should not be relied upon. + * Instead, use the predicates in `SensitiveDataClassification::` to work with + * classifications. + */ +class SensitiveDataClassification extends string { + SensitiveDataClassification() { this in ["secret", "id", "password", "certificate", "private"] } +} + +/** + * Provides predicates to select the different kinds of sensitive data we support. + */ +module SensitiveDataClassification { + /** Gets the classification for secret or trusted data. */ + SensitiveDataClassification secret() { result = "secret" } + + /** Gets the classification for user names or other account information. */ + SensitiveDataClassification id() { result = "id" } + + /** Gets the classification for passwords or authorization keys. */ + SensitiveDataClassification password() { result = "password" } + + /** Gets the classification for certificates. */ + SensitiveDataClassification certificate() { result = "certificate" } + + /** Gets the classification for private data. */ + SensitiveDataClassification private() { result = "private" } +} + +/** + * INTERNAL: Do not use. + * + * Provides heuristics for identifying names related to sensitive information. + */ +module HeuristicNames { + /** + * Gets a regular expression that identifies strings that may indicate the presence of secret + * or trusted data. + */ + string maybeSecret() { result = "(?is).*((?; + +module SensitiveDataTest implements TestSig { + string getARelevantTag() { result = "sensitive" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(DataFlow::Node source, DataFlow::Node sink | + SensitiveDataFlow::flow(source, sink) and + location = sink.getLocation() and + element = sink.toString() and + tag = "sensitive" and + value = source.(SensitiveData).getClassification() + ) + } +} + +import MakeTest diff --git a/rust/ql/test/library-tests/sensitivedata/test.rs b/rust/ql/test/library-tests/sensitivedata/test.rs index e0c0c6aa50d..858526642c6 100644 --- a/rust/ql/test/library-tests/sensitivedata/test.rs +++ b/rust/ql/test/library-tests/sensitivedata/test.rs @@ -27,21 +27,21 @@ fn test_passwords( ms: &MyStruct ) { // passwords - sink(password); // $ MISSING: sensitive=password - sink(passwd); // $ MISSING: sensitive=password - sink(my_password); // $ MISSING: sensitive=password - sink(password_str); // $ MISSING: sensitive=password + sink(password); // $ sensitive=password + sink(passwd); // $ sensitive=password + sink(my_password); // $ sensitive=password + sink(password_str); // $ sensitive=password sink(pass_phrase); // $ MISSING: sensitive=password sink(auth_key); // $ MISSING: sensitive=password - sink(authenticationkey); // $ MISSING: sensitive=password - sink(authKey); // $ MISSING: sensitive=password + sink(authenticationkey); // $ sensitive=password + sink(authKey); // $ sensitive=password sink(ms); // $ MISSING: sensitive=password sink(ms.password.as_str()); // $ MISSING: sensitive=password - sink(get_password()); // $ MISSING: sensitive=password + sink(get_password()); // $ sensitive=password let password2 = get_string(); - sink(password2); // $ MISSING: sensitive=password + sink(password2); // $ sensitive=password // not passwords sink(harmless); @@ -69,25 +69,25 @@ fn test_credentials( ms: &MyStruct ) { // credentials - sink(account_key); // $ MISSING: sensitive=secret - sink(accnt_key); // $ MISSING: sensitive=secret + sink(account_key); // $ sensitive=id + sink(accnt_key); // $ sensitive=id sink(license_key); // $ MISSING: sensitive=secret - sink(secret_key); // $ MISSING: sensitive=secret + sink(secret_key); // $ sensitive=secret - sink(ms.get_certificate()); // $ MISSING: sensitive=certificate + sink(ms.get_certificate()); // $ sensitive=certificate - sink(generate_secret_key()); // $ MISSING: sensitive=secret + sink(generate_secret_key()); // $ sensitive=secret sink(get_secure_key()); // $ MISSING: sensitive=secret sink(get_private_key()); // $ MISSING: sensitive=secret - sink(get_secret_token()); // $ MISSING: sensitive=secret + sink(get_secret_token()); // $ sensitive=secret // not credentials sink(is_secret); - sink(num_accounts); - sink(uid); + sink(num_accounts); // $ SPURIOUS: sensitive=id + sink(uid); // $ SPURIOUS: sensitive=id - sink(ms.get_certificate_url()); - sink(ms.get_certificate_file()); + sink(ms.get_certificate_url()); // $ SPURIOUS: sensitive=certificate + sink(ms.get_certificate_file()); // $ SPURIOUS: sensitive=certificate sink(get_public_key()); sink(get_next_token()); From e1e980c2e80d1e9e837b3a1a2cecdf890373f780 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 3 Jan 2025 18:57:42 +0000 Subject: [PATCH 08/71] Rust: Add sensitive data to summary queries. --- rust/ql/src/queries/summary/SensitiveData.ql | 15 +++++++++++++++ rust/ql/src/queries/summary/SummaryStats.ql | 3 +++ .../query-tests/diagnostics/SummaryStats.expected | 1 + 3 files changed, 19 insertions(+) create mode 100644 rust/ql/src/queries/summary/SensitiveData.ql diff --git a/rust/ql/src/queries/summary/SensitiveData.ql b/rust/ql/src/queries/summary/SensitiveData.ql new file mode 100644 index 00000000000..86686ab0432 --- /dev/null +++ b/rust/ql/src/queries/summary/SensitiveData.ql @@ -0,0 +1,15 @@ +/** + * @name Sensitive Data + * @description List all sensitive data found in the database. Sensitive data is anything that + * should not be sent in unencrypted form. + * @kind problem + * @problem.severity info + * @id rust/summary/sensitive-data + * @tags summary + */ + +import rust +import codeql.rust.security.SensitiveData + +from SensitiveData d +select d, "Sensitive data (" + d.getClassification() + "): " + d.toString() diff --git a/rust/ql/src/queries/summary/SummaryStats.ql b/rust/ql/src/queries/summary/SummaryStats.ql index 2e30fde143a..005233f87cf 100644 --- a/rust/ql/src/queries/summary/SummaryStats.ql +++ b/rust/ql/src/queries/summary/SummaryStats.ql @@ -8,6 +8,7 @@ import rust import codeql.rust.Concepts +import codeql.rust.security.SensitiveData import codeql.rust.Diagnostics import Stats @@ -56,4 +57,6 @@ where key = "Taint sources - total" and value = count(ThreatModelSource s) or key = "Taint sources - active" and value = count(ActiveThreatModelSource s) + or + key = "Sensitive data" and value = count(SensitiveData d) select key, value order by key diff --git a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected index a5295af6e10..c8c0fe398aa 100644 --- a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected +++ b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected @@ -14,5 +14,6 @@ | Macro calls - resolved | 8 | | Macro calls - total | 9 | | Macro calls - unresolved | 1 | +| Sensitive data | 0 | | Taint sources - active | 0 | | Taint sources - total | 0 | From f93aac07c2f11182b57dcdf7cdc5bdc9cf1a8cea Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Jan 2025 13:33:34 +0000 Subject: [PATCH 09/71] Rust: Correct / clarify some QLDoc. --- rust/ql/lib/codeql/rust/security/SensitiveData.qll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/SensitiveData.qll b/rust/ql/lib/codeql/rust/security/SensitiveData.qll index a8164e3ab7c..ac17a3ee075 100644 --- a/rust/ql/lib/codeql/rust/security/SensitiveData.qll +++ b/rust/ql/lib/codeql/rust/security/SensitiveData.qll @@ -15,7 +15,7 @@ private import codeql.rust.dataflow.DataFlow cached abstract class SensitiveData extends DataFlow::Node { /** - * Gets a classification of the kind of sensitive data this expression might contain. + * Gets the classification of sensitive data this expression might contain. */ cached abstract SensitiveDataClassification getClassification(); @@ -35,7 +35,7 @@ private class SensitiveDataFunction extends Function { } /** - * A function call that might produce sensitive data. + * A function call data flow node that might produce sensitive data. */ private class SensitiveDataCall extends SensitiveData { SensitiveDataClassification classification; @@ -67,7 +67,7 @@ private class SensitiveDataVariable extends Variable { } /** - * A variable access that might produce sensitive data. + * A variable access data flow node that might produce sensitive data. */ private class SensitiveVariableAccess extends SensitiveData { SensitiveDataClassification classification; From 9d178ab8d69d55b5a05d6be2c5b2c3a679d507fa Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Jan 2025 14:05:02 +0000 Subject: [PATCH 10/71] Rust: Fix the failing integration tests. --- rust/ql/integration-tests/hello-project/summary.expected | 1 + rust/ql/integration-tests/hello-workspace/summary.cargo.expected | 1 + .../hello-workspace/summary.rust-project.expected | 1 + 3 files changed, 3 insertions(+) diff --git a/rust/ql/integration-tests/hello-project/summary.expected b/rust/ql/integration-tests/hello-project/summary.expected index 5972bf15827..07c48c7a5b7 100644 --- a/rust/ql/integration-tests/hello-project/summary.expected +++ b/rust/ql/integration-tests/hello-project/summary.expected @@ -14,5 +14,6 @@ | Macro calls - resolved | 2 | | Macro calls - total | 2 | | Macro calls - unresolved | 0 | +| Sensitive data | 0 | | Taint sources - active | 0 | | Taint sources - total | 0 | diff --git a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected index 27545551f12..eb8f861f935 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected @@ -14,5 +14,6 @@ | Macro calls - resolved | 2 | | Macro calls - total | 2 | | Macro calls - unresolved | 0 | +| Sensitive data | 0 | | Taint sources - active | 0 | | Taint sources - total | 0 | diff --git a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected index 40992231f2b..5c57c488fda 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected @@ -14,5 +14,6 @@ | Macro calls - resolved | 2 | | Macro calls - total | 2 | | Macro calls - unresolved | 0 | +| Sensitive data | 0 | | Taint sources - active | 0 | | Taint sources - total | 0 | From a121c5a5d062d11166f898cc13c8e2ca3bd7c405 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 6 Jan 2025 18:20:22 +0000 Subject: [PATCH 11/71] Release preparation for version 2.20.1 --- actions/ql/lib/CHANGELOG.md | 5 +++++ actions/ql/lib/change-notes/released/0.4.0.md | 5 +++++ actions/ql/lib/codeql-pack.release.yml | 2 ++ actions/ql/lib/qlpack.yml | 2 +- .../CHANGELOG.md} | 7 ++++--- .../0.4.0.md} | 7 ++++--- actions/ql/src/codeql-pack.release.yml | 2 ++ actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 19 +++++++++++++++++ .../2024-12-04-guard-conditions.md | 4 ---- .../2024-12-17-template-parameter-base.md | 4 ---- .../2024-12-17-template-parameter.md | 4 ---- .../2024-12-18-non-type-template-parameter.md | 4 ---- .../change-notes/2024-12-20-sizeof-pack.md | 4 ---- ...4-12-20-template-template-instantiation.md | 6 ------ cpp/ql/lib/change-notes/released/3.1.0.md | 18 ++++++++++++++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 10 +++++++++ .../2024-11-27-active-template-library.md | 4 ---- .../2024-12-05-badly-bounded-write.md | 4 ---- ...024-12-05-wrong-number-format-arguments.md | 4 ---- .../2024-12-05-wrong-type-format-args.md | 4 ---- ...024-12-18-return-stack-allocated-memory.md | 4 ---- cpp/ql/src/change-notes/released/1.3.1.md | 9 ++++++++ cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../lib/change-notes/released/1.7.31.md | 3 +++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../src/change-notes/released/1.7.31.md | 3 +++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 13 ++++++++++++ .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ---- .../ql/lib/change-notes/2024-12-04-dotnet9.md | 4 ---- .../2024-12-05-aspnetcore-mvc-model.md | 4 ---- ...add-markupstring-as-html-injection-sink.md | 4 ---- .../2024-12-18-blazor-attribute-sources.md | 6 ------ .../2024-12-20-collection-params.md | 4 ---- csharp/ql/lib/change-notes/released/4.0.1.md | 12 +++++++++++ csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 6 ++++++ .../1.0.14.md} | 7 ++++--- csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 8 +++++++ ...-improve-flow-out-of-variadic-parameter.md | 4 ---- .../2024-12-12-variadic-parameter-sources.md | 4 ---- .../change-notes/2024-12-13-os-args-model.md | 5 ----- go/ql/lib/change-notes/released/3.0.1.md | 7 +++++++ go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.1.5.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 21 +++++++++++++++++++ ...sttemplate-getforobject-third-parameter.md | 4 ---- .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ---- .../change-notes/2024-12-06-file-getname.md | 4 ---- .../6.0.0.md} | 13 +++++++++--- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.1.11.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ++++ .../ql/lib/change-notes/released/2.2.1.md | 3 +++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 4 ++++ .../ql/src/change-notes/released/1.2.6.md | 3 +++ javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 11 ++++++++++ .../2024-12-18-fastapi-request-modeling.md | 5 ----- .../3.1.0.md} | 11 +++++++--- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 6 ++++++ .../1.4.0.md} | 9 ++++---- python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ++++ ruby/ql/lib/change-notes/released/3.0.1.md | 3 +++ ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.1.9.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 6 ++++++ .../1.1.8.md} | 7 ++++--- shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.14.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.14.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/1.0.14.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ .../tutorial/change-notes/released/1.0.14.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ .../typeflow/change-notes/released/1.0.14.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.14.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.1.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.14.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.14.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 6 ++++++ .../3.1.0.md} | 7 ++++--- swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.0.14.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 168 files changed, 447 insertions(+), 197 deletions(-) create mode 100644 actions/ql/lib/CHANGELOG.md create mode 100644 actions/ql/lib/change-notes/released/0.4.0.md create mode 100644 actions/ql/lib/codeql-pack.release.yml rename actions/ql/{lib/change-notes/2024-12-19-initial-release.md => src/CHANGELOG.md} (55%) rename actions/ql/src/change-notes/{2024-12-19-initial-release.md => released/0.4.0.md} (55%) create mode 100644 actions/ql/src/codeql-pack.release.yml delete mode 100644 cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md create mode 100644 cpp/ql/lib/change-notes/released/3.1.0.md delete mode 100644 cpp/ql/src/change-notes/2024-11-27-active-template-library.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md delete mode 100644 cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md create mode 100644 cpp/ql/src/change-notes/released/1.3.1.md create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-04-dotnet9.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-20-collection-params.md create mode 100644 csharp/ql/lib/change-notes/released/4.0.1.md rename csharp/ql/src/change-notes/{2024-12-17-move-libraries.md => released/1.0.14.md} (65%) create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.14.md delete mode 100644 go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md delete mode 100644 go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md delete mode 100644 go/ql/lib/change-notes/2024-12-13-os-args-model.md create mode 100644 go/ql/lib/change-notes/released/3.0.1.md create mode 100644 go/ql/src/change-notes/released/1.1.5.md delete mode 100644 java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md delete mode 100644 java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md delete mode 100644 java/ql/lib/change-notes/2024-12-06-file-getname.md rename java/ql/lib/change-notes/{2024-11-14-control-flow-graph-lightweight-IR-layer.md => released/6.0.0.md} (50%) create mode 100644 java/ql/src/change-notes/released/1.1.11.md create mode 100644 javascript/ql/lib/change-notes/released/2.2.1.md create mode 100644 javascript/ql/src/change-notes/released/1.2.6.md create mode 100644 misc/suite-helpers/change-notes/released/1.0.14.md delete mode 100644 python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md rename python/ql/lib/change-notes/{2024-11-26-parameter-annotation-api-graph-support.md => released/3.1.0.md} (58%) rename python/ql/src/change-notes/{2024-11-21-template-injection.md => released/1.4.0.md} (78%) create mode 100644 ruby/ql/lib/change-notes/released/3.0.1.md create mode 100644 ruby/ql/src/change-notes/released/1.1.9.md create mode 100644 shared/controlflow/change-notes/released/1.0.14.md rename shared/dataflow/change-notes/{2023-10-02-deduplicate-path-graph.md => released/1.1.8.md} (77%) create mode 100644 shared/mad/change-notes/released/1.0.14.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.14.md create mode 100644 shared/regex/change-notes/released/1.0.14.md create mode 100644 shared/ssa/change-notes/released/1.0.14.md create mode 100644 shared/threat-models/change-notes/released/1.0.14.md create mode 100644 shared/tutorial/change-notes/released/1.0.14.md create mode 100644 shared/typeflow/change-notes/released/1.0.14.md create mode 100644 shared/typetracking/change-notes/released/1.0.14.md create mode 100644 shared/typos/change-notes/released/1.0.14.md create mode 100644 shared/util/change-notes/released/2.0.1.md create mode 100644 shared/xml/change-notes/released/1.0.14.md create mode 100644 shared/yaml/change-notes/released/1.0.14.md rename swift/ql/lib/change-notes/{2024-12-09-swift-6.md => released/3.1.0.md} (51%) create mode 100644 swift/ql/src/change-notes/released/1.0.14.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md new file mode 100644 index 00000000000..7ad10899ce1 --- /dev/null +++ b/actions/ql/lib/CHANGELOG.md @@ -0,0 +1,5 @@ +## 0.4.0 + +### New Features + +* Initial public preview release diff --git a/actions/ql/lib/change-notes/released/0.4.0.md b/actions/ql/lib/change-notes/released/0.4.0.md new file mode 100644 index 00000000000..7ad10899ce1 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.0.md @@ -0,0 +1,5 @@ +## 0.4.0 + +### New Features + +* Initial public preview release diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml new file mode 100644 index 00000000000..458bfbeccff --- /dev/null +++ b/actions/ql/lib/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.4.0 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 83cdaabc80d..2f6aa980728 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.0-dev +version: 0.4.0 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/lib/change-notes/2024-12-19-initial-release.md b/actions/ql/src/CHANGELOG.md similarity index 55% rename from actions/ql/lib/change-notes/2024-12-19-initial-release.md rename to actions/ql/src/CHANGELOG.md index 09263f5089d..caa8feca558 100644 --- a/actions/ql/lib/change-notes/2024-12-19-initial-release.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,4 +1,5 @@ ---- -category: feature ---- +## 0.4.0 + +### New Queries + * Initial public preview release diff --git a/actions/ql/src/change-notes/2024-12-19-initial-release.md b/actions/ql/src/change-notes/released/0.4.0.md similarity index 55% rename from actions/ql/src/change-notes/2024-12-19-initial-release.md rename to actions/ql/src/change-notes/released/0.4.0.md index e02078ea273..caa8feca558 100644 --- a/actions/ql/src/change-notes/2024-12-19-initial-release.md +++ b/actions/ql/src/change-notes/released/0.4.0.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- +## 0.4.0 + +### New Queries + * Initial public preview release diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml new file mode 100644 index 00000000000..458bfbeccff --- /dev/null +++ b/actions/ql/src/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.4.0 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index f822a516e56..7ea8f9d77dd 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.4.0-dev +version: 0.4.0 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 19784b530e7..919bd905e73 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,22 @@ +## 3.1.0 + +### Deprecated APIs + +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. + +### New Features + +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. + +### Minor Analysis Improvements + +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. + ## 3.0.0 ### Breaking Changes diff --git a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md b/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md deleted file mode 100644 index f60a6a2970a..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md deleted file mode 100644 index 6fec6d5f4f5..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md deleted file mode 100644 index 0ac7085b371..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. diff --git a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md deleted file mode 100644 index 41fe400ed66..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. diff --git a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md b/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md deleted file mode 100644 index bd912e4fb2e..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. diff --git a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md b/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md deleted file mode 100644 index 6e3ecd3468c..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: feature ---- -* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. -* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. -* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. diff --git a/cpp/ql/lib/change-notes/released/3.1.0.md b/cpp/ql/lib/change-notes/released/3.1.0.md new file mode 100644 index 00000000000..3c7f181f60a --- /dev/null +++ b/cpp/ql/lib/change-notes/released/3.1.0.md @@ -0,0 +1,18 @@ +## 3.1.0 + +### Deprecated APIs + +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. + +### New Features + +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. + +### Minor Analysis Improvements + +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 4bb4b04e02f..2d83b8d4840 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 3.0.1-dev +version: 3.1.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index db16fe6f8b3..7d957e42696 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 1.3.1 + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). + ## 1.3.0 ### New Queries diff --git a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md b/cpp/ql/src/change-notes/2024-11-27-active-template-library.md deleted file mode 100644 index a677ac66107..00000000000 --- a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md b/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md deleted file mode 100644 index c7ddd104ad0..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md b/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md deleted file mode 100644 index 6b41378f556..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md b/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md deleted file mode 100644 index 1bf77d55a61..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md b/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md deleted file mode 100644 index 76f5b9d7eae..00000000000 --- a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. diff --git a/cpp/ql/src/change-notes/released/1.3.1.md b/cpp/ql/src/change-notes/released/1.3.1.md new file mode 100644 index 00000000000..bb3b2bf16c7 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.3.1.md @@ -0,0 +1,9 @@ +## 1.3.1 + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index ec16350ed6f..e71b6d081f1 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.0 +lastReleaseVersion: 1.3.1 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 940c3e2a4cb..b37fc604fc6 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.3.1-dev +version: 1.3.1 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index a71f93aacd4..0a74ff6d7d0 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.31 + +No user-facing changes. + ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md new file mode 100644 index 00000000000..17df0436207 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md @@ -0,0 +1,3 @@ +## 1.7.31 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index c0346e526b9..908f8a00a39 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.30 +lastReleaseVersion: 1.7.31 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 781915bf1a1..d5274444753 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.31-dev +version: 1.7.31 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index a71f93aacd4..0a74ff6d7d0 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.31 + +No user-facing changes. + ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md new file mode 100644 index 00000000000..17df0436207 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md @@ -0,0 +1,3 @@ +## 1.7.31 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index c0346e526b9..908f8a00a39 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.30 +lastReleaseVersion: 1.7.31 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 979d8e6c661..41d5662ed57 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.31-dev +version: 1.7.31 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 86f279365f0..857acdec93a 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,16 @@ +## 4.0.1 + +### Minor Analysis Improvements + +* C# 13: Added QL library support for *collection* like type `params` parameters. +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. + ## 4.0.0 ### Breaking Changes diff --git a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md deleted file mode 100644 index 258c0e5326b..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md b/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md deleted file mode 100644 index e166040e155..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md b/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md deleted file mode 100644 index 04afe96522b..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md b/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md deleted file mode 100644 index 032edbb1f10..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. diff --git a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md b/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md deleted file mode 100644 index 5a48753b259..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - - `[SupplyParameterFromForm]` - - `[SupplyParameterFromQuery]` diff --git a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md b/csharp/ql/lib/change-notes/2024-12-20-collection-params.md deleted file mode 100644 index bb5ea26c6d4..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* C# 13: Added QL library support for *collection* like type `params` parameters. diff --git a/csharp/ql/lib/change-notes/released/4.0.1.md b/csharp/ql/lib/change-notes/released/4.0.1.md new file mode 100644 index 00000000000..703439b4cfe --- /dev/null +++ b/csharp/ql/lib/change-notes/released/4.0.1.md @@ -0,0 +1,12 @@ +## 4.0.1 + +### Minor Analysis Improvements + +* C# 13: Added QL library support for *collection* like type `params` parameters. +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 49fe3eef697..c0db4dcc0b3 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.0.0 +lastReleaseVersion: 4.0.1 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 81a55470a4d..bb79e33a528 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 4.0.1-dev +version: 4.0.1 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 370a9cf4a6a..1adfe6e1822 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.0.14 + +### Minor Analysis Improvements + +* The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. + ## 1.0.13 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/2024-12-17-move-libraries.md b/csharp/ql/src/change-notes/released/1.0.14.md similarity index 65% rename from csharp/ql/src/change-notes/2024-12-17-move-libraries.md rename to csharp/ql/src/change-notes/released/1.0.14.md index 07bf61b7e35..d49594169df 100644 --- a/csharp/ql/src/change-notes/2024-12-17-move-libraries.md +++ b/csharp/ql/src/change-notes/released/1.0.14.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.0.14 + +### Minor Analysis Improvements + * The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index e4d9400d96d..5334c690270 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.0.14-dev +version: 1.0.14 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 3c6fa155a32..2d5ba191d2e 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.14.md b/go/ql/consistency-queries/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 1812705438c..5e500c12eb7 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.14-dev +version: 1.0.14 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 83052b3a1d9..9c0c41ec4cb 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.0.1 + +### Minor Analysis Improvements + +* Added a `commandargs` local source model for the `os.Args` variable. +* Source models defined using models-as-data now work for variadic parameters. +* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. + ## 3.0.0 ### Breaking Changes diff --git a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md b/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md deleted file mode 100644 index 8244ba06994..00000000000 --- a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md b/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md deleted file mode 100644 index 38d5ad2783f..00000000000 --- a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Source models defined using models-as-data now work for variadic parameters. diff --git a/go/ql/lib/change-notes/2024-12-13-os-args-model.md b/go/ql/lib/change-notes/2024-12-13-os-args-model.md deleted file mode 100644 index 20a16d222e4..00000000000 --- a/go/ql/lib/change-notes/2024-12-13-os-args-model.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added a `commandargs` local source model for the `os.Args` variable. - diff --git a/go/ql/lib/change-notes/released/3.0.1.md b/go/ql/lib/change-notes/released/3.0.1.md new file mode 100644 index 00000000000..a8faff41943 --- /dev/null +++ b/go/ql/lib/change-notes/released/3.0.1.md @@ -0,0 +1,7 @@ +## 3.0.1 + +### Minor Analysis Improvements + +* Added a `commandargs` local source model for the `os.Args` variable. +* Source models defined using models-as-data now work for variadic parameters. +* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 33d3a2cd113..e3b15d965db 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.0.1 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 4e72aa3857b..a540b7905c3 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 3.0.1-dev +version: 3.0.1 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index c9044e55cdc..838a8bce5ea 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.5 + +No user-facing changes. + ## 1.1.4 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/1.1.5.md b/go/ql/src/change-notes/released/1.1.5.md new file mode 100644 index 00000000000..11a52a121d1 --- /dev/null +++ b/go/ql/src/change-notes/released/1.1.5.md @@ -0,0 +1,3 @@ +## 1.1.5 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 26cbcd3f123..df39a9de059 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.4 +lastReleaseVersion: 1.1.5 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 36775d0d862..52d3c0012ba 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.1.5-dev +version: 1.1.5 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 09ee80087e8..e7aa3c152de 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,24 @@ +## 6.0.0 + +### Breaking Changes + +* The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer + directly equatable to `Expr` and `Stmt`. Any queries that have been + exploiting these equalities, for example by using casts, will need minor + updates in order to fix any compilation errors. Conversions can be inserted + in either direction depending on what is most convenient. Available + conversions include `Expr.getControlFlowNode()`, `Stmt.getControlFlowNode()`, + `ControlFlowNode.asExpr()`, `ControlFlowNode.asStmt()`, and + `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a + `ControlFlowNode` equal to its enclosing `Callable`; these are now instead + modelled by the class `ControlFlow::ExitNode`. + +### Minor Analysis Improvements + +* Added `java.io.File.getName()` as a path injection sanitizer. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. + ## 5.0.0 ### Breaking Changes diff --git a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md b/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md deleted file mode 100644 index 4f45d19e5e8..00000000000 --- a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md deleted file mode 100644 index 258c0e5326b..00000000000 --- a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/java/ql/lib/change-notes/2024-12-06-file-getname.md b/java/ql/lib/change-notes/2024-12-06-file-getname.md deleted file mode 100644 index b2d1d271ab5..00000000000 --- a/java/ql/lib/change-notes/2024-12-06-file-getname.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `java.io.File.getName()` as a path injection sanitizer. diff --git a/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md b/java/ql/lib/change-notes/released/6.0.0.md similarity index 50% rename from java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md rename to java/ql/lib/change-notes/released/6.0.0.md index 2fbb6a537c7..f66dd1b2bbf 100644 --- a/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md +++ b/java/ql/lib/change-notes/released/6.0.0.md @@ -1,6 +1,7 @@ ---- -category: breaking ---- +## 6.0.0 + +### Breaking Changes + * The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer directly equatable to `Expr` and `Stmt`. Any queries that have been exploiting these equalities, for example by using casts, will need minor @@ -11,3 +12,9 @@ category: breaking `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a `ControlFlowNode` equal to its enclosing `Callable`; these are now instead modelled by the class `ControlFlow::ExitNode`. + +### Minor Analysis Improvements + +* Added `java.io.File.getName()` as a path injection sanitizer. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index c9e54136ca5..f8c4fa43ccb 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.0 +lastReleaseVersion: 6.0.0 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index f892ca1c450..d0490615f69 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 5.0.1-dev +version: 6.0.0 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 0bb38874b82..c7148cba8d8 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.11 + +No user-facing changes. + ## 1.1.10 ### Minor Analysis Improvements diff --git a/java/ql/src/change-notes/released/1.1.11.md b/java/ql/src/change-notes/released/1.1.11.md new file mode 100644 index 00000000000..c94f527264e --- /dev/null +++ b/java/ql/src/change-notes/released/1.1.11.md @@ -0,0 +1,3 @@ +## 1.1.11 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 4c01918d414..121f8cf035d 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.10 +lastReleaseVersion: 1.1.11 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 8ee211fb536..dd530febd2e 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.1.11-dev +version: 1.1.11 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index ebe424935eb..7aa60446f0e 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.1 + +No user-facing changes. + ## 2.2.0 ### Major Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/2.2.1.md b/javascript/ql/lib/change-notes/released/2.2.1.md new file mode 100644 index 00000000000..62b48f9d2e8 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.2.1.md @@ -0,0 +1,3 @@ +## 2.2.1 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 2f308354195..863e3cd380d 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.2.0 +lastReleaseVersion: 2.2.1 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 4d568ff4813..d78821f0892 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.2.1-dev +version: 2.2.1 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 195298ec89f..5bf4466796e 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.6 + +No user-facing changes. + ## 1.2.5 No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/1.2.6.md b/javascript/ql/src/change-notes/released/1.2.6.md new file mode 100644 index 00000000000..0832850ff8c --- /dev/null +++ b/javascript/ql/src/change-notes/released/1.2.6.md @@ -0,0 +1,3 @@ +## 1.2.6 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 40355f0807f..24962f7ba24 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.5 +lastReleaseVersion: 1.2.6 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 78f0585027b..04e84d1ac74 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 1.2.6-dev +version: 1.2.6 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 5d46c57bf4e..490b5dc360a 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.14.md b/misc/suite-helpers/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index eeb8f762b13..f14cabfe129 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.14-dev +version: 1.0.14 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 81c7659c4ed..dce2aad3c6d 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 3.1.0 + +### New Features + +- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. + +### Minor Analysis Improvements + +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. + ## 3.0.0 ### Breaking Changes diff --git a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md b/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md deleted file mode 100644 index adc7d39653f..00000000000 --- a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, - and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md b/python/ql/lib/change-notes/released/3.1.0.md similarity index 58% rename from python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md rename to python/ql/lib/change-notes/released/3.1.0.md index 57bb1b4a078..50b4b8184b7 100644 --- a/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md +++ b/python/ql/lib/change-notes/released/3.1.0.md @@ -1,5 +1,10 @@ ---- -category: feature ---- +## 3.1.0 + +### New Features - Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. + +### Minor Analysis Improvements + +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 147933b96fe..8e015428c49 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 3.0.1-dev +version: 3.1.0 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index c247e217acf..d5cacfc8401 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.4.0 + +### New Queries + +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. + ## 1.3.4 No user-facing changes. diff --git a/python/ql/src/change-notes/2024-11-21-template-injection.md b/python/ql/src/change-notes/released/1.4.0.md similarity index 78% rename from python/ql/src/change-notes/2024-11-21-template-injection.md rename to python/ql/src/change-notes/released/1.4.0.md index 7c604e9c993..02acaabcb98 100644 --- a/python/ql/src/change-notes/2024-11-21-template-injection.md +++ b/python/ql/src/change-notes/released/1.4.0.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- -* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. \ No newline at end of file +## 1.4.0 + +### New Queries + +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index 8263ddf2c8b..b8b2e97d508 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.4 +lastReleaseVersion: 1.4.0 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index d83b6433ac6..9d330fc3526 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.3.5-dev +version: 1.4.0 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 737903a3232..9179de3b7d5 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.1 + +No user-facing changes. + ## 3.0.0 ### Breaking Changes diff --git a/ruby/ql/lib/change-notes/released/3.0.1.md b/ruby/ql/lib/change-notes/released/3.0.1.md new file mode 100644 index 00000000000..ac5998ace61 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/3.0.1.md @@ -0,0 +1,3 @@ +## 3.0.1 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 33d3a2cd113..e3b15d965db 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.0.1 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index ddf106c95bf..a169addf8e7 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 3.0.1-dev +version: 3.0.1 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 5fe04780136..7d341c3f808 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.9 + +No user-facing changes. + ## 1.1.8 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.1.9.md b/ruby/ql/src/change-notes/released/1.1.9.md new file mode 100644 index 00000000000..f9d367d4248 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.1.9.md @@ -0,0 +1,3 @@ +## 1.1.9 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 64972659c42..6f4795f3ea0 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.8 +lastReleaseVersion: 1.1.9 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 43bfe75f566..72ff669503a 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.1.9-dev +version: 1.1.9 groups: - ruby - queries diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 285b39a4359..5f4501ed1e3 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/1.0.14.md b/shared/controlflow/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/controlflow/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 268f142bd1b..590d3e1666d 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index df038524d2d..949660e3381 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.1.8 + +### Minor Analysis Improvements + +* Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. + ## 1.1.7 No user-facing changes. diff --git a/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md b/shared/dataflow/change-notes/released/1.1.8.md similarity index 77% rename from shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md rename to shared/dataflow/change-notes/released/1.1.8.md index 30e71ade6af..d951e6bf0c7 100644 --- a/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md +++ b/shared/dataflow/change-notes/released/1.1.8.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.1.8 + +### Minor Analysis Improvements + * Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 75910556516..64972659c42 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.7 +lastReleaseVersion: 1.1.8 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 6a8e8c3a4ae..fe44120b3c1 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 1.1.8-dev +version: 1.1.8 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 93a528a4f3c..1b2146927e5 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.14.md b/shared/mad/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 125bcad622d..341373b22f5 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 6b25d16e0f7..993922ecc49 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.14.md b/shared/rangeanalysis/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 62c8c1e46b6..efb29bbc02c 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 54c3ed2b307..45bb8da81db 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.14.md b/shared/regex/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index e2cda264dc8..8db7e73e336 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 01c19388c92..d31fb6c6120 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/ssa/change-notes/released/1.0.14.md b/shared/ssa/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/ssa/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index b146ce5bc91..1276fd498f7 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 3c6fa155a32..2d5ba191d2e 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.14.md b/shared/threat-models/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 6ec41bbcc04..f337bfa721d 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.14-dev +version: 1.0.14 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 1f4e7ad4ed3..cc4652e04ff 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.14.md b/shared/tutorial/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 6677c74eed4..4c55d52356c 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index dd8fb7a60b2..ac6192fd7d8 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.14.md b/shared/typeflow/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index cd9e70bba8c..15761af538a 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 0ab05873af4..f651b953118 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/1.0.14.md b/shared/typetracking/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typetracking/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index fbe63f0da01..224b85826c4 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index c0c3cea3948..924a3fc0a7b 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.14.md b/shared/typos/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 250f729ab5f..31f04e60666 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index e03d990b747..9dd6c05d40a 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.1 + +No user-facing changes. + ## 2.0.0 ### Breaking Changes diff --git a/shared/util/change-notes/released/2.0.1.md b/shared/util/change-notes/released/2.0.1.md new file mode 100644 index 00000000000..b5b6d0dee91 --- /dev/null +++ b/shared/util/change-notes/released/2.0.1.md @@ -0,0 +1,3 @@ +## 2.0.1 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 0abe6ccede0..fe974a4dbf3 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.0 +lastReleaseVersion: 2.0.1 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index b327c25a3d9..da932a6ed36 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.1-dev +version: 2.0.1 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index c3ebc31994b..6837f7507d8 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.14.md b/shared/xml/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 76c408c2920..a3ace631d1b 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 28fcbceec8e..6e940e8d264 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.14.md b/shared/yaml/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 0c756e1edbb..006f30012bb 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index ba76b51c80e..c976d0c8514 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 3.1.0 + +### Major Analysis Improvements + +* Upgraded to allow analysis of Swift 6.0.2. + ## 3.0.0 ### Breaking Changes diff --git a/swift/ql/lib/change-notes/2024-12-09-swift-6.md b/swift/ql/lib/change-notes/released/3.1.0.md similarity index 51% rename from swift/ql/lib/change-notes/2024-12-09-swift-6.md rename to swift/ql/lib/change-notes/released/3.1.0.md index e32344b28d8..655a8ad323a 100644 --- a/swift/ql/lib/change-notes/2024-12-09-swift-6.md +++ b/swift/ql/lib/change-notes/released/3.1.0.md @@ -1,4 +1,5 @@ ---- -category: majorAnalysis ---- +## 3.1.0 + +### Major Analysis Improvements + * Upgraded to allow analysis of Swift 6.0.2. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 7752975faea..91e4d06f537 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 3.0.1-dev +version: 3.1.0 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 73ac6bef86d..a26a68434eb 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.0.14.md b/swift/ql/src/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/swift/ql/src/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index ec8e2cb9932..1ce09dc0969 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.0.14-dev +version: 1.0.14 groups: - swift - queries From 8a2398aaf061867d40e2e85a5149546b9c038d24 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Mon, 6 Jan 2025 13:26:09 -0500 Subject: [PATCH 12/71] Update python/ql/lib/CHANGELOG.md --- python/ql/lib/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index dce2aad3c6d..aabefe63a42 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -2,7 +2,7 @@ ### New Features -- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. +* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. ### Minor Analysis Improvements From b4811906ea939f8b111a2c766ad82125d03ad16d Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 7 Jan 2025 13:05:19 +0100 Subject: [PATCH 13/71] Rust: address review --- rust/ast-generator/src/main.rs | 1 - rust/extractor/src/translate/base.rs | 18 +++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index f117e5dd035..2b6d9f3610e 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -4,7 +4,6 @@ use std::{fs, path::PathBuf}; pub mod codegen; mod flags; use codegen::grammar::ast_src::{AstNodeSrc, AstSrc, Field}; -use itertools::Itertools; use std::collections::{BTreeMap, BTreeSet}; use std::env; use ungrammar::Grammar; diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 40f73cd8908..297bf202f79 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -560,16 +560,12 @@ impl<'a> Translator<'a> { } pub(crate) fn should_be_excluded(&self, item: &impl ast::HasAttrs) -> bool { - let Some(sema) = self.semantics else { - return false; - }; - for attr in item.attrs() { - if let Some((name, tokens)) = attr.as_simple_call() { - if name == "cfg" && sema.check_cfg_attr(&tokens) == Some(false) { - return true; - } - } - } - false + self.semantics.is_some_and(|sema| { + item.attrs().any(|attr| { + attr.as_simple_call().is_some_and(|(name, tokens)| { + name == "cfg" && sema.check_cfg_attr(&tokens) == Some(false) + }) + }) + }) } } From 796a81a0bacebeca3e3d059cc043f0fab4ca0230 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Fri, 3 Jan 2025 22:25:10 -0500 Subject: [PATCH 14/71] gorm models --- go/ql/lib/ext/gorm.io.gorm.model.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/go/ql/lib/ext/gorm.io.gorm.model.yml b/go/ql/lib/ext/gorm.io.gorm.model.yml index bfcf1fa66a7..a72ab845376 100644 --- a/go/ql/lib/ext/gorm.io.gorm.model.yml +++ b/go/ql/lib/ext/gorm.io.gorm.model.yml @@ -6,6 +6,21 @@ extensions: - ["gorm", "gorm.io/gorm"] - ["gorm", "github.com/jinzhu/gorm"] - ["gorm", "github.com/go-gorm/gorm"] + - addsTo: + pack: codeql/go-all + extensible: sourceModel + data: + - ["group:gorm", "ConnPool", True, "QueryContext", "", "", "ReturnValue", "manual"] + - ["group:gorm", "ConnPool", True, "QueryRowContext", "", "", "ReturnValue", "manual"] + - ["group:gorm", "DB", True, "Association", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "Find", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "FindInBatches", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "First", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "FirstOrCreate", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "FirstOrInit", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "Last", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "Scan", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "Take", "", "", "Argument[0]", "database", "manual"] - addsTo: pack: codeql/go-all extensible: sinkModel From 20d1ae1396a39c816f65a6524d206beaf43a4ca7 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Fri, 3 Jan 2025 22:35:24 -0500 Subject: [PATCH 15/71] Fix Association model --- go/ql/lib/ext/gorm.io.gorm.model.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/ql/lib/ext/gorm.io.gorm.model.yml b/go/ql/lib/ext/gorm.io.gorm.model.yml index a72ab845376..a157d9d0899 100644 --- a/go/ql/lib/ext/gorm.io.gorm.model.yml +++ b/go/ql/lib/ext/gorm.io.gorm.model.yml @@ -10,9 +10,9 @@ extensions: pack: codeql/go-all extensible: sourceModel data: - - ["group:gorm", "ConnPool", True, "QueryContext", "", "", "ReturnValue", "manual"] - - ["group:gorm", "ConnPool", True, "QueryRowContext", "", "", "ReturnValue", "manual"] - - ["group:gorm", "DB", True, "Association", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "Association", True, "Find", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "ConnPool", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"] + - ["group:gorm", "ConnPool", True, "QueryRowContext", "", "", "ReturnValue", "database", "manual"] - ["group:gorm", "DB", True, "Find", "", "", "Argument[0]", "database", "manual"] - ["group:gorm", "DB", True, "FindInBatches", "", "", "Argument[0]", "database", "manual"] - ["group:gorm", "DB", True, "First", "", "", "Argument[0]", "database", "manual"] From f38008e73de4352210bd81ad95ebaa8605f8cfd7 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Sun, 5 Jan 2025 22:07:20 -0500 Subject: [PATCH 16/71] Add test vendoring --- .../flowsources/local/database/go.mod | 7 +++ .../database/vendor/gorm.io/gorm/stub.go | 57 +++++++++++++++++++ .../local/database/vendor/modules.txt | 3 + 3 files changed, 67 insertions(+) create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod new file mode 100644 index 00000000000..d9fb9e8f987 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod @@ -0,0 +1,7 @@ +module test + +go 1.22.5 + +require ( + gorm.io/gorm v1.23.0 +) diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go new file mode 100644 index 00000000000..e6170a2ed90 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go @@ -0,0 +1,57 @@ +package gorm + +import ( + "context" + "database/sql" +) + +type DB struct{} + +func (db *DB) Find(dest interface{}, conds ...interface{}) *DB { + return db +} + +func (db *DB) FindInBatches(dest interface{}, batchSize int, fc func(tx *DB, batch int) error) *DB { + return db +} + +func (db *DB) FirstOrCreate(dest interface{}, conds ...interface{}) *DB { + return db +} + +func (db *DB) FirstOrInit(dest interface{}, conds ...interface{}) *DB { + return db +} + +func (db *DB) First(dest interface{}, conds ...interface{}) *DB { + return db +} + +func (db *DB) Last(dest interface{}, conds ...interface{}) *DB { + return db +} + +func (db *DB) Take(dest interface{}, conds ...interface{}) *DB { + return db +} + +func (db *DB) Scan(dest interface{}) *DB { + return db +} + +type Association struct { + DB *DB +} + +func (a *Association) Find(dest interface{}) *Association { + return a +} + +type ConnPool interface { + PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) + ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) + QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) + QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row +} + +type Model interface{} diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt new file mode 100644 index 00000000000..ff139a75895 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt @@ -0,0 +1,3 @@ +# gorm.io/gorm v1.23.0 +## explicit +gorm.io/gorm \ No newline at end of file From c7be77c1af9b868720f5f828e2a7031c629b72f8 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Sun, 5 Jan 2025 22:07:34 -0500 Subject: [PATCH 17/71] Add gorm tests --- .../flowsources/local/database/test_gorm.go | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go new file mode 100644 index 00000000000..02dc1feee85 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go @@ -0,0 +1,45 @@ +package test + +import "gorm.io/gorm" + +type User struct{} + +// test querying an Association +func test_gorm_AssociationQuery(association *gorm.Association) { + association.Find(&User{}) // $ source +} + +// test querying a ConnPool +func test_gorm_ConnPoolQuery(connPool gorm.ConnPool) { + rows, err := connPool.QueryContext(nil, "SELECT * FROM users") // $ source + + if err != nil { + return + } + + defer rows.Close() + + userRow := connPool.QueryRowContext(nil, "SELECT * FROM users WHERE id = 1") // $ source + + ignore(userRow) +} + +// test querying a DB +func test_gorm_db(db *gorm.DB) { + db.Find(&User{}) // $ source + + db.FindInBatches(&User{}, 10, nil) // $ source + + db.FirstOrCreate(&User{}) // $ source + + db.FirstOrInit(&User{}) // $ source + + db.First(&User{}) // $ source + + db.Last(&User{}) // $ source + + db.Take(&User{}) // $ source + + db.Scan(&User{}) // $ source + +} From d28e03cda57e58a40f252517a5f345022e3fa1f8 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Sun, 5 Jan 2025 22:09:12 -0500 Subject: [PATCH 18/71] Change note --- go/ql/lib/change-notes/2025-01-05-gorm-database-sources.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 go/ql/lib/change-notes/2025-01-05-gorm-database-sources.md diff --git a/go/ql/lib/change-notes/2025-01-05-gorm-database-sources.md b/go/ql/lib/change-notes/2025-01-05-gorm-database-sources.md new file mode 100644 index 00000000000..a8ae4792feb --- /dev/null +++ b/go/ql/lib/change-notes/2025-01-05-gorm-database-sources.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Added `database` source models for database methods from the `gorm.io/gorm` package. +` From b390fac105d82af9c0a0d60a17e07a9d4e7445f1 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 7 Jan 2025 18:05:02 +0100 Subject: [PATCH 19/71] Rust: make ast-generator use mustache templates This simplifies the code and decouples the code template from the data that is fed into it. --- Cargo.lock | 50 +- MODULE.bazel | 2 +- ...1.0.94.bazel => BUILD.anyhow-1.0.95.bazel} | 6 +- .../tree_sitter_extractors_deps/BUILD.bazel | 10 +- .../BUILD.log-0.3.9.bazel | 88 + .../BUILD.mustache-0.9.0.bazel | 85 + .../BUILD.ra_ap_load-cargo-0.0.248.bazel | 2 +- .../BUILD.ra_ap_project_model-0.0.248.bazel | 2 +- ....0.bazel => BUILD.serde_with-3.12.0.bazel} | 4 +- ...l => BUILD.serde_with_macros-3.12.0.bazel} | 2 +- .../tree_sitter_extractors_deps/defs.bzl | 62 +- rust/ast-generator/BUILD.bazel | 1 + rust/ast-generator/Cargo.toml | 3 + rust/ast-generator/src/main.rs | 587 +++---- .../src/templates/extractor.mustache | 65 + .../src/templates/schema.mustache | 13 + rust/extractor/Cargo.toml | 2 +- rust/extractor/src/translate/generated.rs | 23 +- rust/schema/ast.py | 1500 ++++++++--------- 19 files changed, 1387 insertions(+), 1120 deletions(-) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.anyhow-1.0.94.bazel => BUILD.anyhow-1.0.95.bazel} (97%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_with-3.11.0.bazel => BUILD.serde_with-3.12.0.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_with_macros-3.11.0.bazel => BUILD.serde_with_macros-3.12.0.bazel} (99%) create mode 100644 rust/ast-generator/src/templates/extractor.mustache create mode 100644 rust/ast-generator/src/templates/schema.mustache diff --git a/Cargo.lock b/Cargo.lock index f4a2ea70735..2bf1f1a6689 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,9 +92,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "argfile" @@ -116,11 +116,14 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" name = "ast-generator" version = "0.1.0" dependencies = [ + "anyhow", "either", "itertools 0.12.1", + "mustache", "proc-macro2", "quote", "ra_ap_stdx", + "serde", "ungrammar", ] @@ -412,7 +415,7 @@ dependencies = [ "figment", "glob", "itertools 0.13.0", - "log", + "log 0.4.22", "num-traits", "ra_ap_base_db", "ra_ap_cfg", @@ -585,7 +588,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ - "log", + "log 0.4.22", ] [[package]] @@ -755,7 +758,7 @@ checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" dependencies = [ "aho-corasick", "bstr", - "log", + "log 0.4.22", "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -1020,6 +1023,15 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +dependencies = [ + "log 0.4.22", +] + [[package]] name = "log" version = "0.4.22" @@ -1072,7 +1084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "log", + "log 0.4.22", "wasi", "windows-sys 0.48.0", ] @@ -1086,6 +1098,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mustache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51956ef1c5d20a1384524d91e616fb44dfc7d8f249bf696d49c97dd3289ecab5" +dependencies = [ + "log 0.3.9", + "serde", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -1105,7 +1127,7 @@ dependencies = [ "inotify", "kqueue", "libc", - "log", + "log 0.4.22", "mio", "walkdir", "windows-sys 0.48.0", @@ -2068,9 +2090,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64", "chrono", @@ -2086,9 +2108,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", @@ -2160,7 +2182,7 @@ checksum = "61c910772f992ab17d32d6760e167d2353f4130ed50e796752689556af07dc6b" dependencies = [ "chrono", "is-terminal", - "log", + "log 0.4.22", "termcolor", "thread_local", ] @@ -2313,7 +2335,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "log", + "log 0.4.22", "once_cell", "tracing-core", ] @@ -2502,7 +2524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", - "log", + "log 0.4.22", "proc-macro2", "quote", "syn", diff --git a/MODULE.bazel b/MODULE.bazel index b409d751ac6..ee8e564b564 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -70,7 +70,7 @@ use_repo(py_deps, "vendor__anyhow-1.0.44", "vendor__cc-1.0.70", "vendor__clap-2. # deps for ruby+rust # keep in sync by running `misc/bazel/3rdparty/update_cargo_deps.sh` tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r") -use_repo(tree_sitter_extractors_deps, "vendor__anyhow-1.0.94", "vendor__argfile-0.2.1", "vendor__chrono-0.4.39", "vendor__clap-4.5.23", "vendor__dunce-1.0.5", "vendor__either-1.13.0", "vendor__encoding-0.2.33", "vendor__figment-0.10.19", "vendor__flate2-1.0.35", "vendor__glob-0.3.1", "vendor__globset-0.4.15", "vendor__itertools-0.12.1", "vendor__itertools-0.13.0", "vendor__lazy_static-1.5.0", "vendor__log-0.4.22", "vendor__num-traits-0.2.19", "vendor__num_cpus-1.16.0", "vendor__proc-macro2-1.0.92", "vendor__quote-1.0.37", "vendor__ra_ap_base_db-0.0.248", "vendor__ra_ap_cfg-0.0.248", "vendor__ra_ap_hir-0.0.248", "vendor__ra_ap_hir_def-0.0.248", "vendor__ra_ap_hir_expand-0.0.248", "vendor__ra_ap_ide_db-0.0.248", "vendor__ra_ap_intern-0.0.248", "vendor__ra_ap_load-cargo-0.0.248", "vendor__ra_ap_parser-0.0.248", "vendor__ra_ap_paths-0.0.248", "vendor__ra_ap_project_model-0.0.248", "vendor__ra_ap_span-0.0.248", "vendor__ra_ap_stdx-0.0.248", "vendor__ra_ap_syntax-0.0.248", "vendor__ra_ap_vfs-0.0.248", "vendor__rand-0.8.5", "vendor__rayon-1.10.0", "vendor__regex-1.11.1", "vendor__serde-1.0.216", "vendor__serde_json-1.0.133", "vendor__serde_with-3.11.0", "vendor__stderrlog-0.6.0", "vendor__syn-2.0.90", "vendor__tracing-0.1.41", "vendor__tracing-subscriber-0.3.19", "vendor__tree-sitter-0.24.5", "vendor__tree-sitter-embedded-template-0.23.2", "vendor__tree-sitter-json-0.24.8", "vendor__tree-sitter-ql-0.23.1", "vendor__tree-sitter-ruby-0.23.1", "vendor__triomphe-0.1.14", "vendor__ungrammar-1.16.1") +use_repo(tree_sitter_extractors_deps, "vendor__anyhow-1.0.95", "vendor__argfile-0.2.1", "vendor__chrono-0.4.39", "vendor__clap-4.5.23", "vendor__dunce-1.0.5", "vendor__either-1.13.0", "vendor__encoding-0.2.33", "vendor__figment-0.10.19", "vendor__flate2-1.0.35", "vendor__glob-0.3.1", "vendor__globset-0.4.15", "vendor__itertools-0.12.1", "vendor__itertools-0.13.0", "vendor__lazy_static-1.5.0", "vendor__log-0.4.22", "vendor__mustache-0.9.0", "vendor__num-traits-0.2.19", "vendor__num_cpus-1.16.0", "vendor__proc-macro2-1.0.92", "vendor__quote-1.0.37", "vendor__ra_ap_base_db-0.0.248", "vendor__ra_ap_cfg-0.0.248", "vendor__ra_ap_hir-0.0.248", "vendor__ra_ap_hir_def-0.0.248", "vendor__ra_ap_hir_expand-0.0.248", "vendor__ra_ap_ide_db-0.0.248", "vendor__ra_ap_intern-0.0.248", "vendor__ra_ap_load-cargo-0.0.248", "vendor__ra_ap_parser-0.0.248", "vendor__ra_ap_paths-0.0.248", "vendor__ra_ap_project_model-0.0.248", "vendor__ra_ap_span-0.0.248", "vendor__ra_ap_stdx-0.0.248", "vendor__ra_ap_syntax-0.0.248", "vendor__ra_ap_vfs-0.0.248", "vendor__rand-0.8.5", "vendor__rayon-1.10.0", "vendor__regex-1.11.1", "vendor__serde-1.0.216", "vendor__serde_json-1.0.133", "vendor__serde_with-3.12.0", "vendor__stderrlog-0.6.0", "vendor__syn-2.0.90", "vendor__tracing-0.1.41", "vendor__tracing-subscriber-0.3.19", "vendor__tree-sitter-0.24.5", "vendor__tree-sitter-embedded-template-0.23.2", "vendor__tree-sitter-json-0.24.8", "vendor__tree-sitter-ql-0.23.1", "vendor__tree-sitter-ruby-0.23.1", "vendor__triomphe-0.1.14", "vendor__ungrammar-1.16.1") http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.94.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.95.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.94.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.95.bazel index 7cf52c1f447..87dbeb8b24d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.94.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.95.bazel @@ -82,9 +82,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-none": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.94", + version = "1.0.95", deps = [ - "@vendor__anyhow-1.0.94//:build_script_build", + "@vendor__anyhow-1.0.95//:build_script_build", ], ) @@ -137,7 +137,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.94", + version = "1.0.95", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel index 93d13bd4717..363d01d0cfe 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel @@ -33,7 +33,7 @@ filegroup( # Workspace Member Dependencies alias( name = "anyhow", - actual = "@vendor__anyhow-1.0.94//:anyhow", + actual = "@vendor__anyhow-1.0.95//:anyhow", tags = ["manual"], ) @@ -121,6 +121,12 @@ alias( tags = ["manual"], ) +alias( + name = "mustache", + actual = "@vendor__mustache-0.9.0//:mustache", + tags = ["manual"], +) + alias( name = "num-traits", actual = "@vendor__num-traits-0.2.19//:num_traits", @@ -267,7 +273,7 @@ alias( alias( name = "serde_with", - actual = "@vendor__serde_with-3.11.0//:serde_with", + actual = "@vendor__serde_with-3.12.0//:serde_with", tags = ["manual"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel new file mode 100644 index 00000000000..dd83df11aa8 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel @@ -0,0 +1,88 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +rust_library( + name = "log", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "use_std", + ], + crate_root = "src/lib.rs", + edition = "2015", + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=log", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-fuchsia": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasi": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-fuchsia": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.3.9", + deps = [ + "@vendor__log-0.4.22//:log", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel new file mode 100644 index 00000000000..12b5f2a94ea --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel @@ -0,0 +1,85 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +rust_library( + name = "mustache", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2015", + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=mustache", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-fuchsia": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasi": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-fuchsia": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.9.0", + deps = [ + "@vendor__log-0.3.9//:log", + "@vendor__serde-1.0.216//:serde", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.248.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.248.bazel index 4a765a177e6..ae31f800e76 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.248.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.248.bazel @@ -91,7 +91,7 @@ rust_library( }), version = "0.0.248", deps = [ - "@vendor__anyhow-1.0.94//:anyhow", + "@vendor__anyhow-1.0.95//:anyhow", "@vendor__crossbeam-channel-0.5.14//:crossbeam_channel", "@vendor__itertools-0.12.1//:itertools", "@vendor__ra_ap_hir_expand-0.0.248//:ra_ap_hir_expand", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.248.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.248.bazel index 8499a0da5e5..ce411e10490 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.248.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.248.bazel @@ -88,7 +88,7 @@ rust_library( }), version = "0.0.248", deps = [ - "@vendor__anyhow-1.0.94//:anyhow", + "@vendor__anyhow-1.0.95//:anyhow", "@vendor__cargo_metadata-0.18.1//:cargo_metadata", "@vendor__itertools-0.12.1//:itertools", "@vendor__la-arena-0.3.1//:la_arena", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.11.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.12.0.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.11.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.12.0.bazel index 5d4302382eb..b3056b3fdf8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.11.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.12.0.bazel @@ -38,7 +38,7 @@ rust_library( edition = "2021", proc_macro_deps = [ "@vendor__serde_derive-1.0.216//:serde_derive", - "@vendor__serde_with_macros-3.11.0//:serde_with_macros", + "@vendor__serde_with_macros-3.12.0//:serde_with_macros", ], rustc_flags = [ "--cap-lints=allow", @@ -87,7 +87,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-none": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "3.11.0", + version = "3.12.0", deps = [ "@vendor__serde-1.0.216//:serde", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.11.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.12.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.11.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.12.0.bazel index 00ad783789c..a770d2c20cb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.11.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.12.0.bazel @@ -77,7 +77,7 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-none": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "3.11.0", + version = "3.12.0", deps = [ "@vendor__darling-0.20.10//:darling", "@vendor__proc-macro2-1.0.92//:proc_macro2", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl index 7f89caf6ad6..1abe578aad2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl @@ -310,10 +310,13 @@ _NORMAL_DEPENDENCIES = { }, "rust/ast-generator": { _COMMON_CONDITION: { + "anyhow": Label("@vendor__anyhow-1.0.95//:anyhow"), "either": Label("@vendor__either-1.13.0//:either"), "itertools": Label("@vendor__itertools-0.12.1//:itertools"), + "mustache": Label("@vendor__mustache-0.9.0//:mustache"), "proc-macro2": Label("@vendor__proc-macro2-1.0.92//:proc_macro2"), "quote": Label("@vendor__quote-1.0.37//:quote"), + "serde": Label("@vendor__serde-1.0.216//:serde"), "stdx": Label("@vendor__ra_ap_stdx-0.0.248//:ra_ap_stdx"), "ungrammar": Label("@vendor__ungrammar-1.16.1//:ungrammar"), }, @@ -322,7 +325,7 @@ _NORMAL_DEPENDENCIES = { }, "rust/extractor": { _COMMON_CONDITION: { - "anyhow": Label("@vendor__anyhow-1.0.94//:anyhow"), + "anyhow": Label("@vendor__anyhow-1.0.95//:anyhow"), "argfile": Label("@vendor__argfile-0.2.1//:argfile"), "chrono": Label("@vendor__chrono-0.4.39//:chrono"), "clap": Label("@vendor__clap-4.5.23//:clap"), @@ -348,7 +351,7 @@ _NORMAL_DEPENDENCIES = { "ra_ap_vfs": Label("@vendor__ra_ap_vfs-0.0.248//:ra_ap_vfs"), "serde": Label("@vendor__serde-1.0.216//:serde"), "serde_json": Label("@vendor__serde_json-1.0.133//:serde_json"), - "serde_with": Label("@vendor__serde_with-3.11.0//:serde_with"), + "serde_with": Label("@vendor__serde_with-3.12.0//:serde_with"), "stderrlog": Label("@vendor__stderrlog-0.6.0//:stderrlog"), "triomphe": Label("@vendor__triomphe-0.1.14//:triomphe"), }, @@ -739,12 +742,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor__anyhow-1.0.94", - sha256 = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7", + name = "vendor__anyhow-1.0.95", + sha256 = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04", type = "tar.gz", - urls = ["https://static.crates.io/crates/anyhow/1.0.94/download"], - strip_prefix = "anyhow-1.0.94", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.94.bazel"), + urls = ["https://static.crates.io/crates/anyhow/1.0.95/download"], + strip_prefix = "anyhow-1.0.95", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.95.bazel"), ) maybe( @@ -1707,6 +1710,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.lock_api-0.4.12.bazel"), ) + maybe( + http_archive, + name = "vendor__log-0.3.9", + sha256 = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/log/0.3.9/download"], + strip_prefix = "log-0.3.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.3.9.bazel"), + ) + maybe( http_archive, name = "vendor__log-0.4.22", @@ -1787,6 +1800,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.miow-0.6.0.bazel"), ) + maybe( + http_archive, + name = "vendor__mustache-0.9.0", + sha256 = "51956ef1c5d20a1384524d91e616fb44dfc7d8f249bf696d49c97dd3289ecab5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/mustache/0.9.0/download"], + strip_prefix = "mustache-0.9.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mustache-0.9.0.bazel"), + ) + maybe( http_archive, name = "vendor__nohash-hasher-0.2.0", @@ -2568,22 +2591,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor__serde_with-3.11.0", - sha256 = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817", + name = "vendor__serde_with-3.12.0", + sha256 = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with/3.11.0/download"], - strip_prefix = "serde_with-3.11.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.11.0.bazel"), + urls = ["https://static.crates.io/crates/serde_with/3.12.0/download"], + strip_prefix = "serde_with-3.12.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.12.0.bazel"), ) maybe( http_archive, - name = "vendor__serde_with_macros-3.11.0", - sha256 = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d", + name = "vendor__serde_with_macros-3.12.0", + sha256 = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with_macros/3.11.0/download"], - strip_prefix = "serde_with_macros-3.11.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.11.0.bazel"), + urls = ["https://static.crates.io/crates/serde_with_macros/3.12.0/download"], + strip_prefix = "serde_with_macros-3.12.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.12.0.bazel"), ) maybe( @@ -3357,7 +3380,7 @@ def crate_repositories(): ) return [ - struct(repo = "vendor__anyhow-1.0.94", is_dev_dep = False), + struct(repo = "vendor__anyhow-1.0.95", is_dev_dep = False), struct(repo = "vendor__argfile-0.2.1", is_dev_dep = False), struct(repo = "vendor__chrono-0.4.39", is_dev_dep = False), struct(repo = "vendor__clap-4.5.23", is_dev_dep = False), @@ -3372,6 +3395,7 @@ def crate_repositories(): struct(repo = "vendor__itertools-0.13.0", is_dev_dep = False), struct(repo = "vendor__lazy_static-1.5.0", is_dev_dep = False), struct(repo = "vendor__log-0.4.22", is_dev_dep = False), + struct(repo = "vendor__mustache-0.9.0", is_dev_dep = False), struct(repo = "vendor__num-traits-0.2.19", is_dev_dep = False), struct(repo = "vendor__num_cpus-1.16.0", is_dev_dep = False), struct(repo = "vendor__proc-macro2-1.0.92", is_dev_dep = False), @@ -3395,7 +3419,7 @@ def crate_repositories(): struct(repo = "vendor__regex-1.11.1", is_dev_dep = False), struct(repo = "vendor__serde-1.0.216", is_dev_dep = False), struct(repo = "vendor__serde_json-1.0.133", is_dev_dep = False), - struct(repo = "vendor__serde_with-3.11.0", is_dev_dep = False), + struct(repo = "vendor__serde_with-3.12.0", is_dev_dep = False), struct(repo = "vendor__stderrlog-0.6.0", is_dev_dep = False), struct(repo = "vendor__syn-2.0.90", is_dev_dep = False), struct(repo = "vendor__tracing-0.1.41", is_dev_dep = False), diff --git a/rust/ast-generator/BUILD.bazel b/rust/ast-generator/BUILD.bazel index b5956d09606..91a2db6337f 100644 --- a/rust/ast-generator/BUILD.bazel +++ b/rust/ast-generator/BUILD.bazel @@ -56,6 +56,7 @@ codeql_rust_binary( ) + [":codegen"], aliases = aliases(), args = ["$(rlocationpath :ungram)"], + compile_data = glob(["src/templates/*.mustache"]), data = [":ungram"], proc_macro_deps = all_crate_deps( proc_macro = True, diff --git a/rust/ast-generator/Cargo.toml b/rust/ast-generator/Cargo.toml index c99baa35382..039842abceb 100644 --- a/rust/ast-generator/Cargo.toml +++ b/rust/ast-generator/Cargo.toml @@ -11,3 +11,6 @@ quote = "1.0.20" either = "1.9.0" stdx = {package = "ra_ap_stdx", version = "0.0.248"} itertools = "0.12.0" +mustache = "0.9.0" +serde = { version = "1.0.216", features = ["derive"] } +anyhow = "1.0.95" diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index 2b6d9f3610e..55d98f8b3b2 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -1,9 +1,11 @@ -use std::io::Write; use std::{fs, path::PathBuf}; pub mod codegen; mod flags; +use crate::codegen::grammar::ast_src::{AstEnumSrc, Cardinality}; use codegen::grammar::ast_src::{AstNodeSrc, AstSrc, Field}; +use itertools::Itertools; +use serde::Serialize; use std::collections::{BTreeMap, BTreeSet}; use std::env; use ungrammar::Grammar; @@ -56,92 +58,116 @@ fn to_lower_snake_case(s: &str) -> String { buf } +#[derive(Serialize)] +struct SchemaField { + name: String, + ty: String, + child: bool, +} + +#[derive(Serialize)] +struct SchemaClass { + name: String, + bases: Vec, + fields: Vec, +} + +#[derive(Serialize, Default)] +struct Schema { + classes: Vec, +} + +fn get_bases(name: &str, super_types: &BTreeMap>) -> Vec { + super_types + .get(name) + .map(|tys| tys.iter().map(|t| class_name(t)).collect()) + .unwrap_or_else(|| vec!["AstNode".to_string()]) +} + +fn enum_src_to_schema_class( + node: &AstEnumSrc, + super_types: &BTreeMap>, +) -> SchemaClass { + SchemaClass { + name: class_name(&node.name), + bases: get_bases(&node.name, super_types), + fields: Vec::new(), + } +} + +fn node_src_to_schema_class( + node: &AstNodeSrc, + super_types: &BTreeMap>, +) -> SchemaClass { + SchemaClass { + name: class_name(&node.name), + bases: get_bases(&node.name, super_types), + fields: get_fields(node) + .iter() + .map(|f| { + let (ty, child) = match &f.ty { + FieldType::String => ("optional[string]".to_string(), false), + FieldType::Predicate => ("predicate".to_string(), false), + FieldType::Optional(ty) => (format!("optional[\"{}\"]", class_name(ty)), true), + FieldType::List(ty) => (format!("list[\"{}\"]", class_name(ty)), true), + }; + SchemaField { + name: property_name(&node.name, &f.name), + ty, + child, + } + }) + .collect(), + } +} + +fn fix_blank_lines(s: &str) -> String { + // mustache is not very good at avoiding blank lines + // adopting the workaround from https://github.com/groue/GRMustache/issues/46#issuecomment-19498046 + s.split("\n") + .filter(|line| !line.trim().is_empty()) + .map(|line| if line == "¶" { "" } else { line }) + .join("\n") + + "\n" +} + fn write_schema( grammar: &AstSrc, super_types: BTreeMap>, -) -> std::io::Result { - let mut buf: Vec = Vec::new(); - writeln!( - buf, - "# Generated by `ast-generator`, do not edit by hand.\n" - )?; - writeln!(buf, "from .prelude import *")?; +) -> mustache::Result { + let mut schema = Schema::default(); + schema.classes.extend( + grammar + .enums + .iter() + .map(|node| enum_src_to_schema_class(node, &super_types)), + ); + schema.classes.extend( + grammar + .nodes + .iter() + .map(|node| node_src_to_schema_class(node, &super_types)), + ); + // the concat dance is currently required by bazel + let template = mustache::compile_str(include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/src/templates/schema.mustache" + )))?; + let res = template.render_to_string(&schema)?; + Ok(fix_blank_lines(&res)) +} - for node in &grammar.enums { - let super_classses = if let Some(cls) = super_types.get(&node.name) { - let super_classes: Vec = cls.iter().map(|s| class_name(s)).collect(); - super_classes.join(",") - } else { - "AstNode".to_owned() - }; - writeln!( - buf, - "\nclass {}({}):", - class_name(&node.name), - super_classses - )?; - writeln!(buf, " pass")?; - } - for node in &grammar.nodes { - let super_classses = if let Some(cls) = super_types.get(&node.name) { - let super_classes: Vec = cls.iter().map(|s| class_name(s)).collect(); - super_classes.join(",") - } else { - "AstNode".to_owned() - }; - writeln!( - buf, - "\nclass {}({}):", - class_name(&node.name), - super_classses - )?; - let mut empty = true; - for field in get_fields(node) { - if field.tp == "SyntaxToken" { - continue; - } - - empty = false; - if field.tp == "predicate" { - writeln!( - buf, - " {}: predicate", - property_name(&node.name, &field.name), - )?; - } else if field.tp == "string" { - writeln!( - buf, - " {}: optional[string]", - property_name(&node.name, &field.name), - )?; - } else { - let list = field.is_many; - let (o, c) = if list { - ("list[", "]") - } else { - ("optional[", "]") - }; - writeln!( - buf, - " {}: {}\"{}\"{} | child", - property_name(&node.name, &field.name), - o, - class_name(&field.tp), - c - )?; - }; - } - if empty { - writeln!(buf, " pass")?; - } - } - Ok(String::from_utf8_lossy(&buf).to_string()) +#[derive(Eq, PartialEq)] +enum FieldType { + String, + Predicate, + Optional(String), + List(String), } struct FieldInfo { name: String, - tp: String, - is_many: bool, + ty: FieldType, } fn get_fields(node: &AstNodeSrc) -> Vec { let mut result = Vec::new(); @@ -154,8 +180,7 @@ fn get_fields(node: &AstNodeSrc) -> Vec { if predicates.contains(&name.as_str()) { result.push(FieldInfo { name: format!("is_{name}"), - tp: "predicate".to_string(), - is_many: false, + ty: FieldType::Predicate, }); } } @@ -165,210 +190,177 @@ fn get_fields(node: &AstNodeSrc) -> Vec { "Name" | "NameRef" | "Lifetime" => { result.push(FieldInfo { name: "text".to_string(), - tp: "string".to_string(), - is_many: false, + ty: FieldType::String, }); } "Abi" => { result.push(FieldInfo { name: "abi_string".to_string(), - tp: "string".to_string(), - is_many: false, + ty: FieldType::String, }); } "Literal" => { result.push(FieldInfo { name: "text_value".to_string(), - tp: "string".to_string(), - is_many: false, + ty: FieldType::String, }); } "PrefixExpr" => { result.push(FieldInfo { name: "operator_name".to_string(), - tp: "string".to_string(), - is_many: false, + ty: FieldType::String, }); } "BinExpr" => { result.push(FieldInfo { name: "lhs".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); result.push(FieldInfo { name: "rhs".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); result.push(FieldInfo { name: "operator_name".to_string(), - tp: "string".to_string(), - is_many: false, + ty: FieldType::String, }); } "IfExpr" => { result.push(FieldInfo { name: "then_branch".to_string(), - tp: "BlockExpr".to_string(), - is_many: false, + ty: FieldType::Optional("BlockExpr".to_string()), }); result.push(FieldInfo { name: "else_branch".to_string(), - tp: "ElseBranch".to_string(), - is_many: false, + ty: FieldType::Optional("ElseBranch".to_string()), }); result.push(FieldInfo { name: "condition".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "RangeExpr" => { result.push(FieldInfo { name: "start".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); result.push(FieldInfo { name: "end".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); result.push(FieldInfo { name: "operator_name".to_string(), - tp: "string".to_string(), - is_many: false, + ty: FieldType::String, }); } "RangePat" => { result.push(FieldInfo { name: "start".to_string(), - tp: "Pat".to_string(), - is_many: false, + ty: FieldType::Optional("Pat".to_string()), }); result.push(FieldInfo { name: "end".to_string(), - tp: "Pat".to_string(), - is_many: false, + ty: FieldType::Optional("Pat".to_string()), }); result.push(FieldInfo { name: "operator_name".to_string(), - tp: "string".to_string(), - is_many: false, + ty: FieldType::String, }); } "IndexExpr" => { result.push(FieldInfo { name: "index".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); result.push(FieldInfo { name: "base".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "Impl" => { result.push(FieldInfo { name: "trait_".to_string(), - tp: "Type".to_string(), - is_many: false, + ty: FieldType::Optional("Type".to_string()), }); result.push(FieldInfo { name: "self_ty".to_string(), - tp: "Type".to_string(), - is_many: false, + ty: FieldType::Optional("Type".to_string()), }); } "ForExpr" => { result.push(FieldInfo { name: "iterable".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "WhileExpr" => { result.push(FieldInfo { name: "condition".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "MatchGuard" => { result.push(FieldInfo { name: "condition".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "MacroDef" => { result.push(FieldInfo { name: "args".to_string(), - tp: "TokenTree".to_string(), - is_many: false, + ty: FieldType::Optional("TokenTree".to_string()), }); result.push(FieldInfo { name: "body".to_string(), - tp: "TokenTree".to_string(), - is_many: false, + ty: FieldType::Optional("TokenTree".to_string()), }); } "FormatArgsExpr" => { result.push(FieldInfo { name: "args".to_string(), - tp: "FormatArgsArg".to_string(), - is_many: true, + ty: FieldType::List("FormatArgsArg".to_string()), }); } "ArgList" => { result.push(FieldInfo { name: "args".to_string(), - tp: "Expr".to_string(), - is_many: true, + ty: FieldType::List("Expr".to_string()), }); } "Fn" => { result.push(FieldInfo { name: "body".to_string(), - tp: "BlockExpr".to_string(), - is_many: false, + ty: FieldType::Optional("BlockExpr".to_string()), }); } "Const" => { result.push(FieldInfo { name: "body".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "Static" => { result.push(FieldInfo { name: "body".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "ClosureExpr" => { result.push(FieldInfo { name: "body".to_string(), - tp: "Expr".to_string(), - is_many: false, + ty: FieldType::Optional("Expr".to_string()), }); } "ArrayExpr" => { result.push(FieldInfo { name: "is_semicolon".to_string(), - tp: "predicate".to_string(), - is_many: false, + ty: FieldType::Predicate, }); } "SelfParam" => { result.push(FieldInfo { name: "is_amp".to_string(), - tp: "predicate".to_string(), - is_many: false, + ty: FieldType::Predicate, }); } _ => {} @@ -379,72 +371,69 @@ fn get_fields(node: &AstNodeSrc) -> Vec { if node.name == "ArrayExpr" && field.method_name() == "expr" { continue; } + let ty = match field { + Field::Token(_) => continue, + Field::Node { + ty, cardinality, .. + } => match cardinality { + Cardinality::Optional => FieldType::Optional(ty.clone()), + Cardinality::Many => FieldType::List(ty.clone()), + }, + }; result.push(FieldInfo { name: field.method_name(), - tp: field.ty().to_string(), - is_many: field.is_many(), + ty, }); } for trait_ in &node.traits { match trait_.as_str() { "HasAttrs" => result.push(FieldInfo { name: "attrs".to_owned(), - tp: "Attr".to_owned(), - is_many: true, + ty: FieldType::List("Attr".to_owned()), }), "HasName" => result.push(FieldInfo { name: "name".to_owned(), - tp: "Name".to_owned(), - is_many: false, + ty: FieldType::Optional("Name".to_owned()), }), "HasVisibility" => result.push(FieldInfo { name: "visibility".to_owned(), - tp: "Visibility".to_owned(), - is_many: false, + ty: FieldType::Optional("Visibility".to_owned()), }), "HasGenericParams" => { result.push(FieldInfo { name: "generic_param_list".to_owned(), - tp: "GenericParamList".to_owned(), - is_many: false, + ty: FieldType::Optional("GenericParamList".to_owned()), }); result.push(FieldInfo { name: "where_clause".to_owned(), - tp: "WhereClause".to_owned(), - is_many: false, + ty: FieldType::Optional("WhereClause".to_owned()), }) } "HasGenericArgs" => result.push(FieldInfo { name: "generic_arg_list".to_owned(), - tp: "GenericArgList".to_owned(), - is_many: false, + ty: FieldType::Optional("GenericArgList".to_owned()), }), "HasTypeBounds" => result.push(FieldInfo { name: "type_bound_list".to_owned(), - tp: "TypeBoundList".to_owned(), - is_many: false, + ty: FieldType::Optional("TypeBoundList".to_owned()), }), "HasModuleItem" => result.push(FieldInfo { name: "items".to_owned(), - tp: "Item".to_owned(), - is_many: true, + ty: FieldType::List("Item".to_owned()), }), "HasLoopBody" => { result.push(FieldInfo { name: "label".to_owned(), - tp: "Label".to_owned(), - is_many: false, + ty: FieldType::Optional("Label".to_owned()), }); result.push(FieldInfo { name: "loop_body".to_owned(), - tp: "BlockExpr".to_owned(), - is_many: false, + ty: FieldType::Optional("BlockExpr".to_owned()), }) } "HasArgList" => result.push(FieldInfo { name: "arg_list".to_owned(), - tp: "ArgList".to_owned(), - is_many: false, + ty: FieldType::Optional("ArgList".to_owned()), }), "HasDocComments" => {} @@ -455,150 +444,122 @@ fn get_fields(node: &AstNodeSrc) -> Vec { result } -fn write_extractor(grammar: &AstSrc) -> std::io::Result { - let mut buf: Vec = Vec::new(); - writeln!( - buf, - "//! Generated by `ast-generator`, do not edit by hand.\n -#![cfg_attr(any(), rustfmt::skip)] - -use super::base::Translator; -use super::mappings::TextValue; -use crate::emit_detached; -use crate::generated; -use crate::trap::{{Label, TrapId}}; -use ra_ap_syntax::ast::{{ - HasArgList, HasAttrs, HasGenericArgs, HasGenericParams, HasLoopBody, HasModuleItem, HasName, - HasTypeBounds, HasVisibility, RangeItem, -}}; -use ra_ap_syntax::{{ast, AstNode}}; - -impl Translator<'_> {{ - fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Option> {{ - match node {{ - ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into), - ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).map(Into::into), - }} - }}\n" - )?; - for node in &grammar.enums { - let type_name = &node.name; - let class_name = class_name(&node.name); - - writeln!( - buf, - " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option> {{", - to_lower_snake_case(type_name), - type_name, - class_name - )?; - writeln!(buf, " match node {{")?; - for variant in &node.variants { - writeln!( - buf, - " ast::{}::{}(inner) => self.emit_{}(inner).map(Into::into),", - type_name, - variant, - to_lower_snake_case(variant) - )?; - } - writeln!(buf, " }}")?; - writeln!(buf, " }}\n")?; - } - - for node in &grammar.nodes { - let type_name = &node.name; - let class_name = class_name(&node.name); - - writeln!( - buf, - " pub(crate) fn emit_{}(&mut self, node: ast::{}) -> Option> {{", - to_lower_snake_case(type_name), - type_name, - class_name - )?; - for field in get_fields(node) { - if &field.tp == "SyntaxToken" { - continue; - } - - if field.name == "attrs" { - // special case: this means the node type implements `HasAttrs`, and we want to - // check whether it was not excluded by a `cfg` attribute - writeln!( - buf, - " if self.should_be_excluded(&node) {{ return None; }}" - )?; - } - - let type_name = &field.tp; - let struct_field_name = &field.name; - let class_field_name = property_name(&node.name, &field.name); - if field.tp == "predicate" { - writeln!( - buf, - " let {} = node.{}_token().is_some();", - class_field_name, - &struct_field_name[3..], - )?; - } else if field.tp == "string" { - writeln!( - buf, - " let {} = node.try_get_text();", - class_field_name, - )?; - } else if field.is_many { - writeln!( - buf, - " let {} = node.{}().filter_map(|x| self.emit_{}(x)).collect();", - class_field_name, - struct_field_name, - to_lower_snake_case(type_name) - )?; - } else { - writeln!( - buf, - " let {} = node.{}().and_then(|x| self.emit_{}(x));", - class_field_name, - struct_field_name, - to_lower_snake_case(type_name) - )?; - } - } - writeln!( - buf, - " let label = self.trap.emit(generated::{} {{", - class_name - )?; - writeln!(buf, " id: TrapId::Star,")?; - for field in get_fields(node) { - if field.tp == "SyntaxToken" { - continue; - } - - let class_field_name: String = property_name(&node.name, &field.name); - writeln!(buf, " {},", class_field_name)?; - } - writeln!(buf, " }});")?; - writeln!(buf, " self.emit_location(label, &node);")?; - writeln!( - buf, - " emit_detached!({}, self, node, label);", - class_name - )?; - writeln!( - buf, - " self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens());" - )?; - writeln!(buf, " Some(label)")?; - - writeln!(buf, " }}\n")?; - } - writeln!(buf, "}}")?; - Ok(String::from_utf8_lossy(&buf).into_owned()) +#[derive(Serialize)] +struct EnumVariantInfo { + name: String, + snake_case_name: String, } -fn main() -> std::io::Result<()> { +#[derive(Serialize)] +struct ExtractorEnumInfo { + name: String, + snake_case_name: String, + ast_name: String, + variants: Vec, +} + +#[derive(Serialize, Default)] +struct ExtractorNodeFieldInfo { + name: String, + method: String, + snake_case_ty: String, + string: bool, + predicate: bool, + optional: bool, + list: bool, +} + +#[derive(Serialize)] +struct ExtractorNodeInfo { + name: String, + snake_case_name: String, + ast_name: String, + fields: Vec, + has_attrs: bool, +} + +#[derive(Serialize)] +struct ExtractorInfo { + enums: Vec, + nodes: Vec, +} + +fn enum_to_extractor_info(node: &AstEnumSrc) -> ExtractorEnumInfo { + ExtractorEnumInfo { + name: class_name(&node.name), + snake_case_name: to_lower_snake_case(&node.name), + ast_name: node.name.clone(), + variants: node + .variants + .iter() + .map(|v| EnumVariantInfo { + name: v.clone(), + snake_case_name: to_lower_snake_case(v), + }) + .collect(), + } +} + +fn field_info_to_extractor_info(node: &AstNodeSrc, field: &FieldInfo) -> ExtractorNodeFieldInfo { + let name = property_name(&node.name, &field.name); + match &field.ty { + FieldType::String => ExtractorNodeFieldInfo { + name, + string: true, + ..Default::default() + }, + FieldType::Predicate => ExtractorNodeFieldInfo { + name, + method: format!("{}_token", &field.name[3..]), + predicate: true, + ..Default::default() + }, + FieldType::Optional(ty) => ExtractorNodeFieldInfo { + name, + method: field.name.clone(), + snake_case_ty: to_lower_snake_case(ty), + optional: true, + ..Default::default() + }, + FieldType::List(ty) => ExtractorNodeFieldInfo { + name, + method: field.name.clone(), + snake_case_ty: to_lower_snake_case(ty), + list: true, + ..Default::default() + }, + } +} +fn node_to_extractor_info(node: &AstNodeSrc) -> ExtractorNodeInfo { + let fields = get_fields(node); + let has_attrs = fields.iter().any(|f| f.name == "attrs"); + ExtractorNodeInfo { + name: class_name(&node.name), + snake_case_name: to_lower_snake_case(&node.name), + ast_name: node.name.clone(), + fields: fields + .iter() + .map(|f| field_info_to_extractor_info(node, f)) + .collect(), + has_attrs, + } +} + +fn write_extractor(grammar: &AstSrc) -> mustache::Result { + let extractor_info = ExtractorInfo { + enums: grammar.enums.iter().map(enum_to_extractor_info).collect(), + nodes: grammar.nodes.iter().map(node_to_extractor_info).collect(), + }; + // the concat dance is currently required by bazel + let template = mustache::compile_str(include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/src/templates/extractor.mustache" + )))?; + let res = template.render_to_string(&extractor_info)?; + Ok(fix_blank_lines(&res)) +} + +fn main() -> anyhow::Result<()> { let grammar = PathBuf::from("..").join(env::args().nth(1).expect("grammar file path required")); let grammar: Grammar = fs::read_to_string(&grammar) .unwrap_or_else(|_| panic!("Failed to parse grammar file: {}", grammar.display())) diff --git a/rust/ast-generator/src/templates/extractor.mustache b/rust/ast-generator/src/templates/extractor.mustache new file mode 100644 index 00000000000..0532bb32ff7 --- /dev/null +++ b/rust/ast-generator/src/templates/extractor.mustache @@ -0,0 +1,65 @@ +//! Generated by `ast-generator`, do not edit by hand. +¶{{! <- denotes empty line that should be kept, all blank lines are removed otherwise}} +#![cfg_attr(any(), rustfmt::skip)] +¶ +use super::base::Translator; +use super::mappings::TextValue; +use crate::emit_detached; +use crate::generated; +use crate::trap::{Label, TrapId}; +use ra_ap_syntax::ast::{ + HasArgList, HasAttrs, HasGenericArgs, HasGenericParams, HasLoopBody, HasModuleItem, HasName, + HasTypeBounds, HasVisibility, RangeItem, +}; +use ra_ap_syntax::{ast, AstNode}; +¶ +impl Translator<'_> { + fn emit_else_branch(&mut self, node: ast::ElseBranch) -> Option> { + match node { + ast::ElseBranch::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into), + ast::ElseBranch::Block(inner) => self.emit_block_expr(inner).map(Into::into), + } + } + {{#enums}} +¶ + pub(crate) fn emit_{{snake_case_name}}(&mut self, node: ast::{{ast_name}}) -> Option> { + match node { + {{#variants}} + ast::{{ast_name}}::{{name}}(inner) => self.emit_{{snake_case_name}}(inner).map(Into::into), + {{/variants}} + } + } + {{/enums}} + {{#nodes}} +¶ + pub(crate) fn emit_{{snake_case_name}}(&mut self, node: ast::{{ast_name}}) -> Option> { + {{#has_attrs}} + if self.should_be_excluded(&node) { return None; } + {{/has_attrs}} + {{#fields}} + {{#predicate}} + let {{name}} = node.{{method}}().is_some(); + {{/predicate}} + {{#string}} + let {{name}} = node.try_get_text(); + {{/string}} + {{#list}} + let {{name}} = node.{{method}}().filter_map(|x| self.emit_{{snake_case_ty}}(x)).collect(); + {{/list}} + {{#optional}} + let {{name}} = node.{{method}}().and_then(|x| self.emit_{{snake_case_ty}}(x)); + {{/optional}} + {{/fields}} + let label = self.trap.emit(generated::{{name}} { + id: TrapId::Star, + {{#fields}} + {{name}}, + {{/fields}} + }); + self.emit_location(label, &node); + emit_detached!({{name}}, self, node, label); + self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } + {{/nodes}} +} diff --git a/rust/ast-generator/src/templates/schema.mustache b/rust/ast-generator/src/templates/schema.mustache new file mode 100644 index 00000000000..f698f3efc79 --- /dev/null +++ b/rust/ast-generator/src/templates/schema.mustache @@ -0,0 +1,13 @@ +# Generated by `ast-generator`, do not edit by hand. +¶{{! <- denotes empty line that should be kept, all blank lines are removed otherwise}} +from .prelude import * +{{#classes}} +¶ +class {{name}}({{#bases}}{{.}}, {{/bases}}): +{{#fields}} + {{name}}: {{{ty}}}{{#child}} | child{{/child}} +{{/fields}} +{{^fields}} + pass +{{/fields}} +{{/classes}} diff --git a/rust/extractor/Cargo.toml b/rust/extractor/Cargo.toml index 163a28b035a..527bb0e41b9 100644 --- a/rust/extractor/Cargo.toml +++ b/rust/extractor/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] -anyhow = "1.0.86" +anyhow = "1.0.95" clap = { version = "4.5.16", features = ["derive"] } figment = { version = "0.10.19", features = ["env", "yaml"] } log = "0.4.22" diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index 9a811ebb564..136bcfe71e8 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -288,8 +288,8 @@ impl Translator<'_> { } pub(crate) fn emit_asm_expr(&mut self, node: ast::AsmExpr) -> Option> { - let asm_pieces = node.asm_pieces().filter_map(|x| self.emit_asm_piece(x)).collect(); if self.should_be_excluded(&node) { return None; } + let asm_pieces = node.asm_pieces().filter_map(|x| self.emit_asm_piece(x)).collect(); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let template = node.template().filter_map(|x| self.emit_expr(x)).collect(); let label = self.trap.emit(generated::AsmExpr { @@ -409,8 +409,8 @@ impl Translator<'_> { } pub(crate) fn emit_assoc_item_list(&mut self, node: ast::AssocItemList) -> Option> { - let assoc_items = node.assoc_items().filter_map(|x| self.emit_assoc_item(x)).collect(); if self.should_be_excluded(&node) { return None; } + let assoc_items = node.assoc_items().filter_map(|x| self.emit_assoc_item(x)).collect(); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let label = self.trap.emit(generated::AssocItemList { id: TrapId::Star, @@ -569,8 +569,8 @@ impl Translator<'_> { } pub(crate) fn emit_call_expr(&mut self, node: ast::CallExpr) -> Option> { - let arg_list = node.arg_list().and_then(|x| self.emit_arg_list(x)); if self.should_be_excluded(&node) { return None; } + let arg_list = node.arg_list().and_then(|x| self.emit_arg_list(x)); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let function = node.expr().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::CallExpr { @@ -780,8 +780,8 @@ impl Translator<'_> { } pub(crate) fn emit_extern_block(&mut self, node: ast::ExternBlock) -> Option> { - let abi = node.abi().and_then(|x| self.emit_abi(x)); if self.should_be_excluded(&node) { return None; } + let abi = node.abi().and_then(|x| self.emit_abi(x)); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let extern_item_list = node.extern_item_list().and_then(|x| self.emit_extern_item_list(x)); let is_unsafe = node.unsafe_token().is_some(); @@ -850,8 +850,8 @@ impl Translator<'_> { } pub(crate) fn emit_fn(&mut self, node: ast::Fn) -> Option> { - let abi = node.abi().and_then(|x| self.emit_abi(x)); if self.should_be_excluded(&node) { return None; } + let abi = node.abi().and_then(|x| self.emit_abi(x)); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let body = node.body().and_then(|x| self.emit_block_expr(x)); let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); @@ -960,8 +960,8 @@ impl Translator<'_> { } pub(crate) fn emit_format_args_expr(&mut self, node: ast::FormatArgsExpr) -> Option> { - let args = node.args().filter_map(|x| self.emit_format_args_arg(x)).collect(); if self.should_be_excluded(&node) { return None; } + let args = node.args().filter_map(|x| self.emit_format_args_arg(x)).collect(); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let template = node.template().and_then(|x| self.emit_expr(x)); let label = self.trap.emit(generated::FormatArgsExpr { @@ -1041,8 +1041,8 @@ impl Translator<'_> { } pub(crate) fn emit_impl(&mut self, node: ast::Impl) -> Option> { - let assoc_item_list = node.assoc_item_list().and_then(|x| self.emit_assoc_item_list(x)); if self.should_be_excluded(&node) { return None; } + let assoc_item_list = node.assoc_item_list().and_then(|x| self.emit_assoc_item_list(x)); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); let is_const = node.const_token().is_some(); @@ -1290,8 +1290,8 @@ impl Translator<'_> { } pub(crate) fn emit_macro_def(&mut self, node: ast::MacroDef) -> Option> { - let args = node.args().and_then(|x| self.emit_token_tree(x)); if self.should_be_excluded(&node) { return None; } + let args = node.args().and_then(|x| self.emit_token_tree(x)); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let body = node.body().and_then(|x| self.emit_token_tree(x)); let name = node.name().and_then(|x| self.emit_name(x)); @@ -1411,8 +1411,8 @@ impl Translator<'_> { } pub(crate) fn emit_match_arm_list(&mut self, node: ast::MatchArmList) -> Option> { - let arms = node.arms().filter_map(|x| self.emit_match_arm(x)).collect(); if self.should_be_excluded(&node) { return None; } + let arms = node.arms().filter_map(|x| self.emit_match_arm(x)).collect(); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let label = self.trap.emit(generated::MatchArmList { id: TrapId::Star, @@ -1473,8 +1473,8 @@ impl Translator<'_> { } pub(crate) fn emit_method_call_expr(&mut self, node: ast::MethodCallExpr) -> Option> { - let arg_list = node.arg_list().and_then(|x| self.emit_arg_list(x)); if self.should_be_excluded(&node) { return None; } + let arg_list = node.arg_list().and_then(|x| self.emit_arg_list(x)); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let generic_arg_list = node.generic_arg_list().and_then(|x| self.emit_generic_arg_list(x)); let name_ref = node.name_ref().and_then(|x| self.emit_name_ref(x)); @@ -2179,8 +2179,8 @@ impl Translator<'_> { } pub(crate) fn emit_trait(&mut self, node: ast::Trait) -> Option> { - let assoc_item_list = node.assoc_item_list().and_then(|x| self.emit_assoc_item_list(x)); if self.should_be_excluded(&node) { return None; } + let assoc_item_list = node.assoc_item_list().and_then(|x| self.emit_assoc_item_list(x)); let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); let generic_param_list = node.generic_param_list().and_then(|x| self.emit_generic_param_list(x)); let is_auto = node.auto_token().is_some(); @@ -2643,5 +2643,4 @@ impl Translator<'_> { self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens()); Some(label) } - } diff --git a/rust/schema/ast.py b/rust/schema/ast.py index 2f7f3f4ab02..fea7a1384fb 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -2,773 +2,773 @@ from .prelude import * -class AsmOperand(AstNode): - pass +class AsmOperand(AstNode, ): + pass -class AsmPiece(AstNode): - pass +class AsmPiece(AstNode, ): + pass -class AssocItem(AstNode): - pass +class AssocItem(AstNode, ): + pass -class Expr(AstNode): - pass +class Expr(AstNode, ): + pass -class ExternItem(AstNode): - pass +class ExternItem(AstNode, ): + pass -class FieldList(AstNode): - pass +class FieldList(AstNode, ): + pass -class GenericArg(AstNode): - pass +class GenericArg(AstNode, ): + pass -class GenericParam(AstNode): - pass +class GenericParam(AstNode, ): + pass -class Pat(AstNode): - pass +class Pat(AstNode, ): + pass -class Stmt(AstNode): - pass +class Stmt(AstNode, ): + pass -class TypeRepr(AstNode): - pass +class TypeRepr(AstNode, ): + pass -class UseBoundGenericArg(AstNode): - pass +class UseBoundGenericArg(AstNode, ): + pass -class Item(Stmt): - pass +class Item(Stmt, ): + pass -class Abi(AstNode): - abi_string: optional[string] +class Abi(AstNode, ): + abi_string: optional[string] -class ArgList(AstNode): - args: list["Expr"] | child +class ArgList(AstNode, ): + args: list["Expr"] | child -class ArrayExprInternal(Expr): - attrs: list["Attr"] | child - exprs: list["Expr"] | child - is_semicolon: predicate +class ArrayExprInternal(Expr, ): + attrs: list["Attr"] | child + exprs: list["Expr"] | child + is_semicolon: predicate -class ArrayTypeRepr(TypeRepr): - const_arg: optional["ConstArg"] | child - element_type_repr: optional["TypeRepr"] | child +class ArrayTypeRepr(TypeRepr, ): + const_arg: optional["ConstArg"] | child + element_type_repr: optional["TypeRepr"] | child -class AsmClobberAbi(AsmPiece): - pass +class AsmClobberAbi(AsmPiece, ): + pass -class AsmConst(AsmOperand): - expr: optional["Expr"] | child - is_const: predicate +class AsmConst(AsmOperand, ): + expr: optional["Expr"] | child + is_const: predicate -class AsmDirSpec(AstNode): - pass +class AsmDirSpec(AstNode, ): + pass -class AsmExpr(Expr): - asm_pieces: list["AsmPiece"] | child - attrs: list["Attr"] | child - template: list["Expr"] | child - -class AsmLabel(AsmOperand): - block_expr: optional["BlockExpr"] | child - -class AsmOperandExpr(AstNode): - in_expr: optional["Expr"] | child - out_expr: optional["Expr"] | child - -class AsmOperandNamed(AsmPiece): - asm_operand: optional["AsmOperand"] | child - name: optional["Name"] | child - -class AsmOption(AstNode): - is_raw: predicate - -class AsmOptionsList(AsmPiece): - asm_options: list["AsmOption"] | child - -class AsmRegOperand(AsmOperand): - asm_dir_spec: optional["AsmDirSpec"] | child - asm_operand_expr: optional["AsmOperandExpr"] | child - asm_reg_spec: optional["AsmRegSpec"] | child - -class AsmRegSpec(AstNode): - name_ref: optional["NameRef"] | child - -class AsmSym(AsmOperand): - path: optional["Path"] | child - -class AssocItemList(AstNode): - assoc_items: list["AssocItem"] | child - attrs: list["Attr"] | child - -class AssocTypeArg(GenericArg): - const_arg: optional["ConstArg"] | child - generic_arg_list: optional["GenericArgList"] | child - name_ref: optional["NameRef"] | child - param_list: optional["ParamList"] | child - ret_type: optional["RetTypeRepr"] | child - return_type_syntax: optional["ReturnTypeSyntax"] | child - type_repr: optional["TypeRepr"] | child - type_bound_list: optional["TypeBoundList"] | child - -class Attr(AstNode): - meta: optional["Meta"] | child - -class AwaitExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - -class BecomeExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - -class BinaryExpr(Expr): - attrs: list["Attr"] | child - lhs: optional["Expr"] | child - operator_name: optional[string] - rhs: optional["Expr"] | child - -class BlockExpr(Expr): - attrs: list["Attr"] | child - is_async: predicate - is_const: predicate - is_gen: predicate - is_move: predicate - is_try: predicate - is_unsafe: predicate - label: optional["Label"] | child - stmt_list: optional["StmtList"] | child - -class BoxPat(Pat): - pat: optional["Pat"] | child - -class BreakExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - lifetime: optional["Lifetime"] | child - -class CallExpr(Expr): - arg_list: optional["ArgList"] | child - attrs: list["Attr"] | child - function: optional["Expr"] | child - -class CastExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - type_repr: optional["TypeRepr"] | child - -class ClosureBinder(AstNode): - generic_param_list: optional["GenericParamList"] | child - -class ClosureExpr(Expr): - attrs: list["Attr"] | child - body: optional["Expr"] | child - closure_binder: optional["ClosureBinder"] | child - is_async: predicate - is_const: predicate - is_gen: predicate - is_move: predicate - is_static: predicate - param_list: optional["ParamList"] | child - ret_type: optional["RetTypeRepr"] | child - -class Const(AssocItem,Item): - attrs: list["Attr"] | child - body: optional["Expr"] | child - is_const: predicate - is_default: predicate - name: optional["Name"] | child - type_repr: optional["TypeRepr"] | child - visibility: optional["Visibility"] | child - -class ConstArg(GenericArg): - expr: optional["Expr"] | child - -class ConstBlockPat(Pat): - block_expr: optional["BlockExpr"] | child - is_const: predicate - -class ConstParam(GenericParam): - attrs: list["Attr"] | child - default_val: optional["ConstArg"] | child - is_const: predicate - name: optional["Name"] | child - type_repr: optional["TypeRepr"] | child - -class ContinueExpr(Expr): - attrs: list["Attr"] | child - lifetime: optional["Lifetime"] | child - -class DynTraitTypeRepr(TypeRepr): - type_bound_list: optional["TypeBoundList"] | child - -class Enum(Item): - attrs: list["Attr"] | child - generic_param_list: optional["GenericParamList"] | child - name: optional["Name"] | child - variant_list: optional["VariantList"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class ExprStmt(Stmt): - expr: optional["Expr"] | child - -class ExternBlock(Item): - abi: optional["Abi"] | child - attrs: list["Attr"] | child - extern_item_list: optional["ExternItemList"] | child - is_unsafe: predicate - -class ExternCrate(Item): - attrs: list["Attr"] | child - name_ref: optional["NameRef"] | child - rename: optional["Rename"] | child - visibility: optional["Visibility"] | child - -class ExternItemList(AstNode): - attrs: list["Attr"] | child - extern_items: list["ExternItem"] | child - -class FieldExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - name_ref: optional["NameRef"] | child - -class Function(AssocItem,ExternItem,Item): - abi: optional["Abi"] | child - attrs: list["Attr"] | child - body: optional["BlockExpr"] | child - generic_param_list: optional["GenericParamList"] | child - is_async: predicate - is_const: predicate - is_default: predicate - is_gen: predicate - is_unsafe: predicate - name: optional["Name"] | child - param_list: optional["ParamList"] | child - ret_type: optional["RetTypeRepr"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class FnPtrTypeRepr(TypeRepr): - abi: optional["Abi"] | child - is_async: predicate - is_const: predicate - is_unsafe: predicate - param_list: optional["ParamList"] | child - ret_type: optional["RetTypeRepr"] | child - -class ForExpr(Expr): - attrs: list["Attr"] | child - iterable: optional["Expr"] | child - label: optional["Label"] | child - loop_body: optional["BlockExpr"] | child - pat: optional["Pat"] | child - -class ForTypeRepr(TypeRepr): - generic_param_list: optional["GenericParamList"] | child - type_repr: optional["TypeRepr"] | child - -class FormatArgsArg(AstNode): - expr: optional["Expr"] | child - name: optional["Name"] | child - -class FormatArgsExpr(Expr): - args: list["FormatArgsArg"] | child - attrs: list["Attr"] | child - template: optional["Expr"] | child - -class GenericArgList(AstNode): - generic_args: list["GenericArg"] | child - -class GenericParamList(AstNode): - generic_params: list["GenericParam"] | child - -class IdentPat(Pat): - attrs: list["Attr"] | child - is_mut: predicate - is_ref: predicate - name: optional["Name"] | child - pat: optional["Pat"] | child - -class IfExpr(Expr): - attrs: list["Attr"] | child - condition: optional["Expr"] | child - else_: optional["Expr"] | child - then: optional["BlockExpr"] | child - -class Impl(Item): - assoc_item_list: optional["AssocItemList"] | child - attrs: list["Attr"] | child - generic_param_list: optional["GenericParamList"] | child - is_const: predicate - is_default: predicate - is_unsafe: predicate - self_ty: optional["TypeRepr"] | child - trait_: optional["TypeRepr"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class ImplTraitTypeRepr(TypeRepr): - type_bound_list: optional["TypeBoundList"] | child - -class IndexExpr(Expr): - attrs: list["Attr"] | child - base: optional["Expr"] | child - index: optional["Expr"] | child - -class InferTypeRepr(TypeRepr): - pass - -class ItemList(AstNode): - attrs: list["Attr"] | child - items: list["Item"] | child - -class Label(AstNode): - lifetime: optional["Lifetime"] | child - -class LetElse(AstNode): - block_expr: optional["BlockExpr"] | child - -class LetExpr(Expr): - attrs: list["Attr"] | child - scrutinee: optional["Expr"] | child - pat: optional["Pat"] | child - -class LetStmt(Stmt): - attrs: list["Attr"] | child - initializer: optional["Expr"] | child - let_else: optional["LetElse"] | child - pat: optional["Pat"] | child - type_repr: optional["TypeRepr"] | child - -class Lifetime(UseBoundGenericArg): - text: optional[string] - -class LifetimeArg(GenericArg): - lifetime: optional["Lifetime"] | child - -class LifetimeParam(GenericParam): - attrs: list["Attr"] | child - lifetime: optional["Lifetime"] | child - type_bound_list: optional["TypeBoundList"] | child - -class LiteralExpr(Expr): - attrs: list["Attr"] | child - text_value: optional[string] - -class LiteralPat(Pat): - literal: optional["LiteralExpr"] | child - -class LoopExpr(Expr): - attrs: list["Attr"] | child - label: optional["Label"] | child - loop_body: optional["BlockExpr"] | child - -class MacroCall(AssocItem,ExternItem,Item): - attrs: list["Attr"] | child - path: optional["Path"] | child - token_tree: optional["TokenTree"] | child - -class MacroDef(Item): - args: optional["TokenTree"] | child - attrs: list["Attr"] | child - body: optional["TokenTree"] | child - name: optional["Name"] | child - visibility: optional["Visibility"] | child - -class MacroExpr(Expr): - macro_call: optional["MacroCall"] | child - -class MacroItems(AstNode): - items: list["Item"] | child - -class MacroPat(Pat): - macro_call: optional["MacroCall"] | child - -class MacroRules(Item): - attrs: list["Attr"] | child - name: optional["Name"] | child - token_tree: optional["TokenTree"] | child - visibility: optional["Visibility"] | child - -class MacroStmts(AstNode): - expr: optional["Expr"] | child - statements: list["Stmt"] | child - -class MacroTypeRepr(TypeRepr): - macro_call: optional["MacroCall"] | child - -class MatchArm(AstNode): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - guard: optional["MatchGuard"] | child - pat: optional["Pat"] | child - -class MatchArmList(AstNode): - arms: list["MatchArm"] | child - attrs: list["Attr"] | child - -class MatchExpr(Expr): - attrs: list["Attr"] | child - scrutinee: optional["Expr"] | child - match_arm_list: optional["MatchArmList"] | child - -class MatchGuard(AstNode): - condition: optional["Expr"] | child - -class Meta(AstNode): - expr: optional["Expr"] | child - is_unsafe: predicate - path: optional["Path"] | child - token_tree: optional["TokenTree"] | child - -class MethodCallExpr(Expr): - arg_list: optional["ArgList"] | child - attrs: list["Attr"] | child - generic_arg_list: optional["GenericArgList"] | child - name_ref: optional["NameRef"] | child - receiver: optional["Expr"] | child - -class Module(Item): - attrs: list["Attr"] | child - item_list: optional["ItemList"] | child - name: optional["Name"] | child - visibility: optional["Visibility"] | child - -class Name(AstNode): - text: optional[string] - -class NameRef(UseBoundGenericArg): - text: optional[string] - -class NeverTypeRepr(TypeRepr): - pass - -class OffsetOfExpr(Expr): - attrs: list["Attr"] | child - fields: list["NameRef"] | child - type_repr: optional["TypeRepr"] | child - -class OrPat(Pat): - pats: list["Pat"] | child - -class Param(AstNode): - attrs: list["Attr"] | child - pat: optional["Pat"] | child - type_repr: optional["TypeRepr"] | child - -class ParamList(AstNode): - params: list["Param"] | child - self_param: optional["SelfParam"] | child - -class ParenExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - -class ParenPat(Pat): - pat: optional["Pat"] | child - -class ParenTypeRepr(TypeRepr): - type_repr: optional["TypeRepr"] | child - -class ParenthesizedArgList(AstNode): - type_args: list["TypeArg"] | child - -class Path(AstNode): - qualifier: optional["Path"] | child - part: optional["PathSegment"] | child - -class PathExpr(Expr): - attrs: list["Attr"] | child - path: optional["Path"] | child - -class PathPat(Pat): - path: optional["Path"] | child - -class PathSegment(AstNode): - generic_arg_list: optional["GenericArgList"] | child - name_ref: optional["NameRef"] | child - parenthesized_arg_list: optional["ParenthesizedArgList"] | child - path_type: optional["PathTypeRepr"] | child - ret_type: optional["RetTypeRepr"] | child - return_type_syntax: optional["ReturnTypeSyntax"] | child - type_repr: optional["TypeRepr"] | child - -class PathTypeRepr(TypeRepr): - path: optional["Path"] | child - -class PrefixExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - operator_name: optional[string] - -class PtrTypeRepr(TypeRepr): - is_const: predicate - is_mut: predicate - type_repr: optional["TypeRepr"] | child - -class RangeExpr(Expr): - attrs: list["Attr"] | child - end: optional["Expr"] | child - operator_name: optional[string] - start: optional["Expr"] | child - -class RangePat(Pat): - end: optional["Pat"] | child - operator_name: optional[string] - start: optional["Pat"] | child - -class RecordExpr(Expr): - path: optional["Path"] | child - record_expr_field_list: optional["RecordExprFieldList"] | child - -class RecordExprField(AstNode): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - name_ref: optional["NameRef"] | child - -class RecordExprFieldList(AstNode): - attrs: list["Attr"] | child - fields: list["RecordExprField"] | child - spread: optional["Expr"] | child - -class RecordField(AstNode): - attrs: list["Attr"] | child - name: optional["Name"] | child - type_repr: optional["TypeRepr"] | child - visibility: optional["Visibility"] | child - -class RecordFieldList(FieldList): - fields: list["RecordField"] | child - -class RecordPat(Pat): - path: optional["Path"] | child - record_pat_field_list: optional["RecordPatFieldList"] | child - -class RecordPatField(AstNode): - attrs: list["Attr"] | child - name_ref: optional["NameRef"] | child - pat: optional["Pat"] | child - -class RecordPatFieldList(AstNode): - fields: list["RecordPatField"] | child - rest_pat: optional["RestPat"] | child - -class RefExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - is_const: predicate - is_mut: predicate - is_raw: predicate - -class RefPat(Pat): - is_mut: predicate - pat: optional["Pat"] | child - -class RefTypeRepr(TypeRepr): - is_mut: predicate - lifetime: optional["Lifetime"] | child - type_repr: optional["TypeRepr"] | child - -class Rename(AstNode): - name: optional["Name"] | child - -class RestPat(Pat): - attrs: list["Attr"] | child - -class RetTypeRepr(AstNode): - type_repr: optional["TypeRepr"] | child - -class ReturnExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - -class ReturnTypeSyntax(AstNode): - pass - -class SelfParam(AstNode): - attrs: list["Attr"] | child - is_ref: predicate - is_mut: predicate - lifetime: optional["Lifetime"] | child - name: optional["Name"] | child - type_repr: optional["TypeRepr"] | child - -class SlicePat(Pat): - pats: list["Pat"] | child - -class SliceTypeRepr(TypeRepr): - type_repr: optional["TypeRepr"] | child - -class SourceFile(AstNode): - attrs: list["Attr"] | child - items: list["Item"] | child - -class Static(ExternItem,Item): - attrs: list["Attr"] | child - body: optional["Expr"] | child - is_mut: predicate - is_static: predicate - is_unsafe: predicate - name: optional["Name"] | child - type_repr: optional["TypeRepr"] | child - visibility: optional["Visibility"] | child - -class StmtList(AstNode): - attrs: list["Attr"] | child - statements: list["Stmt"] | child - tail_expr: optional["Expr"] | child - -class Struct(Item): - attrs: list["Attr"] | child - field_list: optional["FieldList"] | child - generic_param_list: optional["GenericParamList"] | child - name: optional["Name"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class TokenTree(AstNode): - pass - -class Trait(Item): - assoc_item_list: optional["AssocItemList"] | child - attrs: list["Attr"] | child - generic_param_list: optional["GenericParamList"] | child - is_auto: predicate - is_unsafe: predicate - name: optional["Name"] | child - type_bound_list: optional["TypeBoundList"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class TraitAlias(Item): - attrs: list["Attr"] | child - generic_param_list: optional["GenericParamList"] | child - name: optional["Name"] | child - type_bound_list: optional["TypeBoundList"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class TryExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - -class TupleExpr(Expr): - attrs: list["Attr"] | child - fields: list["Expr"] | child - -class TupleField(AstNode): - attrs: list["Attr"] | child - type_repr: optional["TypeRepr"] | child - visibility: optional["Visibility"] | child - -class TupleFieldList(FieldList): - fields: list["TupleField"] | child - -class TuplePat(Pat): - fields: list["Pat"] | child - -class TupleStructPat(Pat): - fields: list["Pat"] | child - path: optional["Path"] | child - -class TupleTypeRepr(TypeRepr): - fields: list["TypeRepr"] | child - -class TypeAlias(AssocItem,ExternItem,Item): - attrs: list["Attr"] | child - generic_param_list: optional["GenericParamList"] | child - is_default: predicate - name: optional["Name"] | child - type_repr: optional["TypeRepr"] | child - type_bound_list: optional["TypeBoundList"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class TypeArg(GenericArg): - type_repr: optional["TypeRepr"] | child - -class TypeBound(AstNode): - is_async: predicate - is_const: predicate - lifetime: optional["Lifetime"] | child - type_repr: optional["TypeRepr"] | child - use_bound_generic_args: optional["UseBoundGenericArgs"] | child - -class TypeBoundList(AstNode): - bounds: list["TypeBound"] | child - -class TypeParam(GenericParam): - attrs: list["Attr"] | child - default_type: optional["TypeRepr"] | child - name: optional["Name"] | child - type_bound_list: optional["TypeBoundList"] | child - -class UnderscoreExpr(Expr): - attrs: list["Attr"] | child - -class Union(Item): - attrs: list["Attr"] | child - generic_param_list: optional["GenericParamList"] | child - name: optional["Name"] | child - record_field_list: optional["RecordFieldList"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child - -class Use(Item): - attrs: list["Attr"] | child - use_tree: optional["UseTree"] | child - visibility: optional["Visibility"] | child - -class UseBoundGenericArgs(AstNode): - use_bound_generic_args: list["UseBoundGenericArg"] | child - -class UseTree(AstNode): - path: optional["Path"] | child - rename: optional["Rename"] | child - use_tree_list: optional["UseTreeList"] | child - -class UseTreeList(AstNode): - use_trees: list["UseTree"] | child - -class Variant(AstNode): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - field_list: optional["FieldList"] | child - name: optional["Name"] | child - visibility: optional["Visibility"] | child - -class VariantList(AstNode): - variants: list["Variant"] | child - -class Visibility(AstNode): - path: optional["Path"] | child - -class WhereClause(AstNode): - predicates: list["WherePred"] | child - -class WherePred(AstNode): - generic_param_list: optional["GenericParamList"] | child - lifetime: optional["Lifetime"] | child - type_repr: optional["TypeRepr"] | child - type_bound_list: optional["TypeBoundList"] | child - -class WhileExpr(Expr): - attrs: list["Attr"] | child - condition: optional["Expr"] | child - label: optional["Label"] | child - loop_body: optional["BlockExpr"] | child - -class WildcardPat(Pat): - pass - -class YeetExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child - -class YieldExpr(Expr): - attrs: list["Attr"] | child - expr: optional["Expr"] | child +class AsmExpr(Expr, ): + asm_pieces: list["AsmPiece"] | child + attrs: list["Attr"] | child + template: list["Expr"] | child + +class AsmLabel(AsmOperand, ): + block_expr: optional["BlockExpr"] | child + +class AsmOperandExpr(AstNode, ): + in_expr: optional["Expr"] | child + out_expr: optional["Expr"] | child + +class AsmOperandNamed(AsmPiece, ): + asm_operand: optional["AsmOperand"] | child + name: optional["Name"] | child + +class AsmOption(AstNode, ): + is_raw: predicate + +class AsmOptionsList(AsmPiece, ): + asm_options: list["AsmOption"] | child + +class AsmRegOperand(AsmOperand, ): + asm_dir_spec: optional["AsmDirSpec"] | child + asm_operand_expr: optional["AsmOperandExpr"] | child + asm_reg_spec: optional["AsmRegSpec"] | child + +class AsmRegSpec(AstNode, ): + name_ref: optional["NameRef"] | child + +class AsmSym(AsmOperand, ): + path: optional["Path"] | child + +class AssocItemList(AstNode, ): + assoc_items: list["AssocItem"] | child + attrs: list["Attr"] | child + +class AssocTypeArg(GenericArg, ): + const_arg: optional["ConstArg"] | child + generic_arg_list: optional["GenericArgList"] | child + name_ref: optional["NameRef"] | child + param_list: optional["ParamList"] | child + ret_type: optional["RetTypeRepr"] | child + return_type_syntax: optional["ReturnTypeSyntax"] | child + type_repr: optional["TypeRepr"] | child + type_bound_list: optional["TypeBoundList"] | child + +class Attr(AstNode, ): + meta: optional["Meta"] | child + +class AwaitExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + +class BecomeExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + +class BinaryExpr(Expr, ): + attrs: list["Attr"] | child + lhs: optional["Expr"] | child + operator_name: optional[string] + rhs: optional["Expr"] | child + +class BlockExpr(Expr, ): + attrs: list["Attr"] | child + is_async: predicate + is_const: predicate + is_gen: predicate + is_move: predicate + is_try: predicate + is_unsafe: predicate + label: optional["Label"] | child + stmt_list: optional["StmtList"] | child + +class BoxPat(Pat, ): + pat: optional["Pat"] | child + +class BreakExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + lifetime: optional["Lifetime"] | child + +class CallExpr(Expr, ): + arg_list: optional["ArgList"] | child + attrs: list["Attr"] | child + function: optional["Expr"] | child + +class CastExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + type_repr: optional["TypeRepr"] | child + +class ClosureBinder(AstNode, ): + generic_param_list: optional["GenericParamList"] | child + +class ClosureExpr(Expr, ): + attrs: list["Attr"] | child + body: optional["Expr"] | child + closure_binder: optional["ClosureBinder"] | child + is_async: predicate + is_const: predicate + is_gen: predicate + is_move: predicate + is_static: predicate + param_list: optional["ParamList"] | child + ret_type: optional["RetTypeRepr"] | child + +class Const(AssocItem, Item, ): + attrs: list["Attr"] | child + body: optional["Expr"] | child + is_const: predicate + is_default: predicate + name: optional["Name"] | child + type_repr: optional["TypeRepr"] | child + visibility: optional["Visibility"] | child + +class ConstArg(GenericArg, ): + expr: optional["Expr"] | child + +class ConstBlockPat(Pat, ): + block_expr: optional["BlockExpr"] | child + is_const: predicate + +class ConstParam(GenericParam, ): + attrs: list["Attr"] | child + default_val: optional["ConstArg"] | child + is_const: predicate + name: optional["Name"] | child + type_repr: optional["TypeRepr"] | child + +class ContinueExpr(Expr, ): + attrs: list["Attr"] | child + lifetime: optional["Lifetime"] | child + +class DynTraitTypeRepr(TypeRepr, ): + type_bound_list: optional["TypeBoundList"] | child + +class Enum(Item, ): + attrs: list["Attr"] | child + generic_param_list: optional["GenericParamList"] | child + name: optional["Name"] | child + variant_list: optional["VariantList"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class ExprStmt(Stmt, ): + expr: optional["Expr"] | child + +class ExternBlock(Item, ): + abi: optional["Abi"] | child + attrs: list["Attr"] | child + extern_item_list: optional["ExternItemList"] | child + is_unsafe: predicate + +class ExternCrate(Item, ): + attrs: list["Attr"] | child + name_ref: optional["NameRef"] | child + rename: optional["Rename"] | child + visibility: optional["Visibility"] | child + +class ExternItemList(AstNode, ): + attrs: list["Attr"] | child + extern_items: list["ExternItem"] | child + +class FieldExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + name_ref: optional["NameRef"] | child + +class Function(AssocItem, ExternItem, Item, ): + abi: optional["Abi"] | child + attrs: list["Attr"] | child + body: optional["BlockExpr"] | child + generic_param_list: optional["GenericParamList"] | child + is_async: predicate + is_const: predicate + is_default: predicate + is_gen: predicate + is_unsafe: predicate + name: optional["Name"] | child + param_list: optional["ParamList"] | child + ret_type: optional["RetTypeRepr"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class FnPtrTypeRepr(TypeRepr, ): + abi: optional["Abi"] | child + is_async: predicate + is_const: predicate + is_unsafe: predicate + param_list: optional["ParamList"] | child + ret_type: optional["RetTypeRepr"] | child + +class ForExpr(Expr, ): + attrs: list["Attr"] | child + iterable: optional["Expr"] | child + label: optional["Label"] | child + loop_body: optional["BlockExpr"] | child + pat: optional["Pat"] | child + +class ForTypeRepr(TypeRepr, ): + generic_param_list: optional["GenericParamList"] | child + type_repr: optional["TypeRepr"] | child + +class FormatArgsArg(AstNode, ): + expr: optional["Expr"] | child + name: optional["Name"] | child + +class FormatArgsExpr(Expr, ): + args: list["FormatArgsArg"] | child + attrs: list["Attr"] | child + template: optional["Expr"] | child + +class GenericArgList(AstNode, ): + generic_args: list["GenericArg"] | child + +class GenericParamList(AstNode, ): + generic_params: list["GenericParam"] | child + +class IdentPat(Pat, ): + attrs: list["Attr"] | child + is_mut: predicate + is_ref: predicate + name: optional["Name"] | child + pat: optional["Pat"] | child + +class IfExpr(Expr, ): + attrs: list["Attr"] | child + condition: optional["Expr"] | child + else_: optional["Expr"] | child + then: optional["BlockExpr"] | child + +class Impl(Item, ): + assoc_item_list: optional["AssocItemList"] | child + attrs: list["Attr"] | child + generic_param_list: optional["GenericParamList"] | child + is_const: predicate + is_default: predicate + is_unsafe: predicate + self_ty: optional["TypeRepr"] | child + trait_: optional["TypeRepr"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class ImplTraitTypeRepr(TypeRepr, ): + type_bound_list: optional["TypeBoundList"] | child + +class IndexExpr(Expr, ): + attrs: list["Attr"] | child + base: optional["Expr"] | child + index: optional["Expr"] | child + +class InferTypeRepr(TypeRepr, ): + pass + +class ItemList(AstNode, ): + attrs: list["Attr"] | child + items: list["Item"] | child + +class Label(AstNode, ): + lifetime: optional["Lifetime"] | child + +class LetElse(AstNode, ): + block_expr: optional["BlockExpr"] | child + +class LetExpr(Expr, ): + attrs: list["Attr"] | child + scrutinee: optional["Expr"] | child + pat: optional["Pat"] | child + +class LetStmt(Stmt, ): + attrs: list["Attr"] | child + initializer: optional["Expr"] | child + let_else: optional["LetElse"] | child + pat: optional["Pat"] | child + type_repr: optional["TypeRepr"] | child + +class Lifetime(UseBoundGenericArg, ): + text: optional[string] + +class LifetimeArg(GenericArg, ): + lifetime: optional["Lifetime"] | child + +class LifetimeParam(GenericParam, ): + attrs: list["Attr"] | child + lifetime: optional["Lifetime"] | child + type_bound_list: optional["TypeBoundList"] | child + +class LiteralExpr(Expr, ): + attrs: list["Attr"] | child + text_value: optional[string] + +class LiteralPat(Pat, ): + literal: optional["LiteralExpr"] | child + +class LoopExpr(Expr, ): + attrs: list["Attr"] | child + label: optional["Label"] | child + loop_body: optional["BlockExpr"] | child + +class MacroCall(AssocItem, ExternItem, Item, ): + attrs: list["Attr"] | child + path: optional["Path"] | child + token_tree: optional["TokenTree"] | child + +class MacroDef(Item, ): + args: optional["TokenTree"] | child + attrs: list["Attr"] | child + body: optional["TokenTree"] | child + name: optional["Name"] | child + visibility: optional["Visibility"] | child + +class MacroExpr(Expr, ): + macro_call: optional["MacroCall"] | child + +class MacroItems(AstNode, ): + items: list["Item"] | child + +class MacroPat(Pat, ): + macro_call: optional["MacroCall"] | child + +class MacroRules(Item, ): + attrs: list["Attr"] | child + name: optional["Name"] | child + token_tree: optional["TokenTree"] | child + visibility: optional["Visibility"] | child + +class MacroStmts(AstNode, ): + expr: optional["Expr"] | child + statements: list["Stmt"] | child + +class MacroTypeRepr(TypeRepr, ): + macro_call: optional["MacroCall"] | child + +class MatchArm(AstNode, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + guard: optional["MatchGuard"] | child + pat: optional["Pat"] | child + +class MatchArmList(AstNode, ): + arms: list["MatchArm"] | child + attrs: list["Attr"] | child + +class MatchExpr(Expr, ): + attrs: list["Attr"] | child + scrutinee: optional["Expr"] | child + match_arm_list: optional["MatchArmList"] | child + +class MatchGuard(AstNode, ): + condition: optional["Expr"] | child + +class Meta(AstNode, ): + expr: optional["Expr"] | child + is_unsafe: predicate + path: optional["Path"] | child + token_tree: optional["TokenTree"] | child + +class MethodCallExpr(Expr, ): + arg_list: optional["ArgList"] | child + attrs: list["Attr"] | child + generic_arg_list: optional["GenericArgList"] | child + name_ref: optional["NameRef"] | child + receiver: optional["Expr"] | child + +class Module(Item, ): + attrs: list["Attr"] | child + item_list: optional["ItemList"] | child + name: optional["Name"] | child + visibility: optional["Visibility"] | child + +class Name(AstNode, ): + text: optional[string] + +class NameRef(UseBoundGenericArg, ): + text: optional[string] + +class NeverTypeRepr(TypeRepr, ): + pass + +class OffsetOfExpr(Expr, ): + attrs: list["Attr"] | child + fields: list["NameRef"] | child + type_repr: optional["TypeRepr"] | child + +class OrPat(Pat, ): + pats: list["Pat"] | child + +class Param(AstNode, ): + attrs: list["Attr"] | child + pat: optional["Pat"] | child + type_repr: optional["TypeRepr"] | child + +class ParamList(AstNode, ): + params: list["Param"] | child + self_param: optional["SelfParam"] | child + +class ParenExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + +class ParenPat(Pat, ): + pat: optional["Pat"] | child + +class ParenTypeRepr(TypeRepr, ): + type_repr: optional["TypeRepr"] | child + +class ParenthesizedArgList(AstNode, ): + type_args: list["TypeArg"] | child + +class Path(AstNode, ): + qualifier: optional["Path"] | child + part: optional["PathSegment"] | child + +class PathExpr(Expr, ): + attrs: list["Attr"] | child + path: optional["Path"] | child + +class PathPat(Pat, ): + path: optional["Path"] | child + +class PathSegment(AstNode, ): + generic_arg_list: optional["GenericArgList"] | child + name_ref: optional["NameRef"] | child + parenthesized_arg_list: optional["ParenthesizedArgList"] | child + path_type: optional["PathTypeRepr"] | child + ret_type: optional["RetTypeRepr"] | child + return_type_syntax: optional["ReturnTypeSyntax"] | child + type_repr: optional["TypeRepr"] | child + +class PathTypeRepr(TypeRepr, ): + path: optional["Path"] | child + +class PrefixExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + operator_name: optional[string] + +class PtrTypeRepr(TypeRepr, ): + is_const: predicate + is_mut: predicate + type_repr: optional["TypeRepr"] | child + +class RangeExpr(Expr, ): + attrs: list["Attr"] | child + end: optional["Expr"] | child + operator_name: optional[string] + start: optional["Expr"] | child + +class RangePat(Pat, ): + end: optional["Pat"] | child + operator_name: optional[string] + start: optional["Pat"] | child + +class RecordExpr(Expr, ): + path: optional["Path"] | child + record_expr_field_list: optional["RecordExprFieldList"] | child + +class RecordExprField(AstNode, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + name_ref: optional["NameRef"] | child + +class RecordExprFieldList(AstNode, ): + attrs: list["Attr"] | child + fields: list["RecordExprField"] | child + spread: optional["Expr"] | child + +class RecordField(AstNode, ): + attrs: list["Attr"] | child + name: optional["Name"] | child + type_repr: optional["TypeRepr"] | child + visibility: optional["Visibility"] | child + +class RecordFieldList(FieldList, ): + fields: list["RecordField"] | child + +class RecordPat(Pat, ): + path: optional["Path"] | child + record_pat_field_list: optional["RecordPatFieldList"] | child + +class RecordPatField(AstNode, ): + attrs: list["Attr"] | child + name_ref: optional["NameRef"] | child + pat: optional["Pat"] | child + +class RecordPatFieldList(AstNode, ): + fields: list["RecordPatField"] | child + rest_pat: optional["RestPat"] | child + +class RefExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + is_const: predicate + is_mut: predicate + is_raw: predicate + +class RefPat(Pat, ): + is_mut: predicate + pat: optional["Pat"] | child + +class RefTypeRepr(TypeRepr, ): + is_mut: predicate + lifetime: optional["Lifetime"] | child + type_repr: optional["TypeRepr"] | child + +class Rename(AstNode, ): + name: optional["Name"] | child + +class RestPat(Pat, ): + attrs: list["Attr"] | child + +class RetTypeRepr(AstNode, ): + type_repr: optional["TypeRepr"] | child + +class ReturnExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + +class ReturnTypeSyntax(AstNode, ): + pass + +class SelfParam(AstNode, ): + attrs: list["Attr"] | child + is_ref: predicate + is_mut: predicate + lifetime: optional["Lifetime"] | child + name: optional["Name"] | child + type_repr: optional["TypeRepr"] | child + +class SlicePat(Pat, ): + pats: list["Pat"] | child + +class SliceTypeRepr(TypeRepr, ): + type_repr: optional["TypeRepr"] | child + +class SourceFile(AstNode, ): + attrs: list["Attr"] | child + items: list["Item"] | child + +class Static(ExternItem, Item, ): + attrs: list["Attr"] | child + body: optional["Expr"] | child + is_mut: predicate + is_static: predicate + is_unsafe: predicate + name: optional["Name"] | child + type_repr: optional["TypeRepr"] | child + visibility: optional["Visibility"] | child + +class StmtList(AstNode, ): + attrs: list["Attr"] | child + statements: list["Stmt"] | child + tail_expr: optional["Expr"] | child + +class Struct(Item, ): + attrs: list["Attr"] | child + field_list: optional["FieldList"] | child + generic_param_list: optional["GenericParamList"] | child + name: optional["Name"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class TokenTree(AstNode, ): + pass + +class Trait(Item, ): + assoc_item_list: optional["AssocItemList"] | child + attrs: list["Attr"] | child + generic_param_list: optional["GenericParamList"] | child + is_auto: predicate + is_unsafe: predicate + name: optional["Name"] | child + type_bound_list: optional["TypeBoundList"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class TraitAlias(Item, ): + attrs: list["Attr"] | child + generic_param_list: optional["GenericParamList"] | child + name: optional["Name"] | child + type_bound_list: optional["TypeBoundList"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class TryExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + +class TupleExpr(Expr, ): + attrs: list["Attr"] | child + fields: list["Expr"] | child + +class TupleField(AstNode, ): + attrs: list["Attr"] | child + type_repr: optional["TypeRepr"] | child + visibility: optional["Visibility"] | child + +class TupleFieldList(FieldList, ): + fields: list["TupleField"] | child + +class TuplePat(Pat, ): + fields: list["Pat"] | child + +class TupleStructPat(Pat, ): + fields: list["Pat"] | child + path: optional["Path"] | child + +class TupleTypeRepr(TypeRepr, ): + fields: list["TypeRepr"] | child + +class TypeAlias(AssocItem, ExternItem, Item, ): + attrs: list["Attr"] | child + generic_param_list: optional["GenericParamList"] | child + is_default: predicate + name: optional["Name"] | child + type_repr: optional["TypeRepr"] | child + type_bound_list: optional["TypeBoundList"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class TypeArg(GenericArg, ): + type_repr: optional["TypeRepr"] | child + +class TypeBound(AstNode, ): + is_async: predicate + is_const: predicate + lifetime: optional["Lifetime"] | child + type_repr: optional["TypeRepr"] | child + use_bound_generic_args: optional["UseBoundGenericArgs"] | child + +class TypeBoundList(AstNode, ): + bounds: list["TypeBound"] | child + +class TypeParam(GenericParam, ): + attrs: list["Attr"] | child + default_type: optional["TypeRepr"] | child + name: optional["Name"] | child + type_bound_list: optional["TypeBoundList"] | child + +class UnderscoreExpr(Expr, ): + attrs: list["Attr"] | child + +class Union(Item, ): + attrs: list["Attr"] | child + generic_param_list: optional["GenericParamList"] | child + name: optional["Name"] | child + record_field_list: optional["RecordFieldList"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child + +class Use(Item, ): + attrs: list["Attr"] | child + use_tree: optional["UseTree"] | child + visibility: optional["Visibility"] | child + +class UseBoundGenericArgs(AstNode, ): + use_bound_generic_args: list["UseBoundGenericArg"] | child + +class UseTree(AstNode, ): + path: optional["Path"] | child + rename: optional["Rename"] | child + use_tree_list: optional["UseTreeList"] | child + +class UseTreeList(AstNode, ): + use_trees: list["UseTree"] | child + +class Variant(AstNode, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + field_list: optional["FieldList"] | child + name: optional["Name"] | child + visibility: optional["Visibility"] | child + +class VariantList(AstNode, ): + variants: list["Variant"] | child + +class Visibility(AstNode, ): + path: optional["Path"] | child + +class WhereClause(AstNode, ): + predicates: list["WherePred"] | child + +class WherePred(AstNode, ): + generic_param_list: optional["GenericParamList"] | child + lifetime: optional["Lifetime"] | child + type_repr: optional["TypeRepr"] | child + type_bound_list: optional["TypeBoundList"] | child + +class WhileExpr(Expr, ): + attrs: list["Attr"] | child + condition: optional["Expr"] | child + label: optional["Label"] | child + loop_body: optional["BlockExpr"] | child + +class WildcardPat(Pat, ): + pass + +class YeetExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child + +class YieldExpr(Expr, ): + attrs: list["Attr"] | child + expr: optional["Expr"] | child From 22e030584c56dd9a7ad6e42f518463cb20d903cd Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 12:14:27 -0500 Subject: [PATCH 20/71] Revert "Release preparation for version 2.20.1" --- actions/ql/lib/CHANGELOG.md | 5 ----- .../2024-12-19-initial-release.md} | 7 +++---- actions/ql/lib/change-notes/released/0.4.0.md | 5 ----- actions/ql/lib/codeql-pack.release.yml | 2 -- actions/ql/lib/qlpack.yml | 2 +- .../2024-12-19-initial-release.md} | 7 +++---- actions/ql/src/codeql-pack.release.yml | 2 -- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 19 ----------------- .../2024-12-04-guard-conditions.md | 4 ++++ .../2024-12-17-template-parameter-base.md | 4 ++++ .../2024-12-17-template-parameter.md | 4 ++++ .../2024-12-18-non-type-template-parameter.md | 4 ++++ .../change-notes/2024-12-20-sizeof-pack.md | 4 ++++ ...4-12-20-template-template-instantiation.md | 6 ++++++ cpp/ql/lib/change-notes/released/3.1.0.md | 18 ---------------- cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 10 --------- .../2024-11-27-active-template-library.md | 4 ++++ .../2024-12-05-badly-bounded-write.md | 4 ++++ ...024-12-05-wrong-number-format-arguments.md | 4 ++++ .../2024-12-05-wrong-type-format-args.md | 4 ++++ ...024-12-18-return-stack-allocated-memory.md | 4 ++++ cpp/ql/src/change-notes/released/1.3.1.md | 9 -------- cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ---- .../lib/change-notes/released/1.7.31.md | 3 --- .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ---- .../src/change-notes/released/1.7.31.md | 3 --- .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 13 ------------ .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ++++ .../ql/lib/change-notes/2024-12-04-dotnet9.md | 4 ++++ .../2024-12-05-aspnetcore-mvc-model.md | 4 ++++ ...add-markupstring-as-html-injection-sink.md | 4 ++++ .../2024-12-18-blazor-attribute-sources.md | 6 ++++++ .../2024-12-20-collection-params.md | 4 ++++ csharp/ql/lib/change-notes/released/4.0.1.md | 12 ----------- csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 6 ------ ...1.0.14.md => 2024-12-17-move-libraries.md} | 7 +++---- csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 8 ------- ...-improve-flow-out-of-variadic-parameter.md | 4 ++++ .../2024-12-12-variadic-parameter-sources.md | 4 ++++ .../change-notes/2024-12-13-os-args-model.md | 5 +++++ go/ql/lib/change-notes/released/3.0.1.md | 7 ------- go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ---- go/ql/src/change-notes/released/1.1.5.md | 3 --- go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 21 ------------------- ...ontrol-flow-graph-lightweight-IR-layer.md} | 13 +++--------- ...sttemplate-getforobject-third-parameter.md | 4 ++++ .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ++++ .../change-notes/2024-12-06-file-getname.md | 4 ++++ java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ---- java/ql/src/change-notes/released/1.1.11.md | 3 --- java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ---- .../ql/lib/change-notes/released/2.2.1.md | 3 --- javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 4 ---- .../ql/src/change-notes/released/1.2.6.md | 3 --- javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 11 ---------- ...parameter-annotation-api-graph-support.md} | 11 +++------- .../2024-12-18-fastapi-request-modeling.md | 5 +++++ python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 6 ------ ....0.md => 2024-11-21-template-injection.md} | 9 ++++---- python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ---- ruby/ql/lib/change-notes/released/3.0.1.md | 3 --- ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ---- ruby/ql/src/change-notes/released/1.1.9.md | 3 --- ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 6 ------ ...d => 2023-10-02-deduplicate-path-graph.md} | 7 +++---- shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ---- shared/mad/change-notes/released/1.0.14.md | 3 --- shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ---- shared/regex/change-notes/released/1.0.14.md | 3 --- shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ---- shared/ssa/change-notes/released/1.0.14.md | 3 --- shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ---- .../tutorial/change-notes/released/1.0.14.md | 3 --- shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ---- .../typeflow/change-notes/released/1.0.14.md | 3 --- shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ---- shared/typos/change-notes/released/1.0.14.md | 3 --- shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ---- shared/util/change-notes/released/2.0.1.md | 3 --- shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ---- shared/xml/change-notes/released/1.0.14.md | 3 --- shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ---- shared/yaml/change-notes/released/1.0.14.md | 3 --- shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 6 ------ .../3.1.0.md => 2024-12-09-swift-6.md} | 7 +++---- swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ---- swift/ql/src/change-notes/released/1.0.14.md | 3 --- swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 168 files changed, 197 insertions(+), 447 deletions(-) delete mode 100644 actions/ql/lib/CHANGELOG.md rename actions/ql/{src/change-notes/released/0.4.0.md => lib/change-notes/2024-12-19-initial-release.md} (55%) delete mode 100644 actions/ql/lib/change-notes/released/0.4.0.md delete mode 100644 actions/ql/lib/codeql-pack.release.yml rename actions/ql/src/{CHANGELOG.md => change-notes/2024-12-19-initial-release.md} (55%) delete mode 100644 actions/ql/src/codeql-pack.release.yml create mode 100644 cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md create mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md create mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter.md create mode 100644 cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md create mode 100644 cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md create mode 100644 cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md delete mode 100644 cpp/ql/lib/change-notes/released/3.1.0.md create mode 100644 cpp/ql/src/change-notes/2024-11-27-active-template-library.md create mode 100644 cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md create mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md create mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md create mode 100644 cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md delete mode 100644 cpp/ql/src/change-notes/released/1.3.1.md delete mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md delete mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md create mode 100644 csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md create mode 100644 csharp/ql/lib/change-notes/2024-12-04-dotnet9.md create mode 100644 csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md create mode 100644 csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md create mode 100644 csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md create mode 100644 csharp/ql/lib/change-notes/2024-12-20-collection-params.md delete mode 100644 csharp/ql/lib/change-notes/released/4.0.1.md rename csharp/ql/src/change-notes/{released/1.0.14.md => 2024-12-17-move-libraries.md} (65%) delete mode 100644 go/ql/consistency-queries/change-notes/released/1.0.14.md create mode 100644 go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md create mode 100644 go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md create mode 100644 go/ql/lib/change-notes/2024-12-13-os-args-model.md delete mode 100644 go/ql/lib/change-notes/released/3.0.1.md delete mode 100644 go/ql/src/change-notes/released/1.1.5.md rename java/ql/lib/change-notes/{released/6.0.0.md => 2024-11-14-control-flow-graph-lightweight-IR-layer.md} (50%) create mode 100644 java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md create mode 100644 java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md create mode 100644 java/ql/lib/change-notes/2024-12-06-file-getname.md delete mode 100644 java/ql/src/change-notes/released/1.1.11.md delete mode 100644 javascript/ql/lib/change-notes/released/2.2.1.md delete mode 100644 javascript/ql/src/change-notes/released/1.2.6.md delete mode 100644 misc/suite-helpers/change-notes/released/1.0.14.md rename python/ql/lib/change-notes/{released/3.1.0.md => 2024-11-26-parameter-annotation-api-graph-support.md} (58%) create mode 100644 python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md rename python/ql/src/change-notes/{released/1.4.0.md => 2024-11-21-template-injection.md} (78%) delete mode 100644 ruby/ql/lib/change-notes/released/3.0.1.md delete mode 100644 ruby/ql/src/change-notes/released/1.1.9.md delete mode 100644 shared/controlflow/change-notes/released/1.0.14.md rename shared/dataflow/change-notes/{released/1.1.8.md => 2023-10-02-deduplicate-path-graph.md} (77%) delete mode 100644 shared/mad/change-notes/released/1.0.14.md delete mode 100644 shared/rangeanalysis/change-notes/released/1.0.14.md delete mode 100644 shared/regex/change-notes/released/1.0.14.md delete mode 100644 shared/ssa/change-notes/released/1.0.14.md delete mode 100644 shared/threat-models/change-notes/released/1.0.14.md delete mode 100644 shared/tutorial/change-notes/released/1.0.14.md delete mode 100644 shared/typeflow/change-notes/released/1.0.14.md delete mode 100644 shared/typetracking/change-notes/released/1.0.14.md delete mode 100644 shared/typos/change-notes/released/1.0.14.md delete mode 100644 shared/util/change-notes/released/2.0.1.md delete mode 100644 shared/xml/change-notes/released/1.0.14.md delete mode 100644 shared/yaml/change-notes/released/1.0.14.md rename swift/ql/lib/change-notes/{released/3.1.0.md => 2024-12-09-swift-6.md} (51%) delete mode 100644 swift/ql/src/change-notes/released/1.0.14.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md deleted file mode 100644 index 7ad10899ce1..00000000000 --- a/actions/ql/lib/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -## 0.4.0 - -### New Features - -* Initial public preview release diff --git a/actions/ql/src/change-notes/released/0.4.0.md b/actions/ql/lib/change-notes/2024-12-19-initial-release.md similarity index 55% rename from actions/ql/src/change-notes/released/0.4.0.md rename to actions/ql/lib/change-notes/2024-12-19-initial-release.md index caa8feca558..09263f5089d 100644 --- a/actions/ql/src/change-notes/released/0.4.0.md +++ b/actions/ql/lib/change-notes/2024-12-19-initial-release.md @@ -1,5 +1,4 @@ -## 0.4.0 - -### New Queries - +--- +category: feature +--- * Initial public preview release diff --git a/actions/ql/lib/change-notes/released/0.4.0.md b/actions/ql/lib/change-notes/released/0.4.0.md deleted file mode 100644 index 7ad10899ce1..00000000000 --- a/actions/ql/lib/change-notes/released/0.4.0.md +++ /dev/null @@ -1,5 +0,0 @@ -## 0.4.0 - -### New Features - -* Initial public preview release diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml deleted file mode 100644 index 458bfbeccff..00000000000 --- a/actions/ql/lib/codeql-pack.release.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -lastReleaseVersion: 0.4.0 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 2f6aa980728..83cdaabc80d 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.0 +version: 0.4.0-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/change-notes/2024-12-19-initial-release.md similarity index 55% rename from actions/ql/src/CHANGELOG.md rename to actions/ql/src/change-notes/2024-12-19-initial-release.md index caa8feca558..e02078ea273 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/change-notes/2024-12-19-initial-release.md @@ -1,5 +1,4 @@ -## 0.4.0 - -### New Queries - +--- +category: newQuery +--- * Initial public preview release diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml deleted file mode 100644 index 458bfbeccff..00000000000 --- a/actions/ql/src/codeql-pack.release.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -lastReleaseVersion: 0.4.0 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 7ea8f9d77dd..f822a516e56 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.4.0 +version: 0.4.0-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 919bd905e73..19784b530e7 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,22 +1,3 @@ -## 3.1.0 - -### Deprecated APIs - -* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. - -### New Features - -* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. -* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. -* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. -* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. -* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. -* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. - -### Minor Analysis Improvements - -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. - ## 3.0.0 ### Breaking Changes diff --git a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md b/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md new file mode 100644 index 00000000000..f60a6a2970a --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md new file mode 100644 index 00000000000..6fec6d5f4f5 --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md new file mode 100644 index 00000000000..0ac7085b371 --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md @@ -0,0 +1,4 @@ +--- +category: deprecated +--- +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. diff --git a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md new file mode 100644 index 00000000000..41fe400ed66 --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. diff --git a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md b/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md new file mode 100644 index 00000000000..bd912e4fb2e --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. diff --git a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md b/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md new file mode 100644 index 00000000000..6e3ecd3468c --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md @@ -0,0 +1,6 @@ +--- +category: feature +--- +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. diff --git a/cpp/ql/lib/change-notes/released/3.1.0.md b/cpp/ql/lib/change-notes/released/3.1.0.md deleted file mode 100644 index 3c7f181f60a..00000000000 --- a/cpp/ql/lib/change-notes/released/3.1.0.md +++ /dev/null @@ -1,18 +0,0 @@ -## 3.1.0 - -### Deprecated APIs - -* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. - -### New Features - -* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. -* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. -* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. -* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. -* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. -* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. - -### Minor Analysis Improvements - -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 82f62960aa3..33d3a2cd113 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.1.0 +lastReleaseVersion: 3.0.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 2d83b8d4840..4bb4b04e02f 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 3.1.0 +version: 3.0.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 7d957e42696..db16fe6f8b3 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,13 +1,3 @@ -## 1.3.1 - -### Minor Analysis Improvements - -* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. -* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. -* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. -* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. -* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). - ## 1.3.0 ### New Queries diff --git a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md b/cpp/ql/src/change-notes/2024-11-27-active-template-library.md new file mode 100644 index 00000000000..a677ac66107 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-11-27-active-template-library.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md b/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md new file mode 100644 index 00000000000..c7ddd104ad0 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md b/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md new file mode 100644 index 00000000000..6b41378f556 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md b/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md new file mode 100644 index 00000000000..1bf77d55a61 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md b/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md new file mode 100644 index 00000000000..76f5b9d7eae --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. diff --git a/cpp/ql/src/change-notes/released/1.3.1.md b/cpp/ql/src/change-notes/released/1.3.1.md deleted file mode 100644 index bb3b2bf16c7..00000000000 --- a/cpp/ql/src/change-notes/released/1.3.1.md +++ /dev/null @@ -1,9 +0,0 @@ -## 1.3.1 - -### Minor Analysis Improvements - -* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. -* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. -* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. -* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. -* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index e71b6d081f1..ec16350ed6f 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.1 +lastReleaseVersion: 1.3.0 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index b37fc604fc6..940c3e2a4cb 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.3.1 +version: 1.3.1-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 0a74ff6d7d0..a71f93aacd4 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.7.31 - -No user-facing changes. - ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md deleted file mode 100644 index 17df0436207..00000000000 --- a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.7.31 - -No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 908f8a00a39..c0346e526b9 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.31 +lastReleaseVersion: 1.7.30 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index d5274444753..781915bf1a1 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.31 +version: 1.7.31-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 0a74ff6d7d0..a71f93aacd4 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.7.31 - -No user-facing changes. - ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md deleted file mode 100644 index 17df0436207..00000000000 --- a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.7.31 - -No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 908f8a00a39..c0346e526b9 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.31 +lastReleaseVersion: 1.7.30 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 41d5662ed57..979d8e6c661 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.31 +version: 1.7.31-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 857acdec93a..86f279365f0 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,16 +1,3 @@ -## 4.0.1 - -### Minor Analysis Improvements - -* C# 13: Added QL library support for *collection* like type `params` parameters. -* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - - `[SupplyParameterFromForm]` - - `[SupplyParameterFromQuery]` -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. -* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. - ## 4.0.0 ### Breaking Changes diff --git a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md new file mode 100644 index 00000000000..258c0e5326b --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md b/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md new file mode 100644 index 00000000000..e166040e155 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md b/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md new file mode 100644 index 00000000000..04afe96522b --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md b/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md new file mode 100644 index 00000000000..032edbb1f10 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. diff --git a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md b/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md new file mode 100644 index 00000000000..5a48753b259 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md @@ -0,0 +1,6 @@ +--- +category: minorAnalysis +--- +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` diff --git a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md b/csharp/ql/lib/change-notes/2024-12-20-collection-params.md new file mode 100644 index 00000000000..bb5ea26c6d4 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-20-collection-params.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# 13: Added QL library support for *collection* like type `params` parameters. diff --git a/csharp/ql/lib/change-notes/released/4.0.1.md b/csharp/ql/lib/change-notes/released/4.0.1.md deleted file mode 100644 index 703439b4cfe..00000000000 --- a/csharp/ql/lib/change-notes/released/4.0.1.md +++ /dev/null @@ -1,12 +0,0 @@ -## 4.0.1 - -### Minor Analysis Improvements - -* C# 13: Added QL library support for *collection* like type `params` parameters. -* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - - `[SupplyParameterFromForm]` - - `[SupplyParameterFromQuery]` -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. -* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index c0db4dcc0b3..49fe3eef697 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.0.1 +lastReleaseVersion: 4.0.0 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index bb79e33a528..81a55470a4d 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 4.0.1 +version: 4.0.1-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 1adfe6e1822..370a9cf4a6a 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,9 +1,3 @@ -## 1.0.14 - -### Minor Analysis Improvements - -* The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. - ## 1.0.13 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/released/1.0.14.md b/csharp/ql/src/change-notes/2024-12-17-move-libraries.md similarity index 65% rename from csharp/ql/src/change-notes/released/1.0.14.md rename to csharp/ql/src/change-notes/2024-12-17-move-libraries.md index d49594169df..07bf61b7e35 100644 --- a/csharp/ql/src/change-notes/released/1.0.14.md +++ b/csharp/ql/src/change-notes/2024-12-17-move-libraries.md @@ -1,5 +1,4 @@ -## 1.0.14 - -### Minor Analysis Improvements - +--- +category: minorAnalysis +--- * The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 5334c690270..e4d9400d96d 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.0.14 +version: 1.0.14-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 2d5ba191d2e..3c6fa155a32 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.14.md b/go/ql/consistency-queries/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/go/ql/consistency-queries/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 5e500c12eb7..1812705438c 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.14 +version: 1.0.14-dev groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 9c0c41ec4cb..83052b3a1d9 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,11 +1,3 @@ -## 3.0.1 - -### Minor Analysis Improvements - -* Added a `commandargs` local source model for the `os.Args` variable. -* Source models defined using models-as-data now work for variadic parameters. -* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. - ## 3.0.0 ### Breaking Changes diff --git a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md b/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md new file mode 100644 index 00000000000..8244ba06994 --- /dev/null +++ b/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md b/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md new file mode 100644 index 00000000000..38d5ad2783f --- /dev/null +++ b/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Source models defined using models-as-data now work for variadic parameters. diff --git a/go/ql/lib/change-notes/2024-12-13-os-args-model.md b/go/ql/lib/change-notes/2024-12-13-os-args-model.md new file mode 100644 index 00000000000..20a16d222e4 --- /dev/null +++ b/go/ql/lib/change-notes/2024-12-13-os-args-model.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Added a `commandargs` local source model for the `os.Args` variable. + diff --git a/go/ql/lib/change-notes/released/3.0.1.md b/go/ql/lib/change-notes/released/3.0.1.md deleted file mode 100644 index a8faff41943..00000000000 --- a/go/ql/lib/change-notes/released/3.0.1.md +++ /dev/null @@ -1,7 +0,0 @@ -## 3.0.1 - -### Minor Analysis Improvements - -* Added a `commandargs` local source model for the `os.Args` variable. -* Source models defined using models-as-data now work for variadic parameters. -* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index e3b15d965db..33d3a2cd113 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.1 +lastReleaseVersion: 3.0.0 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index a540b7905c3..4e72aa3857b 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 3.0.1 +version: 3.0.1-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 838a8bce5ea..c9044e55cdc 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.5 - -No user-facing changes. - ## 1.1.4 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/1.1.5.md b/go/ql/src/change-notes/released/1.1.5.md deleted file mode 100644 index 11a52a121d1..00000000000 --- a/go/ql/src/change-notes/released/1.1.5.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.1.5 - -No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index df39a9de059..26cbcd3f123 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.5 +lastReleaseVersion: 1.1.4 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 52d3c0012ba..36775d0d862 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.1.5 +version: 1.1.5-dev groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index e7aa3c152de..09ee80087e8 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,24 +1,3 @@ -## 6.0.0 - -### Breaking Changes - -* The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer - directly equatable to `Expr` and `Stmt`. Any queries that have been - exploiting these equalities, for example by using casts, will need minor - updates in order to fix any compilation errors. Conversions can be inserted - in either direction depending on what is most convenient. Available - conversions include `Expr.getControlFlowNode()`, `Stmt.getControlFlowNode()`, - `ControlFlowNode.asExpr()`, `ControlFlowNode.asStmt()`, and - `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a - `ControlFlowNode` equal to its enclosing `Callable`; these are now instead - modelled by the class `ControlFlow::ExitNode`. - -### Minor Analysis Improvements - -* Added `java.io.File.getName()` as a path injection sanitizer. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. - ## 5.0.0 ### Breaking Changes diff --git a/java/ql/lib/change-notes/released/6.0.0.md b/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md similarity index 50% rename from java/ql/lib/change-notes/released/6.0.0.md rename to java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md index f66dd1b2bbf..2fbb6a537c7 100644 --- a/java/ql/lib/change-notes/released/6.0.0.md +++ b/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md @@ -1,7 +1,6 @@ -## 6.0.0 - -### Breaking Changes - +--- +category: breaking +--- * The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer directly equatable to `Expr` and `Stmt`. Any queries that have been exploiting these equalities, for example by using casts, will need minor @@ -12,9 +11,3 @@ `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a `ControlFlowNode` equal to its enclosing `Callable`; these are now instead modelled by the class `ControlFlow::ExitNode`. - -### Minor Analysis Improvements - -* Added `java.io.File.getName()` as a path injection sanitizer. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md b/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md new file mode 100644 index 00000000000..4f45d19e5e8 --- /dev/null +++ b/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md new file mode 100644 index 00000000000..258c0e5326b --- /dev/null +++ b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/java/ql/lib/change-notes/2024-12-06-file-getname.md b/java/ql/lib/change-notes/2024-12-06-file-getname.md new file mode 100644 index 00000000000..b2d1d271ab5 --- /dev/null +++ b/java/ql/lib/change-notes/2024-12-06-file-getname.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added `java.io.File.getName()` as a path injection sanitizer. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index f8c4fa43ccb..c9e54136ca5 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.0 +lastReleaseVersion: 5.0.0 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index d0490615f69..f892ca1c450 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 6.0.0 +version: 5.0.1-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index c7148cba8d8..0bb38874b82 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.11 - -No user-facing changes. - ## 1.1.10 ### Minor Analysis Improvements diff --git a/java/ql/src/change-notes/released/1.1.11.md b/java/ql/src/change-notes/released/1.1.11.md deleted file mode 100644 index c94f527264e..00000000000 --- a/java/ql/src/change-notes/released/1.1.11.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.1.11 - -No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 121f8cf035d..4c01918d414 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.11 +lastReleaseVersion: 1.1.10 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index dd530febd2e..8ee211fb536 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.1.11 +version: 1.1.11-dev groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 7aa60446f0e..ebe424935eb 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.2.1 - -No user-facing changes. - ## 2.2.0 ### Major Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/2.2.1.md b/javascript/ql/lib/change-notes/released/2.2.1.md deleted file mode 100644 index 62b48f9d2e8..00000000000 --- a/javascript/ql/lib/change-notes/released/2.2.1.md +++ /dev/null @@ -1,3 +0,0 @@ -## 2.2.1 - -No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 863e3cd380d..2f308354195 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.2.1 +lastReleaseVersion: 2.2.0 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index d78821f0892..4d568ff4813 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.2.1 +version: 2.2.1-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 5bf4466796e..195298ec89f 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.2.6 - -No user-facing changes. - ## 1.2.5 No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/1.2.6.md b/javascript/ql/src/change-notes/released/1.2.6.md deleted file mode 100644 index 0832850ff8c..00000000000 --- a/javascript/ql/src/change-notes/released/1.2.6.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.2.6 - -No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 24962f7ba24..40355f0807f 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.6 +lastReleaseVersion: 1.2.5 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 04e84d1ac74..78f0585027b 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 1.2.6 +version: 1.2.6-dev groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 490b5dc360a..5d46c57bf4e 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.14.md b/misc/suite-helpers/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/misc/suite-helpers/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index f14cabfe129..eeb8f762b13 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.14 +version: 1.0.14-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index aabefe63a42..81c7659c4ed 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,14 +1,3 @@ -## 3.1.0 - -### New Features - -* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. - -### Minor Analysis Improvements - -* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, - and modeling of tainted data flow out of these request objects. - ## 3.0.0 ### Breaking Changes diff --git a/python/ql/lib/change-notes/released/3.1.0.md b/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md similarity index 58% rename from python/ql/lib/change-notes/released/3.1.0.md rename to python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md index 50b4b8184b7..57bb1b4a078 100644 --- a/python/ql/lib/change-notes/released/3.1.0.md +++ b/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md @@ -1,10 +1,5 @@ -## 3.1.0 - -### New Features +--- +category: feature +--- - Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. - -### Minor Analysis Improvements - -* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, - and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md b/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md new file mode 100644 index 00000000000..adc7d39653f --- /dev/null +++ b/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 82f62960aa3..33d3a2cd113 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.1.0 +lastReleaseVersion: 3.0.0 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 8e015428c49..147933b96fe 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 3.1.0 +version: 3.0.1-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index d5cacfc8401..c247e217acf 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,9 +1,3 @@ -## 1.4.0 - -### New Queries - -* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. - ## 1.3.4 No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.4.0.md b/python/ql/src/change-notes/2024-11-21-template-injection.md similarity index 78% rename from python/ql/src/change-notes/released/1.4.0.md rename to python/ql/src/change-notes/2024-11-21-template-injection.md index 02acaabcb98..7c604e9c993 100644 --- a/python/ql/src/change-notes/released/1.4.0.md +++ b/python/ql/src/change-notes/2024-11-21-template-injection.md @@ -1,5 +1,4 @@ -## 1.4.0 - -### New Queries - -* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. +--- +category: newQuery +--- +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. \ No newline at end of file diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index b8b2e97d508..8263ddf2c8b 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.0 +lastReleaseVersion: 1.3.4 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 9d330fc3526..d83b6433ac6 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.4.0 +version: 1.3.5-dev groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 9179de3b7d5..737903a3232 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,7 +1,3 @@ -## 3.0.1 - -No user-facing changes. - ## 3.0.0 ### Breaking Changes diff --git a/ruby/ql/lib/change-notes/released/3.0.1.md b/ruby/ql/lib/change-notes/released/3.0.1.md deleted file mode 100644 index ac5998ace61..00000000000 --- a/ruby/ql/lib/change-notes/released/3.0.1.md +++ /dev/null @@ -1,3 +0,0 @@ -## 3.0.1 - -No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index e3b15d965db..33d3a2cd113 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.1 +lastReleaseVersion: 3.0.0 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index a169addf8e7..ddf106c95bf 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 3.0.1 +version: 3.0.1-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 7d341c3f808..5fe04780136 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.9 - -No user-facing changes. - ## 1.1.8 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.1.9.md b/ruby/ql/src/change-notes/released/1.1.9.md deleted file mode 100644 index f9d367d4248..00000000000 --- a/ruby/ql/src/change-notes/released/1.1.9.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.1.9 - -No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 6f4795f3ea0..64972659c42 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.9 +lastReleaseVersion: 1.1.8 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 72ff669503a..43bfe75f566 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.1.9 +version: 1.1.9-dev groups: - ruby - queries diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 5f4501ed1e3..285b39a4359 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/1.0.14.md b/shared/controlflow/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/controlflow/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 590d3e1666d..268f142bd1b 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 949660e3381..df038524d2d 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,9 +1,3 @@ -## 1.1.8 - -### Minor Analysis Improvements - -* Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. - ## 1.1.7 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/1.1.8.md b/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md similarity index 77% rename from shared/dataflow/change-notes/released/1.1.8.md rename to shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md index d951e6bf0c7..30e71ade6af 100644 --- a/shared/dataflow/change-notes/released/1.1.8.md +++ b/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md @@ -1,5 +1,4 @@ -## 1.1.8 - -### Minor Analysis Improvements - +--- +category: minorAnalysis +--- * Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 64972659c42..75910556516 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.8 +lastReleaseVersion: 1.1.7 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index fe44120b3c1..6a8e8c3a4ae 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 1.1.8 +version: 1.1.8-dev groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 1b2146927e5..93a528a4f3c 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.14.md b/shared/mad/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/mad/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 341373b22f5..125bcad622d 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 993922ecc49..6b25d16e0f7 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.14.md b/shared/rangeanalysis/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/rangeanalysis/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index efb29bbc02c..62c8c1e46b6 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 45bb8da81db..54c3ed2b307 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.14.md b/shared/regex/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/regex/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 8db7e73e336..e2cda264dc8 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index d31fb6c6120..01c19388c92 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/ssa/change-notes/released/1.0.14.md b/shared/ssa/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/ssa/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 1276fd498f7..b146ce5bc91 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 2d5ba191d2e..3c6fa155a32 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.14.md b/shared/threat-models/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/threat-models/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index f337bfa721d..6ec41bbcc04 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.14 +version: 1.0.14-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index cc4652e04ff..1f4e7ad4ed3 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.14.md b/shared/tutorial/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/tutorial/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 4c55d52356c..6677c74eed4 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index ac6192fd7d8..dd8fb7a60b2 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.14.md b/shared/typeflow/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/typeflow/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 15761af538a..cd9e70bba8c 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index f651b953118..0ab05873af4 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/1.0.14.md b/shared/typetracking/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/typetracking/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 224b85826c4..fbe63f0da01 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 924a3fc0a7b..c0c3cea3948 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.14.md b/shared/typos/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/typos/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 31f04e60666..250f729ab5f 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 9dd6c05d40a..e03d990b747 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.0.1 - -No user-facing changes. - ## 2.0.0 ### Breaking Changes diff --git a/shared/util/change-notes/released/2.0.1.md b/shared/util/change-notes/released/2.0.1.md deleted file mode 100644 index b5b6d0dee91..00000000000 --- a/shared/util/change-notes/released/2.0.1.md +++ /dev/null @@ -1,3 +0,0 @@ -## 2.0.1 - -No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index fe974a4dbf3..0abe6ccede0 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.1 +lastReleaseVersion: 2.0.0 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index da932a6ed36..b327c25a3d9 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.1 +version: 2.0.1-dev groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 6837f7507d8..c3ebc31994b 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.14.md b/shared/xml/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/xml/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index a3ace631d1b..76c408c2920 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 6e940e8d264..28fcbceec8e 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.14.md b/shared/yaml/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/yaml/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 006f30012bb..0c756e1edbb 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index c976d0c8514..ba76b51c80e 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,9 +1,3 @@ -## 3.1.0 - -### Major Analysis Improvements - -* Upgraded to allow analysis of Swift 6.0.2. - ## 3.0.0 ### Breaking Changes diff --git a/swift/ql/lib/change-notes/released/3.1.0.md b/swift/ql/lib/change-notes/2024-12-09-swift-6.md similarity index 51% rename from swift/ql/lib/change-notes/released/3.1.0.md rename to swift/ql/lib/change-notes/2024-12-09-swift-6.md index 655a8ad323a..e32344b28d8 100644 --- a/swift/ql/lib/change-notes/released/3.1.0.md +++ b/swift/ql/lib/change-notes/2024-12-09-swift-6.md @@ -1,5 +1,4 @@ -## 3.1.0 - -### Major Analysis Improvements - +--- +category: majorAnalysis +--- * Upgraded to allow analysis of Swift 6.0.2. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 82f62960aa3..33d3a2cd113 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.1.0 +lastReleaseVersion: 3.0.0 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 91e4d06f537..7752975faea 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 3.1.0 +version: 3.0.1-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index a26a68434eb..73ac6bef86d 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.0.14.md b/swift/ql/src/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/swift/ql/src/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 1ce09dc0969..ec8e2cb9932 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.0.14 +version: 1.0.14-dev groups: - swift - queries From fbf9f2fff898ca2817b99f204f75ac0463044f01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Jan 2025 17:20:13 +0000 Subject: [PATCH 21/71] Release preparation for version 2.20.1 --- actions/ql/lib/CHANGELOG.md | 5 +++++ actions/ql/lib/change-notes/released/0.4.0.md | 5 +++++ actions/ql/lib/codeql-pack.release.yml | 2 ++ actions/ql/lib/qlpack.yml | 2 +- .../CHANGELOG.md} | 7 ++++--- .../0.4.0.md} | 7 ++++--- actions/ql/src/codeql-pack.release.yml | 2 ++ actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 19 +++++++++++++++++ .../2024-12-04-guard-conditions.md | 4 ---- .../2024-12-17-template-parameter-base.md | 4 ---- .../2024-12-17-template-parameter.md | 4 ---- .../2024-12-18-non-type-template-parameter.md | 4 ---- .../change-notes/2024-12-20-sizeof-pack.md | 4 ---- ...4-12-20-template-template-instantiation.md | 6 ------ cpp/ql/lib/change-notes/released/3.1.0.md | 18 ++++++++++++++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 10 +++++++++ .../2024-11-27-active-template-library.md | 4 ---- .../2024-12-05-badly-bounded-write.md | 4 ---- ...024-12-05-wrong-number-format-arguments.md | 4 ---- .../2024-12-05-wrong-type-format-args.md | 4 ---- ...024-12-18-return-stack-allocated-memory.md | 4 ---- cpp/ql/src/change-notes/released/1.3.1.md | 9 ++++++++ cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../lib/change-notes/released/1.7.31.md | 3 +++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../src/change-notes/released/1.7.31.md | 3 +++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 13 ++++++++++++ .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ---- .../ql/lib/change-notes/2024-12-04-dotnet9.md | 4 ---- .../2024-12-05-aspnetcore-mvc-model.md | 4 ---- ...add-markupstring-as-html-injection-sink.md | 4 ---- .../2024-12-18-blazor-attribute-sources.md | 6 ------ .../2024-12-20-collection-params.md | 4 ---- csharp/ql/lib/change-notes/released/4.0.1.md | 12 +++++++++++ csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 6 ++++++ .../1.0.14.md} | 7 ++++--- csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 8 +++++++ ...-improve-flow-out-of-variadic-parameter.md | 4 ---- .../2024-12-12-variadic-parameter-sources.md | 4 ---- .../change-notes/2024-12-13-os-args-model.md | 5 ----- go/ql/lib/change-notes/released/3.0.1.md | 7 +++++++ go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.1.5.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 21 +++++++++++++++++++ ...sttemplate-getforobject-third-parameter.md | 4 ---- .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ---- .../change-notes/2024-12-06-file-getname.md | 4 ---- .../6.0.0.md} | 13 +++++++++--- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.1.11.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ++++ .../ql/lib/change-notes/released/2.2.1.md | 3 +++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 4 ++++ .../ql/src/change-notes/released/1.2.6.md | 3 +++ javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 11 ++++++++++ .../2024-12-18-fastapi-request-modeling.md | 5 ----- .../3.1.0.md} | 11 +++++++--- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 6 ++++++ .../1.4.0.md} | 9 ++++---- python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ++++ ruby/ql/lib/change-notes/released/3.0.1.md | 3 +++ ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.1.9.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 6 ++++++ .../1.1.8.md} | 7 ++++--- shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.14.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.14.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/1.0.14.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ .../tutorial/change-notes/released/1.0.14.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ .../typeflow/change-notes/released/1.0.14.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.14.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.1.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.14.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.14.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 6 ++++++ .../3.1.0.md} | 7 ++++--- swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.0.14.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 168 files changed, 447 insertions(+), 197 deletions(-) create mode 100644 actions/ql/lib/CHANGELOG.md create mode 100644 actions/ql/lib/change-notes/released/0.4.0.md create mode 100644 actions/ql/lib/codeql-pack.release.yml rename actions/ql/{lib/change-notes/2024-12-19-initial-release.md => src/CHANGELOG.md} (55%) rename actions/ql/src/change-notes/{2024-12-19-initial-release.md => released/0.4.0.md} (55%) create mode 100644 actions/ql/src/codeql-pack.release.yml delete mode 100644 cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md create mode 100644 cpp/ql/lib/change-notes/released/3.1.0.md delete mode 100644 cpp/ql/src/change-notes/2024-11-27-active-template-library.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md delete mode 100644 cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md create mode 100644 cpp/ql/src/change-notes/released/1.3.1.md create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-04-dotnet9.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-20-collection-params.md create mode 100644 csharp/ql/lib/change-notes/released/4.0.1.md rename csharp/ql/src/change-notes/{2024-12-17-move-libraries.md => released/1.0.14.md} (65%) create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.14.md delete mode 100644 go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md delete mode 100644 go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md delete mode 100644 go/ql/lib/change-notes/2024-12-13-os-args-model.md create mode 100644 go/ql/lib/change-notes/released/3.0.1.md create mode 100644 go/ql/src/change-notes/released/1.1.5.md delete mode 100644 java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md delete mode 100644 java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md delete mode 100644 java/ql/lib/change-notes/2024-12-06-file-getname.md rename java/ql/lib/change-notes/{2024-11-14-control-flow-graph-lightweight-IR-layer.md => released/6.0.0.md} (50%) create mode 100644 java/ql/src/change-notes/released/1.1.11.md create mode 100644 javascript/ql/lib/change-notes/released/2.2.1.md create mode 100644 javascript/ql/src/change-notes/released/1.2.6.md create mode 100644 misc/suite-helpers/change-notes/released/1.0.14.md delete mode 100644 python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md rename python/ql/lib/change-notes/{2024-11-26-parameter-annotation-api-graph-support.md => released/3.1.0.md} (58%) rename python/ql/src/change-notes/{2024-11-21-template-injection.md => released/1.4.0.md} (78%) create mode 100644 ruby/ql/lib/change-notes/released/3.0.1.md create mode 100644 ruby/ql/src/change-notes/released/1.1.9.md create mode 100644 shared/controlflow/change-notes/released/1.0.14.md rename shared/dataflow/change-notes/{2023-10-02-deduplicate-path-graph.md => released/1.1.8.md} (77%) create mode 100644 shared/mad/change-notes/released/1.0.14.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.14.md create mode 100644 shared/regex/change-notes/released/1.0.14.md create mode 100644 shared/ssa/change-notes/released/1.0.14.md create mode 100644 shared/threat-models/change-notes/released/1.0.14.md create mode 100644 shared/tutorial/change-notes/released/1.0.14.md create mode 100644 shared/typeflow/change-notes/released/1.0.14.md create mode 100644 shared/typetracking/change-notes/released/1.0.14.md create mode 100644 shared/typos/change-notes/released/1.0.14.md create mode 100644 shared/util/change-notes/released/2.0.1.md create mode 100644 shared/xml/change-notes/released/1.0.14.md create mode 100644 shared/yaml/change-notes/released/1.0.14.md rename swift/ql/lib/change-notes/{2024-12-09-swift-6.md => released/3.1.0.md} (51%) create mode 100644 swift/ql/src/change-notes/released/1.0.14.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md new file mode 100644 index 00000000000..7ad10899ce1 --- /dev/null +++ b/actions/ql/lib/CHANGELOG.md @@ -0,0 +1,5 @@ +## 0.4.0 + +### New Features + +* Initial public preview release diff --git a/actions/ql/lib/change-notes/released/0.4.0.md b/actions/ql/lib/change-notes/released/0.4.0.md new file mode 100644 index 00000000000..7ad10899ce1 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.0.md @@ -0,0 +1,5 @@ +## 0.4.0 + +### New Features + +* Initial public preview release diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml new file mode 100644 index 00000000000..458bfbeccff --- /dev/null +++ b/actions/ql/lib/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.4.0 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 83cdaabc80d..2f6aa980728 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.0-dev +version: 0.4.0 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/lib/change-notes/2024-12-19-initial-release.md b/actions/ql/src/CHANGELOG.md similarity index 55% rename from actions/ql/lib/change-notes/2024-12-19-initial-release.md rename to actions/ql/src/CHANGELOG.md index 09263f5089d..caa8feca558 100644 --- a/actions/ql/lib/change-notes/2024-12-19-initial-release.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,4 +1,5 @@ ---- -category: feature ---- +## 0.4.0 + +### New Queries + * Initial public preview release diff --git a/actions/ql/src/change-notes/2024-12-19-initial-release.md b/actions/ql/src/change-notes/released/0.4.0.md similarity index 55% rename from actions/ql/src/change-notes/2024-12-19-initial-release.md rename to actions/ql/src/change-notes/released/0.4.0.md index e02078ea273..caa8feca558 100644 --- a/actions/ql/src/change-notes/2024-12-19-initial-release.md +++ b/actions/ql/src/change-notes/released/0.4.0.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- +## 0.4.0 + +### New Queries + * Initial public preview release diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml new file mode 100644 index 00000000000..458bfbeccff --- /dev/null +++ b/actions/ql/src/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.4.0 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index f822a516e56..7ea8f9d77dd 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.4.0-dev +version: 0.4.0 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 19784b530e7..919bd905e73 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,22 @@ +## 3.1.0 + +### Deprecated APIs + +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. + +### New Features + +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. + +### Minor Analysis Improvements + +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. + ## 3.0.0 ### Breaking Changes diff --git a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md b/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md deleted file mode 100644 index f60a6a2970a..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md deleted file mode 100644 index 6fec6d5f4f5..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md deleted file mode 100644 index 0ac7085b371..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. diff --git a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md deleted file mode 100644 index 41fe400ed66..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. diff --git a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md b/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md deleted file mode 100644 index bd912e4fb2e..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. diff --git a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md b/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md deleted file mode 100644 index 6e3ecd3468c..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: feature ---- -* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. -* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. -* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. diff --git a/cpp/ql/lib/change-notes/released/3.1.0.md b/cpp/ql/lib/change-notes/released/3.1.0.md new file mode 100644 index 00000000000..3c7f181f60a --- /dev/null +++ b/cpp/ql/lib/change-notes/released/3.1.0.md @@ -0,0 +1,18 @@ +## 3.1.0 + +### Deprecated APIs + +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. + +### New Features + +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. + +### Minor Analysis Improvements + +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 4bb4b04e02f..2d83b8d4840 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 3.0.1-dev +version: 3.1.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index db16fe6f8b3..7d957e42696 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 1.3.1 + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). + ## 1.3.0 ### New Queries diff --git a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md b/cpp/ql/src/change-notes/2024-11-27-active-template-library.md deleted file mode 100644 index a677ac66107..00000000000 --- a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md b/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md deleted file mode 100644 index c7ddd104ad0..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md b/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md deleted file mode 100644 index 6b41378f556..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md b/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md deleted file mode 100644 index 1bf77d55a61..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md b/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md deleted file mode 100644 index 76f5b9d7eae..00000000000 --- a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. diff --git a/cpp/ql/src/change-notes/released/1.3.1.md b/cpp/ql/src/change-notes/released/1.3.1.md new file mode 100644 index 00000000000..bb3b2bf16c7 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.3.1.md @@ -0,0 +1,9 @@ +## 1.3.1 + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index ec16350ed6f..e71b6d081f1 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.0 +lastReleaseVersion: 1.3.1 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 940c3e2a4cb..b37fc604fc6 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.3.1-dev +version: 1.3.1 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index a71f93aacd4..0a74ff6d7d0 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.31 + +No user-facing changes. + ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md new file mode 100644 index 00000000000..17df0436207 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md @@ -0,0 +1,3 @@ +## 1.7.31 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index c0346e526b9..908f8a00a39 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.30 +lastReleaseVersion: 1.7.31 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 781915bf1a1..d5274444753 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.31-dev +version: 1.7.31 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index a71f93aacd4..0a74ff6d7d0 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.31 + +No user-facing changes. + ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md new file mode 100644 index 00000000000..17df0436207 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md @@ -0,0 +1,3 @@ +## 1.7.31 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index c0346e526b9..908f8a00a39 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.30 +lastReleaseVersion: 1.7.31 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 979d8e6c661..41d5662ed57 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.31-dev +version: 1.7.31 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 86f279365f0..857acdec93a 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,16 @@ +## 4.0.1 + +### Minor Analysis Improvements + +* C# 13: Added QL library support for *collection* like type `params` parameters. +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. + ## 4.0.0 ### Breaking Changes diff --git a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md deleted file mode 100644 index 258c0e5326b..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md b/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md deleted file mode 100644 index e166040e155..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md b/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md deleted file mode 100644 index 04afe96522b..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md b/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md deleted file mode 100644 index 032edbb1f10..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. diff --git a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md b/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md deleted file mode 100644 index 5a48753b259..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - - `[SupplyParameterFromForm]` - - `[SupplyParameterFromQuery]` diff --git a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md b/csharp/ql/lib/change-notes/2024-12-20-collection-params.md deleted file mode 100644 index bb5ea26c6d4..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* C# 13: Added QL library support for *collection* like type `params` parameters. diff --git a/csharp/ql/lib/change-notes/released/4.0.1.md b/csharp/ql/lib/change-notes/released/4.0.1.md new file mode 100644 index 00000000000..703439b4cfe --- /dev/null +++ b/csharp/ql/lib/change-notes/released/4.0.1.md @@ -0,0 +1,12 @@ +## 4.0.1 + +### Minor Analysis Improvements + +* C# 13: Added QL library support for *collection* like type `params` parameters. +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 49fe3eef697..c0db4dcc0b3 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.0.0 +lastReleaseVersion: 4.0.1 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 81a55470a4d..bb79e33a528 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 4.0.1-dev +version: 4.0.1 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 370a9cf4a6a..1adfe6e1822 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.0.14 + +### Minor Analysis Improvements + +* The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. + ## 1.0.13 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/2024-12-17-move-libraries.md b/csharp/ql/src/change-notes/released/1.0.14.md similarity index 65% rename from csharp/ql/src/change-notes/2024-12-17-move-libraries.md rename to csharp/ql/src/change-notes/released/1.0.14.md index 07bf61b7e35..d49594169df 100644 --- a/csharp/ql/src/change-notes/2024-12-17-move-libraries.md +++ b/csharp/ql/src/change-notes/released/1.0.14.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.0.14 + +### Minor Analysis Improvements + * The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index e4d9400d96d..5334c690270 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.0.14-dev +version: 1.0.14 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 3c6fa155a32..2d5ba191d2e 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.14.md b/go/ql/consistency-queries/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 1812705438c..5e500c12eb7 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.14-dev +version: 1.0.14 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 83052b3a1d9..9c0c41ec4cb 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.0.1 + +### Minor Analysis Improvements + +* Added a `commandargs` local source model for the `os.Args` variable. +* Source models defined using models-as-data now work for variadic parameters. +* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. + ## 3.0.0 ### Breaking Changes diff --git a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md b/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md deleted file mode 100644 index 8244ba06994..00000000000 --- a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md b/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md deleted file mode 100644 index 38d5ad2783f..00000000000 --- a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Source models defined using models-as-data now work for variadic parameters. diff --git a/go/ql/lib/change-notes/2024-12-13-os-args-model.md b/go/ql/lib/change-notes/2024-12-13-os-args-model.md deleted file mode 100644 index 20a16d222e4..00000000000 --- a/go/ql/lib/change-notes/2024-12-13-os-args-model.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added a `commandargs` local source model for the `os.Args` variable. - diff --git a/go/ql/lib/change-notes/released/3.0.1.md b/go/ql/lib/change-notes/released/3.0.1.md new file mode 100644 index 00000000000..a8faff41943 --- /dev/null +++ b/go/ql/lib/change-notes/released/3.0.1.md @@ -0,0 +1,7 @@ +## 3.0.1 + +### Minor Analysis Improvements + +* Added a `commandargs` local source model for the `os.Args` variable. +* Source models defined using models-as-data now work for variadic parameters. +* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 33d3a2cd113..e3b15d965db 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.0.1 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 4e72aa3857b..a540b7905c3 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 3.0.1-dev +version: 3.0.1 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index c9044e55cdc..838a8bce5ea 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.5 + +No user-facing changes. + ## 1.1.4 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/1.1.5.md b/go/ql/src/change-notes/released/1.1.5.md new file mode 100644 index 00000000000..11a52a121d1 --- /dev/null +++ b/go/ql/src/change-notes/released/1.1.5.md @@ -0,0 +1,3 @@ +## 1.1.5 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 26cbcd3f123..df39a9de059 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.4 +lastReleaseVersion: 1.1.5 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 36775d0d862..52d3c0012ba 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.1.5-dev +version: 1.1.5 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 09ee80087e8..e7aa3c152de 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,24 @@ +## 6.0.0 + +### Breaking Changes + +* The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer + directly equatable to `Expr` and `Stmt`. Any queries that have been + exploiting these equalities, for example by using casts, will need minor + updates in order to fix any compilation errors. Conversions can be inserted + in either direction depending on what is most convenient. Available + conversions include `Expr.getControlFlowNode()`, `Stmt.getControlFlowNode()`, + `ControlFlowNode.asExpr()`, `ControlFlowNode.asStmt()`, and + `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a + `ControlFlowNode` equal to its enclosing `Callable`; these are now instead + modelled by the class `ControlFlow::ExitNode`. + +### Minor Analysis Improvements + +* Added `java.io.File.getName()` as a path injection sanitizer. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. + ## 5.0.0 ### Breaking Changes diff --git a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md b/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md deleted file mode 100644 index 4f45d19e5e8..00000000000 --- a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md deleted file mode 100644 index 258c0e5326b..00000000000 --- a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/java/ql/lib/change-notes/2024-12-06-file-getname.md b/java/ql/lib/change-notes/2024-12-06-file-getname.md deleted file mode 100644 index b2d1d271ab5..00000000000 --- a/java/ql/lib/change-notes/2024-12-06-file-getname.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `java.io.File.getName()` as a path injection sanitizer. diff --git a/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md b/java/ql/lib/change-notes/released/6.0.0.md similarity index 50% rename from java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md rename to java/ql/lib/change-notes/released/6.0.0.md index 2fbb6a537c7..f66dd1b2bbf 100644 --- a/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md +++ b/java/ql/lib/change-notes/released/6.0.0.md @@ -1,6 +1,7 @@ ---- -category: breaking ---- +## 6.0.0 + +### Breaking Changes + * The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer directly equatable to `Expr` and `Stmt`. Any queries that have been exploiting these equalities, for example by using casts, will need minor @@ -11,3 +12,9 @@ category: breaking `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a `ControlFlowNode` equal to its enclosing `Callable`; these are now instead modelled by the class `ControlFlow::ExitNode`. + +### Minor Analysis Improvements + +* Added `java.io.File.getName()` as a path injection sanitizer. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index c9e54136ca5..f8c4fa43ccb 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.0 +lastReleaseVersion: 6.0.0 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index f892ca1c450..d0490615f69 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 5.0.1-dev +version: 6.0.0 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 0bb38874b82..c7148cba8d8 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.11 + +No user-facing changes. + ## 1.1.10 ### Minor Analysis Improvements diff --git a/java/ql/src/change-notes/released/1.1.11.md b/java/ql/src/change-notes/released/1.1.11.md new file mode 100644 index 00000000000..c94f527264e --- /dev/null +++ b/java/ql/src/change-notes/released/1.1.11.md @@ -0,0 +1,3 @@ +## 1.1.11 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 4c01918d414..121f8cf035d 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.10 +lastReleaseVersion: 1.1.11 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 8ee211fb536..dd530febd2e 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.1.11-dev +version: 1.1.11 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index ebe424935eb..7aa60446f0e 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.1 + +No user-facing changes. + ## 2.2.0 ### Major Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/2.2.1.md b/javascript/ql/lib/change-notes/released/2.2.1.md new file mode 100644 index 00000000000..62b48f9d2e8 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.2.1.md @@ -0,0 +1,3 @@ +## 2.2.1 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 2f308354195..863e3cd380d 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.2.0 +lastReleaseVersion: 2.2.1 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 4d568ff4813..d78821f0892 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.2.1-dev +version: 2.2.1 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 195298ec89f..5bf4466796e 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.6 + +No user-facing changes. + ## 1.2.5 No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/1.2.6.md b/javascript/ql/src/change-notes/released/1.2.6.md new file mode 100644 index 00000000000..0832850ff8c --- /dev/null +++ b/javascript/ql/src/change-notes/released/1.2.6.md @@ -0,0 +1,3 @@ +## 1.2.6 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 40355f0807f..24962f7ba24 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.5 +lastReleaseVersion: 1.2.6 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 78f0585027b..04e84d1ac74 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 1.2.6-dev +version: 1.2.6 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 5d46c57bf4e..490b5dc360a 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.14.md b/misc/suite-helpers/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index eeb8f762b13..f14cabfe129 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.14-dev +version: 1.0.14 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 81c7659c4ed..dce2aad3c6d 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 3.1.0 + +### New Features + +- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. + +### Minor Analysis Improvements + +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. + ## 3.0.0 ### Breaking Changes diff --git a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md b/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md deleted file mode 100644 index adc7d39653f..00000000000 --- a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, - and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md b/python/ql/lib/change-notes/released/3.1.0.md similarity index 58% rename from python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md rename to python/ql/lib/change-notes/released/3.1.0.md index 57bb1b4a078..50b4b8184b7 100644 --- a/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md +++ b/python/ql/lib/change-notes/released/3.1.0.md @@ -1,5 +1,10 @@ ---- -category: feature ---- +## 3.1.0 + +### New Features - Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. + +### Minor Analysis Improvements + +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 147933b96fe..8e015428c49 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 3.0.1-dev +version: 3.1.0 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index c247e217acf..d5cacfc8401 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.4.0 + +### New Queries + +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. + ## 1.3.4 No user-facing changes. diff --git a/python/ql/src/change-notes/2024-11-21-template-injection.md b/python/ql/src/change-notes/released/1.4.0.md similarity index 78% rename from python/ql/src/change-notes/2024-11-21-template-injection.md rename to python/ql/src/change-notes/released/1.4.0.md index 7c604e9c993..02acaabcb98 100644 --- a/python/ql/src/change-notes/2024-11-21-template-injection.md +++ b/python/ql/src/change-notes/released/1.4.0.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- -* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. \ No newline at end of file +## 1.4.0 + +### New Queries + +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index 8263ddf2c8b..b8b2e97d508 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.4 +lastReleaseVersion: 1.4.0 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index d83b6433ac6..9d330fc3526 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.3.5-dev +version: 1.4.0 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 737903a3232..9179de3b7d5 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.1 + +No user-facing changes. + ## 3.0.0 ### Breaking Changes diff --git a/ruby/ql/lib/change-notes/released/3.0.1.md b/ruby/ql/lib/change-notes/released/3.0.1.md new file mode 100644 index 00000000000..ac5998ace61 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/3.0.1.md @@ -0,0 +1,3 @@ +## 3.0.1 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 33d3a2cd113..e3b15d965db 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.0.1 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index ddf106c95bf..a169addf8e7 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 3.0.1-dev +version: 3.0.1 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 5fe04780136..7d341c3f808 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.9 + +No user-facing changes. + ## 1.1.8 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.1.9.md b/ruby/ql/src/change-notes/released/1.1.9.md new file mode 100644 index 00000000000..f9d367d4248 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.1.9.md @@ -0,0 +1,3 @@ +## 1.1.9 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 64972659c42..6f4795f3ea0 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.8 +lastReleaseVersion: 1.1.9 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 43bfe75f566..72ff669503a 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.1.9-dev +version: 1.1.9 groups: - ruby - queries diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 285b39a4359..5f4501ed1e3 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/1.0.14.md b/shared/controlflow/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/controlflow/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 268f142bd1b..590d3e1666d 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index df038524d2d..949660e3381 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.1.8 + +### Minor Analysis Improvements + +* Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. + ## 1.1.7 No user-facing changes. diff --git a/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md b/shared/dataflow/change-notes/released/1.1.8.md similarity index 77% rename from shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md rename to shared/dataflow/change-notes/released/1.1.8.md index 30e71ade6af..d951e6bf0c7 100644 --- a/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md +++ b/shared/dataflow/change-notes/released/1.1.8.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.1.8 + +### Minor Analysis Improvements + * Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 75910556516..64972659c42 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.7 +lastReleaseVersion: 1.1.8 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 6a8e8c3a4ae..fe44120b3c1 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 1.1.8-dev +version: 1.1.8 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 93a528a4f3c..1b2146927e5 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.14.md b/shared/mad/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 125bcad622d..341373b22f5 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 6b25d16e0f7..993922ecc49 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.14.md b/shared/rangeanalysis/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 62c8c1e46b6..efb29bbc02c 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 54c3ed2b307..45bb8da81db 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.14.md b/shared/regex/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index e2cda264dc8..8db7e73e336 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 01c19388c92..d31fb6c6120 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/ssa/change-notes/released/1.0.14.md b/shared/ssa/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/ssa/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index b146ce5bc91..1276fd498f7 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 3c6fa155a32..2d5ba191d2e 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.14.md b/shared/threat-models/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 6ec41bbcc04..f337bfa721d 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.14-dev +version: 1.0.14 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 1f4e7ad4ed3..cc4652e04ff 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.14.md b/shared/tutorial/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 6677c74eed4..4c55d52356c 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index dd8fb7a60b2..ac6192fd7d8 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.14.md b/shared/typeflow/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index cd9e70bba8c..15761af538a 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 0ab05873af4..f651b953118 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/1.0.14.md b/shared/typetracking/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typetracking/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index fbe63f0da01..224b85826c4 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index c0c3cea3948..924a3fc0a7b 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.14.md b/shared/typos/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 250f729ab5f..31f04e60666 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index e03d990b747..9dd6c05d40a 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.1 + +No user-facing changes. + ## 2.0.0 ### Breaking Changes diff --git a/shared/util/change-notes/released/2.0.1.md b/shared/util/change-notes/released/2.0.1.md new file mode 100644 index 00000000000..b5b6d0dee91 --- /dev/null +++ b/shared/util/change-notes/released/2.0.1.md @@ -0,0 +1,3 @@ +## 2.0.1 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 0abe6ccede0..fe974a4dbf3 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.0 +lastReleaseVersion: 2.0.1 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index b327c25a3d9..da932a6ed36 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.1-dev +version: 2.0.1 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index c3ebc31994b..6837f7507d8 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.14.md b/shared/xml/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 76c408c2920..a3ace631d1b 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 28fcbceec8e..6e940e8d264 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.14.md b/shared/yaml/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 0c756e1edbb..006f30012bb 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index ba76b51c80e..c976d0c8514 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 3.1.0 + +### Major Analysis Improvements + +* Upgraded to allow analysis of Swift 6.0.2. + ## 3.0.0 ### Breaking Changes diff --git a/swift/ql/lib/change-notes/2024-12-09-swift-6.md b/swift/ql/lib/change-notes/released/3.1.0.md similarity index 51% rename from swift/ql/lib/change-notes/2024-12-09-swift-6.md rename to swift/ql/lib/change-notes/released/3.1.0.md index e32344b28d8..655a8ad323a 100644 --- a/swift/ql/lib/change-notes/2024-12-09-swift-6.md +++ b/swift/ql/lib/change-notes/released/3.1.0.md @@ -1,4 +1,5 @@ ---- -category: majorAnalysis ---- +## 3.1.0 + +### Major Analysis Improvements + * Upgraded to allow analysis of Swift 6.0.2. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 7752975faea..91e4d06f537 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 3.0.1-dev +version: 3.1.0 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 73ac6bef86d..a26a68434eb 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.0.14.md b/swift/ql/src/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/swift/ql/src/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index ec8e2cb9932..1ce09dc0969 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.0.14-dev +version: 1.0.14 groups: - swift - queries From 2e46d26eca517f228bd394bedd21a306e76e1cbb Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 12:22:31 -0500 Subject: [PATCH 22/71] Update python/ql/lib/change-notes/released/3.1.0.md --- python/ql/lib/change-notes/released/3.1.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/lib/change-notes/released/3.1.0.md b/python/ql/lib/change-notes/released/3.1.0.md index 50b4b8184b7..4b135bae79c 100644 --- a/python/ql/lib/change-notes/released/3.1.0.md +++ b/python/ql/lib/change-notes/released/3.1.0.md @@ -2,7 +2,7 @@ ### New Features -- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. +* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. ### Minor Analysis Improvements From cb31394729a97968df47a617f335b680610db4ed Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 12:23:52 -0500 Subject: [PATCH 23/71] Update python/ql/lib/CHANGELOG.md --- python/ql/lib/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index dce2aad3c6d..aabefe63a42 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -2,7 +2,7 @@ ### New Features -- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. +* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. ### Minor Analysis Improvements From 72a53c4b23bc29193dd3bdc930c23b18be35aee5 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 13:32:23 -0500 Subject: [PATCH 24/71] Revert "Release preparation for version 2.20.1" --- actions/ql/lib/CHANGELOG.md | 5 ----- .../2024-12-19-initial-release.md} | 7 +++---- actions/ql/lib/change-notes/released/0.4.0.md | 5 ----- actions/ql/lib/codeql-pack.release.yml | 2 -- actions/ql/lib/qlpack.yml | 2 +- .../2024-12-19-initial-release.md} | 7 +++---- actions/ql/src/codeql-pack.release.yml | 2 -- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 19 ----------------- .../2024-12-04-guard-conditions.md | 4 ++++ .../2024-12-17-template-parameter-base.md | 4 ++++ .../2024-12-17-template-parameter.md | 4 ++++ .../2024-12-18-non-type-template-parameter.md | 4 ++++ .../change-notes/2024-12-20-sizeof-pack.md | 4 ++++ ...4-12-20-template-template-instantiation.md | 6 ++++++ cpp/ql/lib/change-notes/released/3.1.0.md | 18 ---------------- cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 10 --------- .../2024-11-27-active-template-library.md | 4 ++++ .../2024-12-05-badly-bounded-write.md | 4 ++++ ...024-12-05-wrong-number-format-arguments.md | 4 ++++ .../2024-12-05-wrong-type-format-args.md | 4 ++++ ...024-12-18-return-stack-allocated-memory.md | 4 ++++ cpp/ql/src/change-notes/released/1.3.1.md | 9 -------- cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ---- .../lib/change-notes/released/1.7.31.md | 3 --- .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ---- .../src/change-notes/released/1.7.31.md | 3 --- .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 13 ------------ .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ++++ .../ql/lib/change-notes/2024-12-04-dotnet9.md | 4 ++++ .../2024-12-05-aspnetcore-mvc-model.md | 4 ++++ ...add-markupstring-as-html-injection-sink.md | 4 ++++ .../2024-12-18-blazor-attribute-sources.md | 6 ++++++ .../2024-12-20-collection-params.md | 4 ++++ csharp/ql/lib/change-notes/released/4.0.1.md | 12 ----------- csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 6 ------ ...1.0.14.md => 2024-12-17-move-libraries.md} | 7 +++---- csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 8 ------- ...-improve-flow-out-of-variadic-parameter.md | 4 ++++ .../2024-12-12-variadic-parameter-sources.md | 4 ++++ .../change-notes/2024-12-13-os-args-model.md | 5 +++++ go/ql/lib/change-notes/released/3.0.1.md | 7 ------- go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ---- go/ql/src/change-notes/released/1.1.5.md | 3 --- go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 21 ------------------- ...ontrol-flow-graph-lightweight-IR-layer.md} | 13 +++--------- ...sttemplate-getforobject-third-parameter.md | 4 ++++ .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ++++ .../change-notes/2024-12-06-file-getname.md | 4 ++++ java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ---- java/ql/src/change-notes/released/1.1.11.md | 3 --- java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ---- .../ql/lib/change-notes/released/2.2.1.md | 3 --- javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 4 ---- .../ql/src/change-notes/released/1.2.6.md | 3 --- javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 11 ---------- ...-parameter-annotation-api-graph-support.md | 5 +++++ .../2024-12-18-fastapi-request-modeling.md | 5 +++++ python/ql/lib/change-notes/released/3.1.0.md | 10 --------- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 6 ------ ....0.md => 2024-11-21-template-injection.md} | 9 ++++---- python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ---- ruby/ql/lib/change-notes/released/3.0.1.md | 3 --- ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ---- ruby/ql/src/change-notes/released/1.1.9.md | 3 --- ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 6 ------ ...d => 2023-10-02-deduplicate-path-graph.md} | 7 +++---- shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ---- shared/mad/change-notes/released/1.0.14.md | 3 --- shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ---- shared/regex/change-notes/released/1.0.14.md | 3 --- shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ---- shared/ssa/change-notes/released/1.0.14.md | 3 --- shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ---- .../tutorial/change-notes/released/1.0.14.md | 3 --- shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ---- .../typeflow/change-notes/released/1.0.14.md | 3 --- shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ---- .../change-notes/released/1.0.14.md | 3 --- shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ---- shared/typos/change-notes/released/1.0.14.md | 3 --- shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ---- shared/util/change-notes/released/2.0.1.md | 3 --- shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ---- shared/xml/change-notes/released/1.0.14.md | 3 --- shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ---- shared/yaml/change-notes/released/1.0.14.md | 3 --- shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 6 ------ .../3.1.0.md => 2024-12-09-swift-6.md} | 7 +++---- swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ---- swift/ql/src/change-notes/released/1.0.14.md | 3 --- swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 169 files changed, 199 insertions(+), 449 deletions(-) delete mode 100644 actions/ql/lib/CHANGELOG.md rename actions/ql/{src/change-notes/released/0.4.0.md => lib/change-notes/2024-12-19-initial-release.md} (55%) delete mode 100644 actions/ql/lib/change-notes/released/0.4.0.md delete mode 100644 actions/ql/lib/codeql-pack.release.yml rename actions/ql/src/{CHANGELOG.md => change-notes/2024-12-19-initial-release.md} (55%) delete mode 100644 actions/ql/src/codeql-pack.release.yml create mode 100644 cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md create mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md create mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter.md create mode 100644 cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md create mode 100644 cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md create mode 100644 cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md delete mode 100644 cpp/ql/lib/change-notes/released/3.1.0.md create mode 100644 cpp/ql/src/change-notes/2024-11-27-active-template-library.md create mode 100644 cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md create mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md create mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md create mode 100644 cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md delete mode 100644 cpp/ql/src/change-notes/released/1.3.1.md delete mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md delete mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md create mode 100644 csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md create mode 100644 csharp/ql/lib/change-notes/2024-12-04-dotnet9.md create mode 100644 csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md create mode 100644 csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md create mode 100644 csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md create mode 100644 csharp/ql/lib/change-notes/2024-12-20-collection-params.md delete mode 100644 csharp/ql/lib/change-notes/released/4.0.1.md rename csharp/ql/src/change-notes/{released/1.0.14.md => 2024-12-17-move-libraries.md} (65%) delete mode 100644 go/ql/consistency-queries/change-notes/released/1.0.14.md create mode 100644 go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md create mode 100644 go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md create mode 100644 go/ql/lib/change-notes/2024-12-13-os-args-model.md delete mode 100644 go/ql/lib/change-notes/released/3.0.1.md delete mode 100644 go/ql/src/change-notes/released/1.1.5.md rename java/ql/lib/change-notes/{released/6.0.0.md => 2024-11-14-control-flow-graph-lightweight-IR-layer.md} (50%) create mode 100644 java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md create mode 100644 java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md create mode 100644 java/ql/lib/change-notes/2024-12-06-file-getname.md delete mode 100644 java/ql/src/change-notes/released/1.1.11.md delete mode 100644 javascript/ql/lib/change-notes/released/2.2.1.md delete mode 100644 javascript/ql/src/change-notes/released/1.2.6.md delete mode 100644 misc/suite-helpers/change-notes/released/1.0.14.md create mode 100644 python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md create mode 100644 python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md delete mode 100644 python/ql/lib/change-notes/released/3.1.0.md rename python/ql/src/change-notes/{released/1.4.0.md => 2024-11-21-template-injection.md} (78%) delete mode 100644 ruby/ql/lib/change-notes/released/3.0.1.md delete mode 100644 ruby/ql/src/change-notes/released/1.1.9.md delete mode 100644 shared/controlflow/change-notes/released/1.0.14.md rename shared/dataflow/change-notes/{released/1.1.8.md => 2023-10-02-deduplicate-path-graph.md} (77%) delete mode 100644 shared/mad/change-notes/released/1.0.14.md delete mode 100644 shared/rangeanalysis/change-notes/released/1.0.14.md delete mode 100644 shared/regex/change-notes/released/1.0.14.md delete mode 100644 shared/ssa/change-notes/released/1.0.14.md delete mode 100644 shared/threat-models/change-notes/released/1.0.14.md delete mode 100644 shared/tutorial/change-notes/released/1.0.14.md delete mode 100644 shared/typeflow/change-notes/released/1.0.14.md delete mode 100644 shared/typetracking/change-notes/released/1.0.14.md delete mode 100644 shared/typos/change-notes/released/1.0.14.md delete mode 100644 shared/util/change-notes/released/2.0.1.md delete mode 100644 shared/xml/change-notes/released/1.0.14.md delete mode 100644 shared/yaml/change-notes/released/1.0.14.md rename swift/ql/lib/change-notes/{released/3.1.0.md => 2024-12-09-swift-6.md} (51%) delete mode 100644 swift/ql/src/change-notes/released/1.0.14.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md deleted file mode 100644 index 7ad10899ce1..00000000000 --- a/actions/ql/lib/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -## 0.4.0 - -### New Features - -* Initial public preview release diff --git a/actions/ql/src/change-notes/released/0.4.0.md b/actions/ql/lib/change-notes/2024-12-19-initial-release.md similarity index 55% rename from actions/ql/src/change-notes/released/0.4.0.md rename to actions/ql/lib/change-notes/2024-12-19-initial-release.md index caa8feca558..09263f5089d 100644 --- a/actions/ql/src/change-notes/released/0.4.0.md +++ b/actions/ql/lib/change-notes/2024-12-19-initial-release.md @@ -1,5 +1,4 @@ -## 0.4.0 - -### New Queries - +--- +category: feature +--- * Initial public preview release diff --git a/actions/ql/lib/change-notes/released/0.4.0.md b/actions/ql/lib/change-notes/released/0.4.0.md deleted file mode 100644 index 7ad10899ce1..00000000000 --- a/actions/ql/lib/change-notes/released/0.4.0.md +++ /dev/null @@ -1,5 +0,0 @@ -## 0.4.0 - -### New Features - -* Initial public preview release diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml deleted file mode 100644 index 458bfbeccff..00000000000 --- a/actions/ql/lib/codeql-pack.release.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -lastReleaseVersion: 0.4.0 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 2f6aa980728..83cdaabc80d 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.0 +version: 0.4.0-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/change-notes/2024-12-19-initial-release.md similarity index 55% rename from actions/ql/src/CHANGELOG.md rename to actions/ql/src/change-notes/2024-12-19-initial-release.md index caa8feca558..e02078ea273 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/change-notes/2024-12-19-initial-release.md @@ -1,5 +1,4 @@ -## 0.4.0 - -### New Queries - +--- +category: newQuery +--- * Initial public preview release diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml deleted file mode 100644 index 458bfbeccff..00000000000 --- a/actions/ql/src/codeql-pack.release.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -lastReleaseVersion: 0.4.0 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 7ea8f9d77dd..f822a516e56 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.4.0 +version: 0.4.0-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 919bd905e73..19784b530e7 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,22 +1,3 @@ -## 3.1.0 - -### Deprecated APIs - -* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. - -### New Features - -* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. -* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. -* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. -* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. -* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. -* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. - -### Minor Analysis Improvements - -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. - ## 3.0.0 ### Breaking Changes diff --git a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md b/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md new file mode 100644 index 00000000000..f60a6a2970a --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md new file mode 100644 index 00000000000..6fec6d5f4f5 --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md new file mode 100644 index 00000000000..0ac7085b371 --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md @@ -0,0 +1,4 @@ +--- +category: deprecated +--- +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. diff --git a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md new file mode 100644 index 00000000000..41fe400ed66 --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. diff --git a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md b/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md new file mode 100644 index 00000000000..bd912e4fb2e --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. diff --git a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md b/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md new file mode 100644 index 00000000000..6e3ecd3468c --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md @@ -0,0 +1,6 @@ +--- +category: feature +--- +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. diff --git a/cpp/ql/lib/change-notes/released/3.1.0.md b/cpp/ql/lib/change-notes/released/3.1.0.md deleted file mode 100644 index 3c7f181f60a..00000000000 --- a/cpp/ql/lib/change-notes/released/3.1.0.md +++ /dev/null @@ -1,18 +0,0 @@ -## 3.1.0 - -### Deprecated APIs - -* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. - -### New Features - -* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. -* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. -* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. -* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. -* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. -* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. - -### Minor Analysis Improvements - -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 82f62960aa3..33d3a2cd113 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.1.0 +lastReleaseVersion: 3.0.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 2d83b8d4840..4bb4b04e02f 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 3.1.0 +version: 3.0.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 7d957e42696..db16fe6f8b3 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,13 +1,3 @@ -## 1.3.1 - -### Minor Analysis Improvements - -* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. -* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. -* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. -* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. -* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). - ## 1.3.0 ### New Queries diff --git a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md b/cpp/ql/src/change-notes/2024-11-27-active-template-library.md new file mode 100644 index 00000000000..a677ac66107 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-11-27-active-template-library.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md b/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md new file mode 100644 index 00000000000..c7ddd104ad0 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md b/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md new file mode 100644 index 00000000000..6b41378f556 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md b/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md new file mode 100644 index 00000000000..1bf77d55a61 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md b/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md new file mode 100644 index 00000000000..76f5b9d7eae --- /dev/null +++ b/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. diff --git a/cpp/ql/src/change-notes/released/1.3.1.md b/cpp/ql/src/change-notes/released/1.3.1.md deleted file mode 100644 index bb3b2bf16c7..00000000000 --- a/cpp/ql/src/change-notes/released/1.3.1.md +++ /dev/null @@ -1,9 +0,0 @@ -## 1.3.1 - -### Minor Analysis Improvements - -* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. -* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. -* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. -* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. -* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index e71b6d081f1..ec16350ed6f 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.1 +lastReleaseVersion: 1.3.0 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index b37fc604fc6..940c3e2a4cb 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.3.1 +version: 1.3.1-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 0a74ff6d7d0..a71f93aacd4 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.7.31 - -No user-facing changes. - ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md deleted file mode 100644 index 17df0436207..00000000000 --- a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.7.31 - -No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 908f8a00a39..c0346e526b9 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.31 +lastReleaseVersion: 1.7.30 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index d5274444753..781915bf1a1 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.31 +version: 1.7.31-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 0a74ff6d7d0..a71f93aacd4 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.7.31 - -No user-facing changes. - ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md deleted file mode 100644 index 17df0436207..00000000000 --- a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.7.31 - -No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 908f8a00a39..c0346e526b9 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.31 +lastReleaseVersion: 1.7.30 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 41d5662ed57..979d8e6c661 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.31 +version: 1.7.31-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 857acdec93a..86f279365f0 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,16 +1,3 @@ -## 4.0.1 - -### Minor Analysis Improvements - -* C# 13: Added QL library support for *collection* like type `params` parameters. -* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - - `[SupplyParameterFromForm]` - - `[SupplyParameterFromQuery]` -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. -* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. - ## 4.0.0 ### Breaking Changes diff --git a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md new file mode 100644 index 00000000000..258c0e5326b --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md b/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md new file mode 100644 index 00000000000..e166040e155 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md b/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md new file mode 100644 index 00000000000..04afe96522b --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md b/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md new file mode 100644 index 00000000000..032edbb1f10 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. diff --git a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md b/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md new file mode 100644 index 00000000000..5a48753b259 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md @@ -0,0 +1,6 @@ +--- +category: minorAnalysis +--- +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` diff --git a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md b/csharp/ql/lib/change-notes/2024-12-20-collection-params.md new file mode 100644 index 00000000000..bb5ea26c6d4 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-20-collection-params.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# 13: Added QL library support for *collection* like type `params` parameters. diff --git a/csharp/ql/lib/change-notes/released/4.0.1.md b/csharp/ql/lib/change-notes/released/4.0.1.md deleted file mode 100644 index 703439b4cfe..00000000000 --- a/csharp/ql/lib/change-notes/released/4.0.1.md +++ /dev/null @@ -1,12 +0,0 @@ -## 4.0.1 - -### Minor Analysis Improvements - -* C# 13: Added QL library support for *collection* like type `params` parameters. -* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - - `[SupplyParameterFromForm]` - - `[SupplyParameterFromQuery]` -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. -* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index c0db4dcc0b3..49fe3eef697 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.0.1 +lastReleaseVersion: 4.0.0 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index bb79e33a528..81a55470a4d 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 4.0.1 +version: 4.0.1-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 1adfe6e1822..370a9cf4a6a 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,9 +1,3 @@ -## 1.0.14 - -### Minor Analysis Improvements - -* The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. - ## 1.0.13 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/released/1.0.14.md b/csharp/ql/src/change-notes/2024-12-17-move-libraries.md similarity index 65% rename from csharp/ql/src/change-notes/released/1.0.14.md rename to csharp/ql/src/change-notes/2024-12-17-move-libraries.md index d49594169df..07bf61b7e35 100644 --- a/csharp/ql/src/change-notes/released/1.0.14.md +++ b/csharp/ql/src/change-notes/2024-12-17-move-libraries.md @@ -1,5 +1,4 @@ -## 1.0.14 - -### Minor Analysis Improvements - +--- +category: minorAnalysis +--- * The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 5334c690270..e4d9400d96d 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.0.14 +version: 1.0.14-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 2d5ba191d2e..3c6fa155a32 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.14.md b/go/ql/consistency-queries/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/go/ql/consistency-queries/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 5e500c12eb7..1812705438c 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.14 +version: 1.0.14-dev groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 9c0c41ec4cb..83052b3a1d9 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,11 +1,3 @@ -## 3.0.1 - -### Minor Analysis Improvements - -* Added a `commandargs` local source model for the `os.Args` variable. -* Source models defined using models-as-data now work for variadic parameters. -* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. - ## 3.0.0 ### Breaking Changes diff --git a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md b/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md new file mode 100644 index 00000000000..8244ba06994 --- /dev/null +++ b/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md b/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md new file mode 100644 index 00000000000..38d5ad2783f --- /dev/null +++ b/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Source models defined using models-as-data now work for variadic parameters. diff --git a/go/ql/lib/change-notes/2024-12-13-os-args-model.md b/go/ql/lib/change-notes/2024-12-13-os-args-model.md new file mode 100644 index 00000000000..20a16d222e4 --- /dev/null +++ b/go/ql/lib/change-notes/2024-12-13-os-args-model.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Added a `commandargs` local source model for the `os.Args` variable. + diff --git a/go/ql/lib/change-notes/released/3.0.1.md b/go/ql/lib/change-notes/released/3.0.1.md deleted file mode 100644 index a8faff41943..00000000000 --- a/go/ql/lib/change-notes/released/3.0.1.md +++ /dev/null @@ -1,7 +0,0 @@ -## 3.0.1 - -### Minor Analysis Improvements - -* Added a `commandargs` local source model for the `os.Args` variable. -* Source models defined using models-as-data now work for variadic parameters. -* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index e3b15d965db..33d3a2cd113 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.1 +lastReleaseVersion: 3.0.0 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index a540b7905c3..4e72aa3857b 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 3.0.1 +version: 3.0.1-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 838a8bce5ea..c9044e55cdc 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.5 - -No user-facing changes. - ## 1.1.4 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/1.1.5.md b/go/ql/src/change-notes/released/1.1.5.md deleted file mode 100644 index 11a52a121d1..00000000000 --- a/go/ql/src/change-notes/released/1.1.5.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.1.5 - -No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index df39a9de059..26cbcd3f123 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.5 +lastReleaseVersion: 1.1.4 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 52d3c0012ba..36775d0d862 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.1.5 +version: 1.1.5-dev groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index e7aa3c152de..09ee80087e8 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,24 +1,3 @@ -## 6.0.0 - -### Breaking Changes - -* The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer - directly equatable to `Expr` and `Stmt`. Any queries that have been - exploiting these equalities, for example by using casts, will need minor - updates in order to fix any compilation errors. Conversions can be inserted - in either direction depending on what is most convenient. Available - conversions include `Expr.getControlFlowNode()`, `Stmt.getControlFlowNode()`, - `ControlFlowNode.asExpr()`, `ControlFlowNode.asStmt()`, and - `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a - `ControlFlowNode` equal to its enclosing `Callable`; these are now instead - modelled by the class `ControlFlow::ExitNode`. - -### Minor Analysis Improvements - -* Added `java.io.File.getName()` as a path injection sanitizer. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. - ## 5.0.0 ### Breaking Changes diff --git a/java/ql/lib/change-notes/released/6.0.0.md b/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md similarity index 50% rename from java/ql/lib/change-notes/released/6.0.0.md rename to java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md index f66dd1b2bbf..2fbb6a537c7 100644 --- a/java/ql/lib/change-notes/released/6.0.0.md +++ b/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md @@ -1,7 +1,6 @@ -## 6.0.0 - -### Breaking Changes - +--- +category: breaking +--- * The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer directly equatable to `Expr` and `Stmt`. Any queries that have been exploiting these equalities, for example by using casts, will need minor @@ -12,9 +11,3 @@ `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a `ControlFlowNode` equal to its enclosing `Callable`; these are now instead modelled by the class `ControlFlow::ExitNode`. - -### Minor Analysis Improvements - -* Added `java.io.File.getName()` as a path injection sanitizer. -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. -* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md b/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md new file mode 100644 index 00000000000..4f45d19e5e8 --- /dev/null +++ b/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md new file mode 100644 index 00000000000..258c0e5326b --- /dev/null +++ b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/java/ql/lib/change-notes/2024-12-06-file-getname.md b/java/ql/lib/change-notes/2024-12-06-file-getname.md new file mode 100644 index 00000000000..b2d1d271ab5 --- /dev/null +++ b/java/ql/lib/change-notes/2024-12-06-file-getname.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added `java.io.File.getName()` as a path injection sanitizer. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index f8c4fa43ccb..c9e54136ca5 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.0 +lastReleaseVersion: 5.0.0 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index d0490615f69..f892ca1c450 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 6.0.0 +version: 5.0.1-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index c7148cba8d8..0bb38874b82 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.11 - -No user-facing changes. - ## 1.1.10 ### Minor Analysis Improvements diff --git a/java/ql/src/change-notes/released/1.1.11.md b/java/ql/src/change-notes/released/1.1.11.md deleted file mode 100644 index c94f527264e..00000000000 --- a/java/ql/src/change-notes/released/1.1.11.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.1.11 - -No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 121f8cf035d..4c01918d414 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.11 +lastReleaseVersion: 1.1.10 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index dd530febd2e..8ee211fb536 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.1.11 +version: 1.1.11-dev groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 7aa60446f0e..ebe424935eb 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.2.1 - -No user-facing changes. - ## 2.2.0 ### Major Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/2.2.1.md b/javascript/ql/lib/change-notes/released/2.2.1.md deleted file mode 100644 index 62b48f9d2e8..00000000000 --- a/javascript/ql/lib/change-notes/released/2.2.1.md +++ /dev/null @@ -1,3 +0,0 @@ -## 2.2.1 - -No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 863e3cd380d..2f308354195 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.2.1 +lastReleaseVersion: 2.2.0 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index d78821f0892..4d568ff4813 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.2.1 +version: 2.2.1-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 5bf4466796e..195298ec89f 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.2.6 - -No user-facing changes. - ## 1.2.5 No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/1.2.6.md b/javascript/ql/src/change-notes/released/1.2.6.md deleted file mode 100644 index 0832850ff8c..00000000000 --- a/javascript/ql/src/change-notes/released/1.2.6.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.2.6 - -No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 24962f7ba24..40355f0807f 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.6 +lastReleaseVersion: 1.2.5 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 04e84d1ac74..78f0585027b 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 1.2.6 +version: 1.2.6-dev groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 490b5dc360a..5d46c57bf4e 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.14.md b/misc/suite-helpers/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/misc/suite-helpers/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index f14cabfe129..eeb8f762b13 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.14 +version: 1.0.14-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index aabefe63a42..81c7659c4ed 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,14 +1,3 @@ -## 3.1.0 - -### New Features - -* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. - -### Minor Analysis Improvements - -* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, - and modeling of tainted data flow out of these request objects. - ## 3.0.0 ### Breaking Changes diff --git a/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md b/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md new file mode 100644 index 00000000000..57bb1b4a078 --- /dev/null +++ b/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md @@ -0,0 +1,5 @@ +--- +category: feature +--- + +- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. diff --git a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md b/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md new file mode 100644 index 00000000000..adc7d39653f --- /dev/null +++ b/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/change-notes/released/3.1.0.md b/python/ql/lib/change-notes/released/3.1.0.md deleted file mode 100644 index 4b135bae79c..00000000000 --- a/python/ql/lib/change-notes/released/3.1.0.md +++ /dev/null @@ -1,10 +0,0 @@ -## 3.1.0 - -### New Features - -* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. - -### Minor Analysis Improvements - -* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, - and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 82f62960aa3..33d3a2cd113 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.1.0 +lastReleaseVersion: 3.0.0 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 8e015428c49..147933b96fe 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 3.1.0 +version: 3.0.1-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index d5cacfc8401..c247e217acf 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,9 +1,3 @@ -## 1.4.0 - -### New Queries - -* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. - ## 1.3.4 No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.4.0.md b/python/ql/src/change-notes/2024-11-21-template-injection.md similarity index 78% rename from python/ql/src/change-notes/released/1.4.0.md rename to python/ql/src/change-notes/2024-11-21-template-injection.md index 02acaabcb98..7c604e9c993 100644 --- a/python/ql/src/change-notes/released/1.4.0.md +++ b/python/ql/src/change-notes/2024-11-21-template-injection.md @@ -1,5 +1,4 @@ -## 1.4.0 - -### New Queries - -* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. +--- +category: newQuery +--- +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. \ No newline at end of file diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index b8b2e97d508..8263ddf2c8b 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.0 +lastReleaseVersion: 1.3.4 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 9d330fc3526..d83b6433ac6 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.4.0 +version: 1.3.5-dev groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 9179de3b7d5..737903a3232 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,7 +1,3 @@ -## 3.0.1 - -No user-facing changes. - ## 3.0.0 ### Breaking Changes diff --git a/ruby/ql/lib/change-notes/released/3.0.1.md b/ruby/ql/lib/change-notes/released/3.0.1.md deleted file mode 100644 index ac5998ace61..00000000000 --- a/ruby/ql/lib/change-notes/released/3.0.1.md +++ /dev/null @@ -1,3 +0,0 @@ -## 3.0.1 - -No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index e3b15d965db..33d3a2cd113 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.1 +lastReleaseVersion: 3.0.0 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index a169addf8e7..ddf106c95bf 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 3.0.1 +version: 3.0.1-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 7d341c3f808..5fe04780136 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.9 - -No user-facing changes. - ## 1.1.8 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.1.9.md b/ruby/ql/src/change-notes/released/1.1.9.md deleted file mode 100644 index f9d367d4248..00000000000 --- a/ruby/ql/src/change-notes/released/1.1.9.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.1.9 - -No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 6f4795f3ea0..64972659c42 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.9 +lastReleaseVersion: 1.1.8 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 72ff669503a..43bfe75f566 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.1.9 +version: 1.1.9-dev groups: - ruby - queries diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 5f4501ed1e3..285b39a4359 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/1.0.14.md b/shared/controlflow/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/controlflow/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 590d3e1666d..268f142bd1b 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 949660e3381..df038524d2d 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,9 +1,3 @@ -## 1.1.8 - -### Minor Analysis Improvements - -* Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. - ## 1.1.7 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/1.1.8.md b/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md similarity index 77% rename from shared/dataflow/change-notes/released/1.1.8.md rename to shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md index d951e6bf0c7..30e71ade6af 100644 --- a/shared/dataflow/change-notes/released/1.1.8.md +++ b/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md @@ -1,5 +1,4 @@ -## 1.1.8 - -### Minor Analysis Improvements - +--- +category: minorAnalysis +--- * Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 64972659c42..75910556516 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.8 +lastReleaseVersion: 1.1.7 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index fe44120b3c1..6a8e8c3a4ae 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 1.1.8 +version: 1.1.8-dev groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 1b2146927e5..93a528a4f3c 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.14.md b/shared/mad/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/mad/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 341373b22f5..125bcad622d 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 993922ecc49..6b25d16e0f7 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.14.md b/shared/rangeanalysis/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/rangeanalysis/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index efb29bbc02c..62c8c1e46b6 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 45bb8da81db..54c3ed2b307 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.14.md b/shared/regex/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/regex/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 8db7e73e336..e2cda264dc8 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index d31fb6c6120..01c19388c92 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/ssa/change-notes/released/1.0.14.md b/shared/ssa/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/ssa/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 1276fd498f7..b146ce5bc91 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 2d5ba191d2e..3c6fa155a32 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.14.md b/shared/threat-models/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/threat-models/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index f337bfa721d..6ec41bbcc04 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.14 +version: 1.0.14-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index cc4652e04ff..1f4e7ad4ed3 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.14.md b/shared/tutorial/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/tutorial/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 4c55d52356c..6677c74eed4 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index ac6192fd7d8..dd8fb7a60b2 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.14.md b/shared/typeflow/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/typeflow/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 15761af538a..cd9e70bba8c 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index f651b953118..0ab05873af4 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/1.0.14.md b/shared/typetracking/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/typetracking/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 224b85826c4..fbe63f0da01 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 924a3fc0a7b..c0c3cea3948 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.14.md b/shared/typos/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/typos/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 31f04e60666..250f729ab5f 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 9dd6c05d40a..e03d990b747 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.0.1 - -No user-facing changes. - ## 2.0.0 ### Breaking Changes diff --git a/shared/util/change-notes/released/2.0.1.md b/shared/util/change-notes/released/2.0.1.md deleted file mode 100644 index b5b6d0dee91..00000000000 --- a/shared/util/change-notes/released/2.0.1.md +++ /dev/null @@ -1,3 +0,0 @@ -## 2.0.1 - -No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index fe974a4dbf3..0abe6ccede0 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.1 +lastReleaseVersion: 2.0.0 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index da932a6ed36..b327c25a3d9 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.1 +version: 2.0.1-dev groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 6837f7507d8..c3ebc31994b 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.14.md b/shared/xml/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/xml/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index a3ace631d1b..76c408c2920 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 6e940e8d264..28fcbceec8e 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.14.md b/shared/yaml/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/shared/yaml/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 006f30012bb..0c756e1edbb 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.14 +version: 1.0.14-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index c976d0c8514..ba76b51c80e 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,9 +1,3 @@ -## 3.1.0 - -### Major Analysis Improvements - -* Upgraded to allow analysis of Swift 6.0.2. - ## 3.0.0 ### Breaking Changes diff --git a/swift/ql/lib/change-notes/released/3.1.0.md b/swift/ql/lib/change-notes/2024-12-09-swift-6.md similarity index 51% rename from swift/ql/lib/change-notes/released/3.1.0.md rename to swift/ql/lib/change-notes/2024-12-09-swift-6.md index 655a8ad323a..e32344b28d8 100644 --- a/swift/ql/lib/change-notes/released/3.1.0.md +++ b/swift/ql/lib/change-notes/2024-12-09-swift-6.md @@ -1,5 +1,4 @@ -## 3.1.0 - -### Major Analysis Improvements - +--- +category: majorAnalysis +--- * Upgraded to allow analysis of Swift 6.0.2. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 82f62960aa3..33d3a2cd113 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.1.0 +lastReleaseVersion: 3.0.0 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 91e4d06f537..7752975faea 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 3.1.0 +version: 3.0.1-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index a26a68434eb..73ac6bef86d 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.0.14 - -No user-facing changes. - ## 1.0.13 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.0.14.md b/swift/ql/src/change-notes/released/1.0.14.md deleted file mode 100644 index 84f6736f1a1..00000000000 --- a/swift/ql/src/change-notes/released/1.0.14.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.14 - -No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 3b484f28dfa..c3be7eb7716 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.14 +lastReleaseVersion: 1.0.13 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 1ce09dc0969..ec8e2cb9932 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.0.14 +version: 1.0.14-dev groups: - swift - queries From 3dcf49cea0fee901bce99c4c14b5f9658939fd5e Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 14:55:06 -0500 Subject: [PATCH 25/71] Revert "Merge pull request #18275 from owen-mc/go/mad/variadic-params-sources" This reverts commit 7ab06fca2f74f9d232cb43630667411acb7d4e29, reversing changes made to 0c5e260ae6845b6997e4e6b9556a434923444b68. --- .../2024-12-12-variadic-parameter-sources.md | 4 -- .../go/dataflow/internal/DataFlowPrivate.qll | 10 ----- .../dataflow/internal/TaintTrackingUtil.qll | 38 ++++--------------- .../FlowSteps/LocalTaintStep.expected | 28 -------------- .../dataflow/VarArgsWithExternalFlow/main.go | 8 +--- .../frameworks/TaintSteps/TaintStep.expected | 12 ------ .../CWE-312/CleartextLogging.expected | 18 ++++++--- 7 files changed, 21 insertions(+), 97 deletions(-) delete mode 100644 go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md diff --git a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md b/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md deleted file mode 100644 index 38d5ad2783f..00000000000 --- a/go/ql/lib/change-notes/2024-12-12-variadic-parameter-sources.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Source models defined using models-as-data now work for variadic parameters. diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll index 03219631248..2fcbf2d350f 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll @@ -458,13 +458,3 @@ class ContentApprox = Unit; /** Gets an approximated value for content `c`. */ pragma[inline] ContentApprox getContentApprox(Content c) { any() } - -/** - * Holds if the the content `c` is a container. - */ -predicate containerContent(ContentSet c) { - c instanceof ArrayContent or - c instanceof CollectionContent or - c instanceof MapKeyContent or - c instanceof MapValueContent -} diff --git a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll index 2605dd326c3..5365228e231 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll @@ -27,21 +27,11 @@ predicate localExprTaint(Expr src, Expr sink) { * Holds if taint can flow in one local step from `src` to `sink`. */ predicate localTaintStep(DataFlow::Node src, DataFlow::Node sink) { - DataFlow::localFlowStep(src, sink) - or - localAdditionalTaintStep(src, sink, _) - or + DataFlow::localFlowStep(src, sink) or + localAdditionalTaintStep(src, sink, _) or // Simple flow through library code is included in the exposed local // step relation, even though flow is technically inter-procedural FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(src, sink, _) - or - // Treat container flow as taint for the local taint flow relation - exists(DataFlow::Content c | DataFlowPrivate::containerContent(c) | - DataFlowPrivate::readStep(src, c, sink) or - DataFlowPrivate::storeStep(src, c, sink) or - FlowSummaryImpl::Private::Steps::summaryGetterStep(src, c, sink, _) or - FlowSummaryImpl::Private::Steps::summarySetterStep(src, c, sink, _) - ) } private Type getElementType(Type containerType) { @@ -98,18 +88,12 @@ class AdditionalTaintStep extends Unit { */ predicate localAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ, string model) { ( - referenceStep(pred, succ) - or - elementWriteStep(pred, succ) - or - fieldReadStep(pred, succ) - or - elementStep(pred, succ) - or - tupleStep(pred, succ) - or - stringConcatStep(pred, succ) - or + referenceStep(pred, succ) or + elementWriteStep(pred, succ) or + fieldReadStep(pred, succ) or + elementStep(pred, succ) or + tupleStep(pred, succ) or + stringConcatStep(pred, succ) or sliceStep(pred, succ) ) and model = "" @@ -179,12 +163,6 @@ predicate elementStep(DataFlow::Node pred, DataFlow::Node succ) { // only step into the value, not the index succ.asInstruction() = IR::extractTupleElement(nextEntry, 1) ) - or - exists(DataFlow::ImplicitVarargsSlice ivs | - pred.(DataFlow::PostUpdateNode).getPreUpdateNode() = ivs and - succ.(DataFlow::PostUpdateNode).getPreUpdateNode() = - ivs.getCallNode().getAnImplicitVarargsArgument() - ) } /** Holds if taint flows from `pred` to `succ` via an extract tuple operation. */ diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected index abe37122ba6..6fadcdaabe6 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected @@ -5,36 +5,24 @@ | main.go:38:19:38:19 | 3 | main.go:38:7:38:20 | slice literal | | main.go:39:8:39:25 | []type{args} | main.go:39:8:39:25 | call to append | | main.go:39:15:39:15 | s | main.go:39:8:39:25 | call to append | -| main.go:39:18:39:18 | 4 | main.go:39:8:39:25 | []type{args} | -| main.go:39:21:39:21 | 5 | main.go:39:8:39:25 | []type{args} | -| main.go:39:24:39:24 | 6 | main.go:39:8:39:25 | []type{args} | | main.go:40:15:40:15 | s | main.go:40:8:40:23 | call to append | | main.go:40:18:40:19 | s1 | main.go:40:8:40:23 | call to append | | main.go:42:10:42:11 | s4 | main.go:38:2:38:2 | definition of s | | main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | range statement[0] | | main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | range statement[1] | | main.go:47:20:47:21 | xs | main.go:47:2:50:2 | range statement[1] | -| main.go:56:8:56:11 | true | main.go:56:2:56:3 | ch | -| main.go:57:4:57:5 | ch | main.go:57:2:57:5 | <-... | | strings.go:9:24:9:24 | s | strings.go:9:8:9:38 | call to Replace | | strings.go:9:32:9:34 | "_" | strings.go:9:8:9:38 | call to Replace | | strings.go:10:27:10:27 | s | strings.go:10:8:10:42 | call to ReplaceAll | | strings.go:10:35:10:41 | "&" | strings.go:10:8:10:42 | call to ReplaceAll | -| strings.go:11:9:11:26 | []type{args} | strings.go:11:9:11:26 | call to Sprint | | strings.go:11:9:11:26 | call to Sprint | strings.go:11:9:11:50 | ...+... | | strings.go:11:9:11:50 | ...+... | strings.go:11:9:11:69 | ...+... | -| strings.go:11:20:11:21 | s2 | strings.go:11:9:11:26 | []type{args} | | strings.go:11:20:11:21 | s2 | strings.go:11:9:11:26 | call to Sprint | -| strings.go:11:24:11:25 | s3 | strings.go:11:9:11:26 | []type{args} | | strings.go:11:24:11:25 | s3 | strings.go:11:9:11:26 | call to Sprint | -| strings.go:11:30:11:50 | []type{args} | strings.go:11:30:11:50 | call to Sprintf | | strings.go:11:30:11:50 | call to Sprintf | strings.go:11:9:11:50 | ...+... | | strings.go:11:42:11:45 | "%q" | strings.go:11:30:11:50 | call to Sprintf | -| strings.go:11:48:11:49 | s2 | strings.go:11:30:11:50 | []type{args} | | strings.go:11:48:11:49 | s2 | strings.go:11:30:11:50 | call to Sprintf | -| strings.go:11:54:11:69 | []type{args} | strings.go:11:54:11:69 | call to Sprintln | | strings.go:11:54:11:69 | call to Sprintln | strings.go:11:9:11:69 | ...+... | -| strings.go:11:67:11:68 | s3 | strings.go:11:54:11:69 | []type{args} | | strings.go:11:67:11:68 | s3 | strings.go:11:54:11:69 | call to Sprintln | | url.go:12:14:12:48 | call to PathUnescape | url.go:12:3:12:48 | ... = ...[0] | | url.go:12:14:12:48 | call to PathUnescape | url.go:12:3:12:48 | ... = ...[1] | @@ -51,25 +39,17 @@ | url.go:27:9:27:30 | call to ParseRequestURI | url.go:27:2:27:30 | ... = ...[1] | | url.go:27:29:27:29 | s | url.go:27:2:27:30 | ... = ...[0] | | url.go:28:14:28:14 | u | url.go:28:14:28:28 | call to EscapedPath | -| url.go:28:14:28:28 | call to EscapedPath | url.go:28:2:28:29 | []type{args} | | url.go:29:14:29:14 | u | url.go:29:14:29:25 | call to Hostname | -| url.go:29:14:29:25 | call to Hostname | url.go:29:2:29:26 | []type{args} | | url.go:30:11:30:11 | u | url.go:30:2:30:27 | ... := ...[0] | | url.go:30:11:30:27 | call to MarshalBinary | url.go:30:2:30:27 | ... := ...[0] | | url.go:30:11:30:27 | call to MarshalBinary | url.go:30:2:30:27 | ... := ...[1] | -| url.go:31:2:31:16 | []type{args} | url.go:30:2:30:3 | definition of bs | -| url.go:31:14:31:15 | bs | url.go:31:2:31:16 | []type{args} | | url.go:32:9:32:9 | u | url.go:32:2:32:23 | ... = ...[0] | | url.go:32:9:32:23 | call to Parse | url.go:32:2:32:23 | ... = ...[0] | | url.go:32:9:32:23 | call to Parse | url.go:32:2:32:23 | ... = ...[1] | | url.go:32:17:32:22 | "/foo" | url.go:32:2:32:23 | ... = ...[0] | | url.go:33:14:33:14 | u | url.go:33:14:33:21 | call to Port | -| url.go:33:14:33:21 | call to Port | url.go:33:2:33:22 | []type{args} | -| url.go:34:2:34:23 | []type{args} | url.go:34:14:34:22 | call to Query | | url.go:34:14:34:14 | u | url.go:34:14:34:22 | call to Query | -| url.go:34:14:34:22 | call to Query | url.go:34:2:34:23 | []type{args} | | url.go:35:14:35:14 | u | url.go:35:14:35:27 | call to RequestURI | -| url.go:35:14:35:27 | call to RequestURI | url.go:35:2:35:28 | []type{args} | | url.go:36:6:36:6 | u | url.go:36:6:36:26 | call to ResolveReference | | url.go:36:25:36:25 | u | url.go:36:6:36:26 | call to ResolveReference | | url.go:41:17:41:20 | "me" | url.go:41:8:41:21 | call to User | @@ -78,35 +58,27 @@ | url.go:43:11:43:12 | ui | url.go:43:2:43:23 | ... := ...[0] | | url.go:43:11:43:23 | call to Password | url.go:43:2:43:23 | ... := ...[0] | | url.go:43:11:43:23 | call to Password | url.go:43:2:43:23 | ... := ...[1] | -| url.go:44:14:44:15 | pw | url.go:44:2:44:16 | []type{args} | | url.go:45:14:45:15 | ui | url.go:45:14:45:26 | call to Username | -| url.go:45:14:45:26 | call to Username | url.go:45:2:45:27 | []type{args} | | url.go:50:10:50:26 | call to ParseQuery | url.go:50:2:50:26 | ... := ...[0] | | url.go:50:10:50:26 | call to ParseQuery | url.go:50:2:50:26 | ... := ...[1] | | url.go:50:25:50:25 | q | url.go:50:2:50:26 | ... := ...[0] | | url.go:51:14:51:14 | v | url.go:51:14:51:23 | call to Encode | -| url.go:51:14:51:23 | call to Encode | url.go:51:2:51:24 | []type{args} | | url.go:52:14:52:14 | v | url.go:52:14:52:26 | call to Get | -| url.go:52:14:52:26 | call to Get | url.go:52:2:52:27 | []type{args} | | url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | ... := ...[0] | | url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | ... := ...[1] | | url.go:57:29:57:29 | q | url.go:57:2:57:39 | ... := ...[0] | | url.go:57:32:57:38 | "clean" | url.go:57:2:57:39 | ... := ...[0] | -| url.go:57:32:57:38 | "clean" | url.go:57:16:57:39 | []type{args} | | url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | ... := ...[0] | | url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | ... := ...[1] | | url.go:58:29:58:35 | "clean" | url.go:58:2:58:45 | ... := ...[0] | | url.go:58:38:58:44 | joined1 | url.go:58:2:58:45 | ... := ...[0] | -| url.go:58:38:58:44 | joined1 | url.go:58:16:58:45 | []type{args} | | url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | ... := ...[0] | | url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | ... := ...[1] | | url.go:59:24:59:30 | joined2 | url.go:59:2:59:31 | ... := ...[0] | | url.go:60:15:60:19 | asUrl | url.go:60:15:60:37 | call to JoinPath | -| url.go:60:30:60:36 | "clean" | url.go:60:15:60:37 | []type{args} | | url.go:60:30:60:36 | "clean" | url.go:60:15:60:37 | call to JoinPath | | url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | ... := ...[0] | | url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | ... := ...[1] | | url.go:65:27:65:47 | "http://harmless.org" | url.go:65:2:65:48 | ... := ...[0] | | url.go:66:9:66:16 | cleanUrl | url.go:66:9:66:28 | call to JoinPath | -| url.go:66:27:66:27 | q | url.go:66:9:66:28 | []type{args} | | url.go:66:27:66:27 | q | url.go:66:9:66:28 | call to JoinPath | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go index 9d978553d44..f90f429b12a 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go @@ -44,13 +44,7 @@ func main() { var variadicSource string test.VariadicSource(&variadicSource) - sink(variadicSource) // $ hasTaintFlow="variadicSource" - sink(&variadicSource) // $ hasTaintFlow="&..." - - var variadicSourcePtr *string - test.VariadicSource(variadicSourcePtr) - sink(variadicSourcePtr) // $ hasTaintFlow="variadicSourcePtr" - sink(*variadicSourcePtr) // $ hasTaintFlow="star expression" + sink(variadicSource) // $ MISSING: hasTaintFlow="variadicSource" test.VariadicSink(source()) // $ hasTaintFlow="[]type{args}" diff --git a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected index 1e140bf28b1..b7c6f703cf5 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected @@ -10,13 +10,9 @@ invalidModelRow | io.go:14:31:14:43 | "some string" | io.go:14:13:14:44 | call to NewReader | | io.go:16:3:16:3 | definition of w | io.go:16:23:16:27 | &... | | io.go:16:3:16:3 | definition of w | io.go:16:30:16:34 | &... | -| io.go:16:8:16:35 | []type{args} | io.go:16:23:16:27 | &... | -| io.go:16:8:16:35 | []type{args} | io.go:16:30:16:34 | &... | | io.go:16:23:16:27 | &... | io.go:15:7:15:10 | definition of buf1 | -| io.go:16:23:16:27 | &... | io.go:16:8:16:35 | []type{args} | | io.go:16:24:16:27 | buf1 | io.go:16:23:16:27 | &... | | io.go:16:30:16:34 | &... | io.go:15:13:15:16 | definition of buf2 | -| io.go:16:30:16:34 | &... | io.go:16:8:16:35 | []type{args} | | io.go:16:31:16:34 | buf2 | io.go:16:30:16:34 | &... | | io.go:18:14:18:19 | reader | io.go:16:3:16:3 | definition of w | | io.go:22:31:22:43 | "some string" | io.go:22:13:22:44 | call to NewReader | @@ -31,10 +27,8 @@ invalidModelRow | io.go:39:11:39:19 | call to Pipe | io.go:39:3:39:19 | ... := ...[0] | | io.go:39:11:39:19 | call to Pipe | io.go:39:3:39:19 | ... := ...[1] | | io.go:40:17:40:31 | "some string\\n" | io.go:39:6:39:6 | definition of w | -| io.go:40:17:40:31 | "some string\\n" | io.go:40:3:40:32 | []type{args} | | io.go:43:16:43:16 | r | io.go:42:3:42:5 | definition of buf | | io.go:44:13:44:15 | buf | io.go:44:13:44:24 | call to String | -| io.go:44:13:44:24 | call to String | io.go:44:3:44:25 | []type{args} | | io.go:48:31:48:43 | "some string" | io.go:48:13:48:44 | call to NewReader | | io.go:50:18:50:23 | reader | io.go:49:3:49:5 | definition of buf | | io.go:54:31:54:43 | "some string" | io.go:54:13:54:44 | call to NewReader | @@ -52,14 +46,8 @@ invalidModelRow | io.go:82:27:82:36 | "reader1 " | io.go:82:9:82:37 | call to NewReader | | io.go:83:27:83:36 | "reader2 " | io.go:83:9:83:37 | call to NewReader | | io.go:84:27:84:35 | "reader3" | io.go:84:9:84:36 | call to NewReader | -| io.go:85:8:85:33 | []type{args} | io.go:82:3:82:4 | definition of r1 | -| io.go:85:8:85:33 | []type{args} | io.go:83:3:83:4 | definition of r2 | -| io.go:85:8:85:33 | []type{args} | io.go:84:3:84:4 | definition of r3 | -| io.go:85:23:85:24 | r1 | io.go:85:8:85:33 | []type{args} | | io.go:85:23:85:24 | r1 | io.go:85:8:85:33 | call to MultiReader | -| io.go:85:27:85:28 | r2 | io.go:85:8:85:33 | []type{args} | | io.go:85:27:85:28 | r2 | io.go:85:8:85:33 | call to MultiReader | -| io.go:85:31:85:32 | r3 | io.go:85:8:85:33 | []type{args} | | io.go:85:31:85:32 | r3 | io.go:85:8:85:33 | call to MultiReader | | io.go:86:22:86:22 | r | io.go:86:11:86:19 | selection of Stdout | | io.go:89:26:89:38 | "some string" | io.go:89:8:89:39 | call to NewReader | diff --git a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected index 98c98dbf331..31f709e456f 100644 --- a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected +++ b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected @@ -66,13 +66,15 @@ edges | passwords.go:34:28:34:35 | password | passwords.go:34:14:34:35 | ...+... | provenance | Config | | passwords.go:36:2:36:5 | definition of obj1 | passwords.go:39:14:39:17 | obj1 | provenance | | | passwords.go:36:2:36:5 | definition of obj1 | passwords.go:39:14:39:17 | obj1 | provenance | | -| passwords.go:36:10:38:2 | struct literal | passwords.go:36:2:36:5 | definition of obj1 | provenance | | +| passwords.go:36:10:38:2 | struct literal | passwords.go:39:14:39:17 | obj1 | provenance | | +| passwords.go:36:10:38:2 | struct literal | passwords.go:39:14:39:17 | obj1 | provenance | | | passwords.go:37:13:37:13 | x | passwords.go:36:10:38:2 | struct literal | provenance | Config | | passwords.go:39:2:39:18 | []type{args} [array] | passwords.go:36:2:36:5 | definition of obj1 | provenance | | | passwords.go:39:14:39:17 | obj1 | passwords.go:39:2:39:18 | []type{args} [array] | provenance | | | passwords.go:41:2:41:5 | definition of obj2 | passwords.go:44:14:44:17 | obj2 | provenance | | | passwords.go:41:2:41:5 | definition of obj2 | passwords.go:44:14:44:17 | obj2 | provenance | | -| passwords.go:41:10:43:2 | struct literal | passwords.go:41:2:41:5 | definition of obj2 | provenance | | +| passwords.go:41:10:43:2 | struct literal | passwords.go:44:14:44:17 | obj2 | provenance | | +| passwords.go:41:10:43:2 | struct literal | passwords.go:44:14:44:17 | obj2 | provenance | | | passwords.go:42:6:42:13 | password | passwords.go:41:10:43:2 | struct literal | provenance | Config | | passwords.go:44:2:44:18 | []type{args} [array] | passwords.go:41:2:41:5 | definition of obj2 | provenance | | | passwords.go:44:14:44:17 | obj2 | passwords.go:44:2:44:18 | []type{args} [array] | provenance | | @@ -83,7 +85,8 @@ edges | passwords.go:48:11:48:18 | password | passwords.go:46:6:46:9 | definition of obj3 | provenance | Config | | passwords.go:85:2:85:14 | definition of utilityObject | passwords.go:88:14:88:26 | utilityObject | provenance | | | passwords.go:85:2:85:14 | definition of utilityObject | passwords.go:88:14:88:26 | utilityObject | provenance | | -| passwords.go:85:19:87:2 | struct literal | passwords.go:85:2:85:14 | definition of utilityObject | provenance | | +| passwords.go:85:19:87:2 | struct literal | passwords.go:88:14:88:26 | utilityObject | provenance | | +| passwords.go:85:19:87:2 | struct literal | passwords.go:88:14:88:26 | utilityObject | provenance | | | passwords.go:86:16:86:36 | call to make | passwords.go:85:19:87:2 | struct literal | provenance | Config | | passwords.go:88:2:88:27 | []type{args} [array] | passwords.go:85:2:85:14 | definition of utilityObject | provenance | | | passwords.go:88:14:88:26 | utilityObject | passwords.go:88:2:88:27 | []type{args} [array] | provenance | | @@ -99,9 +102,12 @@ edges | passwords.go:118:2:118:7 | definition of config [x] | passwords.go:126:14:126:19 | config [x] | provenance | | | passwords.go:118:2:118:7 | definition of config [y] | passwords.go:125:14:125:19 | config [y] | provenance | | | passwords.go:118:2:118:7 | definition of config [y] | passwords.go:127:14:127:19 | config [y] | provenance | | -| passwords.go:118:12:123:2 | struct literal | passwords.go:118:2:118:7 | definition of config | provenance | | -| passwords.go:118:12:123:2 | struct literal [x] | passwords.go:118:2:118:7 | definition of config [x] | provenance | | -| passwords.go:118:12:123:2 | struct literal [y] | passwords.go:118:2:118:7 | definition of config [y] | provenance | | +| passwords.go:118:12:123:2 | struct literal | passwords.go:125:14:125:19 | config | provenance | | +| passwords.go:118:12:123:2 | struct literal | passwords.go:125:14:125:19 | config | provenance | | +| passwords.go:118:12:123:2 | struct literal [x] | passwords.go:125:14:125:19 | config [x] | provenance | | +| passwords.go:118:12:123:2 | struct literal [x] | passwords.go:126:14:126:19 | config [x] | provenance | | +| passwords.go:118:12:123:2 | struct literal [y] | passwords.go:125:14:125:19 | config [y] | provenance | | +| passwords.go:118:12:123:2 | struct literal [y] | passwords.go:127:14:127:19 | config [y] | provenance | | | passwords.go:119:13:119:13 | x | passwords.go:118:12:123:2 | struct literal | provenance | Config | | passwords.go:121:13:121:20 | password | passwords.go:118:12:123:2 | struct literal | provenance | Config | | passwords.go:121:13:121:20 | password | passwords.go:118:12:123:2 | struct literal [x] | provenance | | From 1323b3f06703132b818041a12dd7c8e18a445e08 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 14:59:31 -0500 Subject: [PATCH 26/71] Revert "Merge pull request #18235 from owen-mc/go/varargs-out-param" This reverts commit 4f8645b4dd5ae9ce385c21d9f6855be6071e69b6, reversing changes made to 22aaf74184fde980cf74db356b6202b3b8698ddd. --- ...-improve-flow-out-of-variadic-parameter.md | 4 -- .../go/dataflow/internal/ContainerFlow.qll | 5 -- .../go/dataflow/internal/DataFlowNodes.qll | 3 - .../ExternalValueFlow/completetest.ql | 4 +- .../semmle/go/dataflow/VarArgs/main.go | 12 +--- .../VarArgsWithExternalFlow/Flows.expected | 2 - .../VarArgsWithExternalFlow/Flows.ext.yml | 21 ------- .../dataflow/VarArgsWithExternalFlow/Flows.ql | 22 -------- .../dataflow/VarArgsWithExternalFlow/go.mod | 5 -- .../dataflow/VarArgsWithExternalFlow/main.go | 51 ----------------- .../github.com/nonexistent/test/stub.go | 31 ---------- .../vendor/modules.txt | 3 - .../VarArgsWithFunctionModels/Flows.ql | 3 - .../dataflow/VarArgsWithFunctionModels/go.mod | 2 +- .../VarArgsWithFunctionModels/main.go | 20 ++----- .../semmle.go.Packages | Bin 0 -> 1142176 bytes .../github.com/nonexistent/test/stub.go | 2 - .../go/frameworks/BeegoOrm/StoredXss.expected | 6 -- .../Security/CWE-078/StoredCommand.expected | 3 - .../Security/CWE-079/ReflectedXss.expected | 39 ------------- .../Security/CWE-079/StoredXss.expected | 7 --- .../Security/CWE-089/SqlInjection.expected | 9 --- .../Security/CWE-089/StringBreak.expected | 8 --- .../CWE-209/StackTraceExposure.expected | 8 --- .../CWE-312/CleartextLogging.expected | 53 ------------------ .../Security/CWE-640/EmailInjection.expected | 36 ------------ 26 files changed, 9 insertions(+), 350 deletions(-) delete mode 100644 go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.expected delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ext.yml delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ql delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/go.mod delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/modules.txt create mode 100755 go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/semmle.go.Packages diff --git a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md b/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md deleted file mode 100644 index 8244ba06994..00000000000 --- a/go/ql/lib/change-notes/2024-12-06-improve-flow-out-of-variadic-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Data flow out of variadic parameters now works in more situations. Summary models defined using models-as-data work. Source models defined using models-as-data do not work yet. diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll index bbef53935ad..9f07693b7ea 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -66,11 +66,6 @@ predicate containerReadStep(Node node1, Node node2, Content c) { ( node2.(Read).readsElement(node1, _) or - exists(ImplicitVarargsSlice ivs | - node1.(PostUpdateNode).getPreUpdateNode() = ivs and - node2.(PostUpdateNode).getPreUpdateNode() = ivs.getCallNode().getAnImplicitVarargsArgument() - ) - or node2.(RangeElementNode).getBase() = node1 or // To model data flow from array elements of the base of a `SliceNode` to diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index 05283454cff..cc353ab64df 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -845,9 +845,6 @@ module Public { or preupd = getAWrittenNode() or - preupd instanceof ImplicitVarargsSlice and - mutableType(preupd.(ImplicitVarargsSlice).getType().(SliceType).getElementType()) - or preupd = any(ArgumentNode arg).getACorrespondingSyntacticArgument() and mutableType(preupd.getType()) ) and diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/completetest.ql b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/completetest.ql index a5dedbeacf4..6bbf16c2020 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/completetest.ql +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/completetest.ql @@ -9,9 +9,9 @@ import semmle.go.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import utils.test.InlineFlowTest module Config implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { sourceNode(source, "qltest") } + predicate isSource(DataFlow::Node src) { sourceNode(src, "qltest") } - predicate isSink(DataFlow::Node sink) { sinkNode(sink, "qltest") } + predicate isSink(DataFlow::Node src) { sinkNode(src, "qltest") } } import ValueFlowTest diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go index 84e76965980..8e3a498656a 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go @@ -4,7 +4,7 @@ func source() string { return "untrusted data" } -func sink(any) { +func sink(string) { } type A struct { @@ -19,10 +19,6 @@ func functionWithVarArgsParameter(s ...string) string { return s[1] } -func functionWithVarArgsOutParameter(in string, out ...*string) { - *out[0] = in -} - func functionWithSliceOfStructsParameter(s []A) string { return s[1].f } @@ -42,12 +38,6 @@ func main() { sink(functionWithVarArgsParameter(sSlice...)) // $ hasValueFlow="call to functionWithVarArgsParameter" sink(functionWithVarArgsParameter(s0, s1)) // $ hasValueFlow="call to functionWithVarArgsParameter" - var out1 *string - var out2 *string - functionWithVarArgsOutParameter(source(), out1, out2) - sink(out1) // $ MISSING: hasValueFlow="out1" - sink(out2) // $ MISSING: hasValueFlow="out2" - sliceOfStructs := []A{{f: source()}} sink(sliceOfStructs[0].f) // $ hasValueFlow="selection of f" diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.expected b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.expected deleted file mode 100644 index 55e9aed2e93..00000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.expected +++ /dev/null @@ -1,2 +0,0 @@ -testFailures -invalidModelRow diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ext.yml b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ext.yml deleted file mode 100644 index ca3f9559536..00000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ext.yml +++ /dev/null @@ -1,21 +0,0 @@ -extensions: - - addsTo: - pack: codeql/go-all - extensible: summaryModel - data: - - ["github.com/nonexistent/test", "", False, "FunctionWithParameter", "", "", "Argument[0]", "ReturnValue", "value", "manual"] - - ["github.com/nonexistent/test", "", False, "FunctionWithSliceParameter", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"] - - ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsParameter", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"] - - ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsOutParameter", "", "", "Argument[0]", "Argument[1].ArrayElement", "value", "manual"] - - ["github.com/nonexistent/test", "", False, "FunctionWithSliceOfStructsParameter", "", "", "Argument[0].ArrayElement.Field[github.com/nonexistent/test.A.Field]", "ReturnValue", "value", "manual"] - - ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsOfStructsParameter", "", "", "Argument[0].ArrayElement.Field[github.com/nonexistent/test.A.Field]", "ReturnValue", "value", "manual"] - - addsTo: - pack: codeql/go-all - extensible: sourceModel - data: - - ["github.com/nonexistent/test", "", False, "VariadicSource", "", "", "Argument[0]", "qltest", "manual"] - - addsTo: - pack: codeql/go-all - extensible: sinkModel - data: - - ["github.com/nonexistent/test", "", False, "VariadicSink", "", "", "Argument[0]", "qltest", "manual"] diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ql deleted file mode 100644 index 873143a6f81..00000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ql +++ /dev/null @@ -1,22 +0,0 @@ -import go -import semmle.go.dataflow.ExternalFlow -import ModelValidation -import utils.test.InlineFlowTest - -module Config implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - sourceNode(source, "qltest") - or - exists(Function fn | fn.hasQualifiedName(_, ["source", "taint"]) | - source = fn.getACall().getResult() - ) - } - - predicate isSink(DataFlow::Node sink) { - sinkNode(sink, "qltest") - or - exists(Function fn | fn.hasQualifiedName(_, "sink") | sink = fn.getACall().getAnArgument()) - } -} - -import FlowTest diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/go.mod b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/go.mod deleted file mode 100644 index cdb11f2ee6c..00000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module semmle.go.Packages - -go 1.23 - -require github.com/nonexistent/test v0.0.0-20200203000000-0000000000000 diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go deleted file mode 100644 index f90f429b12a..00000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "github.com/nonexistent/test" -) - -func source() string { - return "untrusted data" -} - -func sink(any) { -} - -func main() { - s := source() - sink(test.FunctionWithParameter(s)) // $ hasValueFlow="call to FunctionWithParameter" - - stringSlice := []string{source()} - sink(stringSlice[0]) // $ hasValueFlow="index expression" - - s0 := "" - s1 := source() - sSlice := []string{s0, s1} - sink(test.FunctionWithParameter(sSlice[1])) // $ hasValueFlow="call to FunctionWithParameter" - sink(test.FunctionWithSliceParameter(sSlice)) // $ hasValueFlow="call to FunctionWithSliceParameter" - sink(test.FunctionWithVarArgsParameter(sSlice...)) // $ hasValueFlow="call to FunctionWithVarArgsParameter" - sink(test.FunctionWithVarArgsParameter(s0, s1)) // $ hasValueFlow="call to FunctionWithVarArgsParameter" - - var out1 *string - var out2 *string - test.FunctionWithVarArgsOutParameter(source(), out1, out2) - sink(out1) // $ hasValueFlow="out1" - sink(out2) // $ hasValueFlow="out2" - - sliceOfStructs := []test.A{{Field: source()}} - sink(sliceOfStructs[0].Field) // $ hasValueFlow="selection of Field" - - a0 := test.A{Field: ""} - a1 := test.A{Field: source()} - aSlice := []test.A{a0, a1} - sink(test.FunctionWithSliceOfStructsParameter(aSlice)) // $ hasValueFlow="call to FunctionWithSliceOfStructsParameter" - sink(test.FunctionWithVarArgsOfStructsParameter(aSlice...)) // $ hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" - sink(test.FunctionWithVarArgsOfStructsParameter(a0, a1)) // $ hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" - - var variadicSource string - test.VariadicSource(&variadicSource) - sink(variadicSource) // $ MISSING: hasTaintFlow="variadicSource" - - test.VariadicSink(source()) // $ hasTaintFlow="[]type{args}" - -} diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go deleted file mode 100644 index f23bc1d0481..00000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go +++ /dev/null @@ -1,31 +0,0 @@ -package test - -type A struct { - Field string -} - -func FunctionWithParameter(s string) string { - return "" -} - -func FunctionWithSliceParameter(s []string) string { - return "" -} - -func FunctionWithVarArgsParameter(s ...string) string { - return "" -} -func FunctionWithVarArgsOutParameter(in string, out ...*string) { -} - -func FunctionWithSliceOfStructsParameter(s []A) string { - return "" -} - -func FunctionWithVarArgsOfStructsParameter(s ...A) string { - return "" -} - -func VariadicSource(s ...*string) {} - -func VariadicSink(s ...string) {} diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/modules.txt b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/modules.txt deleted file mode 100644 index b62dbf8819b..00000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/modules.txt +++ /dev/null @@ -1,3 +0,0 @@ -# github.com/nonexistent/test v0.0.0-20200203000000-0000000000000 -## explicit -github.com/nonexistent/test diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql index 884e67cfb06..78e21d534e0 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql @@ -19,9 +19,6 @@ class SummaryModelTest extends DataFlow::FunctionModel { this.hasQualifiedName("github.com/nonexistent/test", "FunctionWithVarArgsParameter") and (inp.isParameter(_) and outp.isResult()) or - this.hasQualifiedName("github.com/nonexistent/test", "FunctionWithVarArgsOutParameter") and - (inp.isParameter(0) and outp.isParameter(any(int i | i >= 1))) - or this.hasQualifiedName("github.com/nonexistent/test", "FunctionWithSliceOfStructsParameter") and (inp.isParameter(0) and outp.isResult()) or diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod index cdb11f2ee6c..ed18764ed28 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod @@ -1,5 +1,5 @@ module semmle.go.Packages -go 1.23 +go 1.17 require github.com/nonexistent/test v0.0.0-20200203000000-0000000000000 diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go index e8d53eb9b28..c561de0da2f 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go @@ -8,7 +8,7 @@ func source() string { return "untrusted data" } -func sink(any) { +func sink(string) { } func main() { @@ -21,17 +21,10 @@ func main() { s0 := "" s1 := source() sSlice := []string{s0, s1} - sink(test.FunctionWithParameter(sSlice[1])) // $ hasValueFlow="call to FunctionWithParameter" - sink(test.FunctionWithSliceParameter(sSlice)) // $ hasTaintFlow="call to FunctionWithSliceParameter" MISSING: hasValueFlow="call to FunctionWithSliceParameter" - sink(test.FunctionWithVarArgsParameter(sSlice...)) // $ hasTaintFlow="call to FunctionWithVarArgsParameter" MISSING: hasValueFlow="call to FunctionWithVarArgsParameter" - randomFunctionWithMoreThanOneParameter(1, 2, 3, 4, 5) // This is needed to make the next line pass, because we need to have seen a call to a function with at least 2 parameters for ParameterInput to exist with index 1. - sink(test.FunctionWithVarArgsParameter(s0, s1)) // $ hasValueFlow="call to FunctionWithVarArgsParameter" - - var out1 *string - var out2 *string - test.FunctionWithVarArgsOutParameter(source(), out1, out2) - sink(out1) // $ hasValueFlow="out1" - sink(out2) // $ hasValueFlow="out2" + sink(test.FunctionWithParameter(sSlice[1])) // $ hasValueFlow="call to FunctionWithParameter" + sink(test.FunctionWithSliceParameter(sSlice)) // $ hasTaintFlow="call to FunctionWithSliceParameter" MISSING: hasValueFlow="call to FunctionWithSliceParameter" + sink(test.FunctionWithVarArgsParameter(sSlice...)) // $ hasTaintFlow="call to FunctionWithVarArgsParameter" MISSING: hasValueFlow="call to FunctionWithVarArgsParameter" + sink(test.FunctionWithVarArgsParameter(s0, s1)) // $ MISSING: hasValueFlow="call to FunctionWithVarArgsParameter" sliceOfStructs := []test.A{{Field: source()}} sink(sliceOfStructs[0].Field) // $ hasValueFlow="selection of Field" @@ -44,6 +37,3 @@ func main() { sink(test.FunctionWithVarArgsOfStructsParameter(aSlice...)) // $ MISSING: hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" sink(test.FunctionWithVarArgsOfStructsParameter(a0, a1)) // $ MISSING: hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" } - -func randomFunctionWithMoreThanOneParameter(i1, i2, i3, i4, i5 int) { -} diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/semmle.go.Packages b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/semmle.go.Packages new file mode 100755 index 0000000000000000000000000000000000000000..e3880ac8d5d9d893c3ee41a8c4aafe2702f1a859 GIT binary patch literal 1142176 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�MD|S##F~b&+)q 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

q}H7R1tPs&LZJwhx4uZ%vC`ArbuAE) zdr~b#TQp&;3V-vn>Ql4|g1|hv@x`W|tku+G#J|1w+9syEABzqJd#Y$M@MjB^Ij!`H zKW&S@20Gi~%TmRkQSm_(cNde%_HW-^yzaJTZq?b()98#l@y2BOG@JB2jT)qceo~$L z5?>R`B;Sv->ElxAla&5TzMA^u2q%(G?v?&2A%1Fd;MS_=YoP((hbF zIwC3Yv%Pf3raxh+`o*dAyS?;En?BE`fAVr_{9gKWn?B95oYFO<3oG17UOM61t9cz~ z)0d~ppX8+zJxb}rZTg=DKVgkK$V<2WYwkYUcQ4hPO|c{0aRHKNY~;M51As94@zrL0 zf561CyjG68&eB@LVGM;DfLy@uy+_J3anXDE@?8$)9jVRUO^Ie{`}K z4b>GJqWsE7?6sbcau@cwALpiJbo#dQqkjnGhkW8a;?Kt;^BFTgBk$Euq~KBWGx9Nh z@VB{K^~>KYZw?=fzt>GXxC%K08>om=v1zkTZGOgm36f*jcDrd1jsYS~_$Ok&$!IJw z*~*mdch#t!cu4sN`+krtKTHXKp?u~Zh}BqM&Te0UKJLAlqImN(e&XIp6cIMjuEj$KxBLH!|D-c@yZO^o z40Lq6neGxAakpHToG$l|`;t?2ZE7di&d)yu-@g8hG2d@EYlMD*xzF_P^bZ;3@6T2L z@`f^W(XV`_Aj3Sf^<{G9D%Y=>Kf#Y=zC)AY*y8Zf-2I0Br)7;wTaHhh_~$fqKIH{1 z#88rj@NmAJ0%I@!DA(M_bv9?TyXECS>sdm|b^6-AEo3$zjldk?iWAT*1cPF@v_iP- zwLbgH;mqt`d;x#f-4+LzpH2`C_R}#77G95hAf7~&!i?^0PIO3nVqCc5g-g{s=iIZ}P0bk0&TgmL z-7M0?8dLG%s%HR|3RYHm)^-KMY$M(U-paQo>%iAkz1zlaOEC)Lde!lU`|=w=vLl5* zeKl)Mb0HJe^vGjrvyPKrLXS)ltb)T4AXaD=c*rPWc7S`sG z$(5}h4O}XVV&X!){fSCBpp?a!J_~QToyO9p0az6r2M4pF+*ALV$@0K><^F<2uG^}5 zc{h6|-18M5^}F@k)r}yYuq7))oH5os62}V@urCyNeZJGHV9NYUOwtE}>$ZnVHUtBE zXMdldvZd86L&kGbh>L}~8ea?s+Gf{uRG-<6o%j6xi9cxml#`fkn0d)q^0{0wh-hof zx}Q6-tTOH)3*r8%2(CS&;ZwW2eY5sA+uhCl0xmtiZXP>1;A46U0mj*|bN&UoBP=yg zMT52GYOlXFCF`8PzS-At4=(-9_4?b^_*eDM39Oubeovo&s+@S^eO-SKbxPP->gg=! z=ka0&-eXMH-f~CV-s;mR9$T&bQTY*ZF`v9_{X~2L z`*RjQtpAJb`j6xt#XI&@xf%O;bZ7lT-QAi+iF2rkYMz>62v>l&PT!s@QUonu$(g>v z_UADBbGUxOZ5a{YKgikX8^}9iyXx7>hnSNQ$=k;R{o17WA?dNH8Ighyc}~Ypk@s@1 zk6V%-U)0B}^jIa;uHo5itQldAIZXXLY2H|3ozJBt`wh58+wVpQmCc2KjK~SR=I>SnfDI@O=nMPQH8kJfo-& zaf1tuL~d6ak{nD(ARyh zL(jf(5YAwSYsUwB)%c1fztCU(k$*^ZF!)(;>$JSI1xGb4U83PN3^z9K2&_!G!UW#x z^#pk=ZH=}_8PK?#XzODt{%kt5Sj0HC7!@x4wgA(t6SqYfaHOZqg1*)Fmj|yLk|kx_)c~`7N5v_cpotg+v!%c;1#6Az=l~v0wX(knw?v+!3|<@kGGlBKbutl zqLpR{Px0ozQyY1#r<3VE^2rE(N^sqN%YWyiCL#Cj*6973V4~bN3}}@-4`FWEQ+zQl zJ_W~83uX#^IKW0(UKT~94BuM?u93Sp?u*;%%m zv$yW-LXBB&qEXyM?UXWejel=VJg%Nr2BSl|xUy+06^Eh^xct=M0}_2;FVL=zj{FX? ze&p@y5+doqy}ClMRNbB}{bV0GRCT2jo5Z5=>gGdf)S{4#$+h@K-|>iv7~Z=%aRQnX zU$D)&wz*G`u?}d?#n5)}mWq3|3Kth8t16i(w0!s5zv#N=C}~&%-qvh z%o4E+I~FP*;3k*iI1SYa|0CR+Zxk&E6&2w13~_>D_p*Ym|CxGl12_;?Kp(Z=(d1Q= z`U--*1cD8wcK6%gf@rw=2nQa2^J|%i;5Yl*z^+uZ6%L?3^3i$!FoPdX;IldCVo9++ z6uUDG#X*t&OFkp$dDT+AhWry&I_Wz(*q)1j5%N^oZg(YHOg-hyT*|_T5yNns`2srT zQPV#ShFMao(L~JoZ`{9hJ`IPJ1C)kdoY2lc=Z`i2j>Z5Y^G724+!=`4^WZIziw2(6 zG@g;Z@A9mFMjpRNnP!)hDLkLh0}Z1LQ7E>W5CwXkAbXTgAhf6vV~Ql5C3!i0Pj??! zf+3Y0Y-1@USENB|W9UkGh|w|g90 zQCkq`HQ(>Q_nFBAvArLynRCv5uf1M-?X}l#*=E~&2Yt)@X`(u1li{@%@sv9#ZcMP1 z(k)WToGDe=kj}+x_+%^iu_}1>Y*moyhk1M>ll;-4CRz5+Po4d945AGCrxOdmEN@r0 z67DxX@gIM*D%D@!&`-@D`H^nkeE?6b^tln8^FA=pa#?L9M&iZik^?I{3fvq1@$W$N zVUoh}QLlFpi}}qVVWJV>N5k1kV#pHJ>{Bf`19!|-rbJTrBuG>4-hY00?AD7C0}JXC z?RiCGiM9W_;==}RKbMSP2zWU|J5SsLBAGH?Mv^}b?j_@gDXQ{ z3+MM;kC_Z}wmnF{qYuJjE{Z>}E05PH%Vy5>&#%_D|AXz=^TmH?xv{-w%>~5>nq#NL zXJR1Yd{p({nv3faHx^8({vgn~kxtkU>EXoWHjQLX((L@Q!-bF+|86_!>6)bIVUBsr zB8iNZpa5s_8I)+G0m1;S1P`*!R+wP;l9vj~5QlgGg`RG|WoUlO$AKrr`)-=;#c#%L zzo!}UK!gw`Y409f&Ng`YpQ^q#vx==0i@BHpO04Rl>f7LriQ=bD0o(Q-<1)}iDoEdN z22IG%tBYM%K7sQIH#w!|G1!h(h)zLyqGJ=xSnVuxzRP170%m1g!ow(tR+WAl#u^F(NB-WOOH^5OE zt*)ARB2mKN4EVvKNHIiLc$@uMiW3H6t7Fol>fm6C?d4U`87rd%lu0dO8g#$NY zB`Ya@DbG5FZTvVAIE_FR`w=^N^?}Gnac*{w1CgzS9bR+^Hy+(uF0VtXQY|+BrbvNp zOm`T?>=Q?<^WCS|_Ie0u@6JeK^dr;Q8m$j>AIW`!pdVY9bg;c<YPntKrfALaQ$&|X;P9+Z`Ug*DeMt1bRr-R3Wlj%W!IU)A{B(!^PXAUt)8PMiZpT9-x%ALYJdlu*KE1_NwmaI!<^{Yyn|UW=|~HDgz2i&Edt)r|VqPp#v? z%`)L;iEy(7I}`s+a`t0r-?m-?{^3mVJcCMa?h~-!H}>P-JN$-$NaRSqb}%ItZumb> z7G$xgWg(j$jLmDn21UYqxmJ;#T1rW^fb?6-$j^nEKZSc>PH{ch@;?I(p2mUYt6^+x zF_hj^51Qec+Pf(}`f{GFep3BhpyLk~Go;1=g@!(*&C>UZ`<>#};1oCZg>$Yo_7Y3% zCJk(`(j0C**)W9nDP6Wg(`c(G%@4D+2a$1(6QSMbp$n}*aTrK+HCn;Yn2ZE=e$9&M_z$20fhD8Ne_n6f z_^NbVbp`wN8Yf@M%x|3NxHa3#k6g+qvs_Jl!nTz8t1JJTrzx*R80F8Q{#?F4%-X{< z`e-tB;0qYPPa;--zOp}ki9?*rRJ!#&*DRrbPT(D$R&$!BnDG>8Sy?3e`>V9C5<^Kb ze>q*bMWdod!DrXg5aj)R1bNVtlRw46xqdplYFx!FrDg%`$BXOFvjNsR6lg=PPmoIK z&q+q8{D7ZixM#_OBKjtr4|idBQ{K*y3~1~O1A#SGQ$7pT8&`|ZwGKIyBq)%MIO z{ITbU&3z~ptHg+NN~p*y(4<*)T5s<`iRR(|_U&i?i}(nECI9|8_^~Gsb7JhHk4y`K*DH`%V~dOrMP=b$gwoBXs7>pq=91#~I!E z&V*xFFl=~A;Q`O`gy!3jOp9)zZEUqD49N!tj9BUKZSr>Qcoe?Ov;L84nNa>_Yu~wb zIcMAS0iU||2W<}JDgHUxsg7yZ7C>yVlG2zQkgEx8P8#mOdoc`KqO4VF`mAYDU9k z3G=C@EB4Fs-TF=VzgW6tkc}s`z~{=F;g){{qCdf$l==AaaQwgK55tYBIgt7bVjBC< zz`z|}r5=t$VIT-}Y~ZUGZJUD*-@Zy4_j$w*+nx?AONvc%^59;31VLBL7110={)cR6 z|1C-R=~8ppI;{a+M|2~ma(D?{(ww+$tAyun3D4cc)D{4~#eWS&kvNp}ussoFoj)|D zXj?;GbETJPXaI4l$7nJ5hQ~b~ZB9EU4D@yEg&*7!{N<_g9V(A2vrIAi$E>sg0ab02 zP?_5F@}}}J2<2nHs$6+Rr&ydgg;Oh`%k4p~kZuv~>9S%tw$2RsiaPHPGVy?|7J0w@ zY<<4hPC_JpEf&Ow%ePW_3PlrR+#uX4y*2F5N|UlAsA%%NVR@ZPuf&1m{vLg^28H9cX#riWYmJou)ikZ{w6((KYwyf zd@NaEZ6y;Uy5J8-dHPi!57Bw|oc$)Z^Z%kV;b>b~9vXcjROaR)QGEYsSt6hECtFU+ zJ#@Pd6s{%;R=9!{nSxE9D|pu-3f8tWe}Rs#S|!NUm8oFN=PIbrsleiY>LitmUmdg& zyS#*5JexmVC~m-bAJOb{YGoC_gjf0NG))2rMf6#Du^)LnYV?&h>%9(9IeE=gD_aWt z7s|8v{0kA3N(J0opJeqNiA^o4k9#Fk!0{=a+ZVF0l%9w=>{88glK{MtlC^txhG(wj z>MC>h3T`yP4#s zS!nizw5G+sYL05~L5xzj(~G(@fq5+_>+wNGhJVCJJulbu=Lv)si=~;>~P-96tRTrN+a7zBhy6UdL?elDZrkABT&|bKxi_&E(eHo<{uA}n~ z^qDN-HTEOC26h=J)c7ccM0l2du93>bFvMHU7MvN#@yw6NA>xz%WYa}{3j1nzp22fP%a;3@Ez zDk-+-MB)t<_2ah9B0lJ**3-G^+0&g~e}oS)vLeew1r0iA4R5DdLm3zAQ4e)^sso3U zP$;+9HduyM@41nnJkn&R;N3s@d*gLXkCBp36vEPB3$3 zIS7Nq>K4+WNr+f!8xxqzB5~y3rsi?=@k>fDtJ!;@j;qIgzdm+V38v)#Vc>x%r-$;U z#UtBF*ng5<-4ZerucKJ z7k6p?Q|DUIMOCRYGf%dQwlR&fGIfj+2-2b#+qX2ArR}y~GNXlq;Qv!P%pc`Y4R9X2 zX#ipzE1QjGNOoNQV8nSnNU;IEVaICCk$LZNM-%{%S-PsPFr?7(^y_6i>^ku=54tHUG)e ztYr1Rc{7>O%m3(T38ZCYsShn0TT(qoq8lV5B}=LcPXd9bPVm>##8uDIod8(EG3cXH zzf={rvLD+gofqQ@XHYo^Dp!EY8yzYiD+MA^_>j=Ts)Av5tCD?Ez#OwJ7b8+bsjg4S zaQxrSQS^f*@&88g|3=OD90`y%9UzwV(Mo?+JDcTl5tmy#{iFJ&*3sPIj^p7Vu1q}~ zCNU(OXbABsy$g=3Xy2+Xy1r>0+YH;@4@bMWhIC)it^aMyNAQpPEvxywd0f#rg0#X1vyn>Q56=v_FxierzuqHaF_A631_nVNusj*Kv=Ua|;`@1rK$T(sL zp74K(&)1D3?|`KDG|BAFkSBiwQ8)1I%Q7>}A5v7l*mfif!ME;`eUP%L}T>aD2KwBGYlX zTEOJ+ARUOXd)Ng3w>we;@>(ycufDb{(0Ma+!3~(#Ut7E9+58rk;V?mMn9c@HRdoOm zp?qgKy=M;@Qv-{V)QuGJ@-KzK^grw&q-cP1a(!u6kxV;F2D-`*Cwk+Q*ekU!y|0^* z2L_^I4Vs+B+Q36E1fqBFdQoCT5L}afxSfmLW3SYYdplCSeg2K$-MK=(HuY)_y_yh- zy@MEz#0={ji+9bVE$aNvj?>4UCQWLixp5#Zfi;c1oh$CrAS=;>G{{U(sKqmfgf?A@ zJxA9VH_b{$_Z7?=Qip4HirwJedT#a^2AN=?Nij9Bxs6;6hFSIv^O71@jkaKHOKogN zICelcL#w?^Gmi5JTKSUn{UN4_3KvZ0rrWpuX{miuAPxsE+@AWCxXj|UdasXPKfAu* zdV4=sr274NJ(2jS^__odK0X|uQsUK!-&&b9VqRl7cG>KFhUH6M}hz0y!Q%T{rx>_xg;9L z1-7%(KgMmserF{x6~70&=f4L#b@lfwYde<*$I`53^pcfK=5G@PW{U~xGtdMjwG@NT zgarSp6h|N6QEb9uLowH(>k7Ws^s|y4Cb3n5F;+L+=3ig25$vX`!ANzea{dKLqWhoV z6?h)&B(C}GR-pe{yZ=@D(%USAwzZt_FM6;Z9AkMkyFT#ijS)g&(@QYdu6PK*-7GL~ zHKz!e|9m71g{%KO%T+c@M(;yDp7b9e5dK;C7gY6=j|VgBsXxg@po5w9^VyY?W7LwL zt@Yqem1HL-UH<5n`Pa?c*V_BP5l!X(@@Xrrb0ReH8@neNdjsgYtY?!TFl%lchCj9+LE0t*UVs1KFMT(V8;e6rMv7(R6{T?5Z!i6VmI|hiQ zcBe|b#c$z&&ZgSq#7*Kr3yWdmKi#cI$`&K3xcnIhHP`Dmr*w3;4BTB;G$8Q!mDfT~ zy07Mf60hJw2$)}>8v?qXU5)!skn@~K?Da_O#k$y^>Os91AL#96J>MYQ;t$DQ{3yvw z5F1y+#l1f3+ms$LZz9vQzs&2MRN|JK_8u{|X|zDwZBD$@&FJUb{M2b}*P#+*E)p^G z?TgeGgifV-q~4meK9Ze#G+;4LT)_wR$rN91lis_RBrU-?Kjf!XnvX8CX{X0Y6Hu&v zWfu79Rc4z@AE$J%!B4-2bo01t@i`?S!e~r<0M=1Oe0g4pPM{>F!zMN4+;6dfZ;E5l zcfZ9e50cdx2t%A-n_zpjRCdl2$ZHI{B>f`BkTnrzuON?7Nt2u}ycB>>VLw7M z8npbEBaXazR^R5xYQwcofW{la-5FxvthYecGIN(2N)-O>JJdXs%8-96Y~8HZ%}4BX zlXwMTE9}8hfByaS2D8njm)=J@#GILbKixBzTw=@r{ch5QTdw>$etO7^cj>)}e)W$e z-L(1u2rlzx1|DZybM(tcYtv-nEBdK^bHOUB0=$C^2uCxwA{wN-(XWOUP`Jk+bmHnZ}~L` z0qyK%p_%6nXgN|#I~Gy?vLWFWDJZZ1Mt?YmHGWt6RCAJR?&r&>Q2f(ORE0@fp^UHA ztcMZ+epGJ@EGgIgfkcqb+)-X)PP zj4>zAyu|F7FWD9(qJ3=PstiI1-~bYV_>-96s>+F{|RA|k9&8zNv=>Hi+c*N6wNQyMg}653vlvkj45?ZPtTM!ov zX9MvOX}6CotGwvjG`P*GQ!l;Uv9qOMcTtIr{+jjX$zS=1Jb3a~t<(h5R1Q;rgCX==kH0 zNB*D$W}&C^b!b~~*%EUJZHtnMU_>S9pSlK}eEBw9g*H6FFC(RcCM-!Ef`o_PNn_t-$+I6zN|H z5h&S4V91SR8~sb0ZN_tYE@3R(4DtH>!}NANDZD+`dLDnbwhr}r+1lYkT5zf)aZ{FTP695zdt{a@$oK(W(Ubx1i3llQUO<_#?<=mPwbPjVgJu zbeRPg+Vr1xkZxJ|^?rJ#LVe+%Ig(^)>(@p{0ee_!P-Lw+C8&nU3yTK>7~0=VB<`ZHc5>C;n%myB=Cavv*GHyyO} zun4L{oehv#BVe54VP_@8OYJI|+iP(Gmj1G9;ZRK=SB$PT68 z5e$YlcCk4|zl!I+Y>{+hwEH?c@j~6NZuF{OTR2pHkej^fEsI9_HTI~$;eG+7?$bHn z=QumUp#g)8TCG1`Ai{By*RbR|D{A1PeVOt;#y{s{JX5x4lXr*34O(5R_io;0^Exyq zaP)Zw@(iKeF8ah5hd-J1Psgr6CwFfFSPwjE2+0+)b5j;1-8g5{UoLOC$-0Y)g4Vwq+=m{7~Oc`rOSY2y$a<0d-lnKy$^Jd{mbn zbx@18Za_~BohXz}8?pEewjUlTpQ8?JR|mGIkI8hvZ{2=|Su}1ZE1_!44ciZL3$>^= zhrgHw)IDSpPN8=?<@nUvHWbiB<2hU3m>Hxuvvk-|kRTUU`ps^o96sYEr5|n+YBX+3 z7wPRS`&LpsWV^o35LdgZgg@7bN@u*o)5HyA36$)o{Ht|=60mH>I(}hnSFPpuW!~Q; zTj9@aO;@d_?sd_cvSTc-m;|+b3|m39VQg53^n&XMFAK{X?Qk3P39BtHkP{JDLSj2G zj!TgFb_?$+j2*JQcM_W@aOJxK;+q2E1~2+1Q~pnT#XOGMwNSWSgy9DR?3bV)z#Hqxy+Gn8}&h3VMR_kl?^y?aq6{e9^_;!m#p zE)GmmetkAw`jIU^$Ch8?$}h>LKkApSbmdpL^093CvP^kvzcUM5`Dxko>s@-`^sSmU z(1O`&)Z}5u&UiF-nL0PDtFy(voT;|aRJbZ9XVZ@Mt9w1>aqy+Tk{tt!zU8ik-KUtksPhebe=_@kn=*Og+H1lQt zbY6zXilMe4y4xY?610Hqt0uT;spS4u_xK!EPDv%HNBe1$j=!8Lxz%rfOa}+(Lf)df zXw9x8I0L?DygUq9Esjwjay@Wg(cLon=y_=T2oQ1v+7(uj%offepL)AoK+m60QWr_Z zC*Df+@ijrZP#2GCsZke;>a8}mulvu3*N)#;7wefaeq(KSYVeft-LE!#mP7vHh}-ZF-qe)O33;iYd8a(qp}hG@5x56%G@J!I{L&Cw0yv>n=1;?JgQ6c z`P=GWG&7uCsUjT;|BCgX-Hn4o z519x&_*j(=o9a;MI$asnP0FuG8NZ$SReoSce%ilG(+{2!f2^J9b@lIAbeu;-WvoVc z);_jc2~^h;>ga8LP4atB;5#qy4fI_sh0TeV?v~*${&66FKOeO|42sji051cjXFY$A z6mVQ$nS7RCF9kegC@b7i0#v0Oo1gCgte2Bq{@32-Z^z!$2ZejzU)Sk7FM(@J& z1xBlAmz19HoY<_BpRaA!^Htk`=-T-Off593N#SqY$8P)a@IcAh^l&%FPK7`uT~HD| z5BCmvI(hMnLcacDCu);~nbk$m>a70Kr%h0K>9=gT0%+jfALO3n_GuSTf=`m z&01o{Hv8fQo=lzZ#lKnyQs{&d&uH$?jU8KYhPZFqX+tfa=JyA!*%YuEmJ{I6`Y=VxLS5*EqO3jGKQyXnkD76$OKD`0dwmJ=WSmom55 zDKo!4+X}y{WpX+~*t`}&Cd{uit7>dgkyMP~O8S|fR3ZDHOB{UT z)reS`F23k~`zUW4>&|sKG-~7YaChIOQdlR0eLKuBnggmh45_+k#vM~rWiHNi%~}9D zB(iM#+%cGIMFJd)n;9g_3f8xqKI3Tlfr6G%vldr{KaLb(#f#HOmi{XkIKXDN zf_dK?ve`%5wJ3F6WMAKxy^mq^%WglT-Zxqdr^q+X%C_*oD8lJDnApEk(g=XT_&0EVJob25`6NK&9)ns?=6Z!v{LF(X;qLz49+9?uI>& z4CWgTg7K=qi#*&P2!3QI+kCJT0~cHQ8GXpfA31H%za0CLSO$A_iNXb{YrtT$pv&e3!BxC_;6fgtR+Q8wZtgG=ENJ|JUCrpLy73TgX~i{k-qSfMspU0@>ThtkewX8 zJ(~B`+Oc^?f82?z0(5oDe?Q--7LaOf9EwtQTTSY;IgHVXXAxiAAEFzd4S?G3{B*SD zrXirU?stxTMEHXTj^oPM01j67@W3bY5VUBacncrQeSiC`cSGSK9*J*Sct?cexdTdd zG3=?Th1)V?h1ZkFX_}d984|&gS!O3{u29*lASf>ZEE2^RkZ8h|$_w8fsr;kk-F({f zAn>K)SJ|cF+hB^V7BjR_xSxjbIA1u~vciFu9Hj@1-_#M!&xJ`b8ATz(X?(Er<8| z@WH>-%C3I#d!!pRsK4IQNcpK9pzZiQ<9qRYO4rB@>@-xe*cOHIU{fY`AQF4c%*DE* zRYj$j&k1b`+Wna~9Q)WC z_gT7-U!q`i?rDjeOSJ^(+Zj$wz)|DeW7*%^YxD0Qj-m4JV6%h8=<%*6uEidl=kV>a zow7YiRm1%vtOp2rsGce@MqIy-SgD)MYKX6($PJLc4fex`K@wCDfKg^<_j6%Vjb*9d zeF20W{$X+!{#6M7g2KNbHNs@rQKiO^x#D!`l7-(nT6j|2ZhuN|vOlA5(a$(Vs0?)U z0xXL}-Z#6iLtZ#$LR}^1NL7(2{LT%~hP87Ye-`I#U}bn*AN^(2zcblz(zvRyiw`ve z`9$_R=aOA#ea$BmT{4^LB)@m2P2M+;WUE!a>?fC)%`WLzY6xdc?nfZWjG%czBE*7y zq*-#BEnf6(^2ico?o*!Kd^O+HpFe$xKX38$MK^4;9A;^3OFk!9uj2HV<|4>kRID>Y z@kB}XpOCW`6Y4-yB)!nhM~6Qjz#sg6PjKr8e?hUbgPo6S2O>xojf^MX%o6~X@8)Ox zCY((sQG>&S1omx>XZb4qFlpFbHkxbK3r{2~;`e`Q%YHYH#g*6R;F&lVqui_9XwTwn zr>ZJ5f9cK^A_5w@7qcQgpP#q$^16Caum%x!$dJ&x*!HJqvHGKbaH6vJhS0ogC0_de zyY|gBoq>*qRb+ZHzDbGJ^xpOp?iV5AoAvhS#(styLd)D1cU_~XmfGmZVH zU34f*yLkQ-dHJui)eb3YmljfFvvlY9U3Pzi_-`y6tKxUr5fS=~x%90AFa!2yPqbsF z!4j|7M+ELT)z~Rj*Pfnyss}Ta#o%%yXnh6UZ0~9iXw1V0?k75yU_!9ykzZ)ytvH-q3jGsna7U#X9M81DWHzL)Jx zN?v_+In%@PvZ}!1f?!%l`p_O#4W*CCv$jcjj z<&l79$UxO3G1&cfv8~PK+UmuBS>CQz{9sv0HcuAfD~cN1#%J8XOE1ETA)oBoBF{M* zbz8Xmy`#cDD);tYoS0FXm%e5^n}vA!98{m&cfD};yZ!QyVx^rkAUlG-{z?JvKg5d@ z3DfnDSxSRypF(cJUCxHv7T7o=Fv z-5qk?=0yDL-fbF@m&BRSPAyX8RE+;8YbVS>ezC2|oMu!FSu;7cDR45oh#e0AB3fFD z{3_1D-x@dlD+E{$2dFX})Hbx$!U3GCJku~(*IlmZrT6|6Gpi<_?P%zKS76Cni2|k* zu6Xctdgd$EvZOF_|9m>_;KQ-sYi`~;cy3m!mnLw#oDK=xt(O7z#oz#G_9EX9)<-@9 zA32=?m_fy#=OZG7pu#6sn4TZ{JW*|ySZ-p^GXx&jd4^578z@dcIaed^uOBlV!OSHp zRN<853h$W=C42dAK=MbWxheGK-aZPzHx>FzLEas76j)ck7`S~E4=CL5f~id&AEImd zP#+(@4}yP71dk|j1fPQ7-x9%xt3R3tQ`(n)kU!!r3V$Bt>h4=n`}Pygq0Nh*Z|(QJ zfsUK$lnw=ysj!$&_gjOfCI({b|AhNDaq8`IuFnie^Mo`i>FcpDzRX6zwIbR&0f>ED zg+94X$C9$ISTp?Dxvm`$$3DeBfd|koqad1LZMm>drdIq*`HO%1MW2H|*lFFJ8215< zI}jbEJhTI|(;%2_cpq+O3};7M$DkZ!MjjvKC8m>+8&mg*mp#sDd5yin;V4)@fXSo0 z{Esu*3iz$t(ff245xrONgw-ypUu{Jk-l6CAXUb$icJ?v1{{>X>d8f{#W^1)H2R{`ZoWcEuDSIDVNoHn2Uh`+U#dO=b%v&MonVeC7t> z5n*1DBE4g9pxEub^jB}}$I|u20hS%!-mN*~OB6mm3pS@UiQQiwS=5i!nQ1M#bIAGs zFPu87B)R#6U26WoryG3z&q-%>tMm0h=Pv~s39yG8v_kX$O-Nj^S{SS&a%`4)iK$ld zz(1_V!ls3%3$;q1)c9o^L*B3v8%1i*VT90S70sKi=etJc6hXI#>7LEMk3o^E z@OR5I%@uqAp)1YxC$ctrcC4&>btJ5DIbZw+Ig6EZ=wQ-MbYH)bEk7Y!{uGt(%$8r^ za*mP?I#%U359$xl{qu4GntHB3JRST7z(j$cC-{Yg|L_(mWL%2qb#4xH{!}th7Owx$ zgTja2(a4kI&n+1EH>XRn-;Ka-JRM28MRx#3CUED& zz@fvz*H!l2LsT|El_BrJ&cJ_f^?Ejd)xBPz?p5xC;OiS+v=@BlybLYb^BQjs;?&xJ z`o#47ixLC*4dq7?SECPe+GHbA+wVGhi}kbD;Vgu~e#`?4FP3D0M}d?YGUFb&%^Oy? zEhLO>GUE@Z|FrCOLFvF|Vz^pq=#AUrCD{I=b3e$bmby8y$$9=QY!?!&b!}KCHJMY{DNA3dAk zv^uKVlP=&7;#3l=Z@4gYne)vKiPX%?bG(?75QdP?^&$#OJ`+KD&2^JGl}%=|giS58 z*k!s;?8H*e)&jn!v2{`OjBL^UxM8@WyCE7gO+_zoMgJ^UeM>a=Q8Y)&3&sE%h0Cm& zlS@81GG(pZH*@rZ-BR=u?BhRK__+hIfjjILgF6fxSn`(c4P$S}u;nE!^ZzUFpxTyjz*(68t30 zwvz=ipP!(3i11J)gHo*l*eVPE_-(-RJk@%a4#g9v3MO)427niG)*^84x~cKH9;>-z z=z6J}yGS)7^3j2h}nSfKmz0eP6T8kecO(T8u&{WK1KoE$g^|Ezd( zxMaC+JXvMYXM4+;W@$OOdqQOZiUG?;9$Q?g)YxL1$+1(ry0w;Gz`$jToqHDD;>BeI zv7xKk4#aB){h;@Jr|)~+e=e+xN4^rQD~NohJcIwW#9g=p?Ue3)c7Dsb7RAlrgE|0o zYk`;RiMn8Ul#QAPKZ3cZ3*_kBWszB2=6pJ1{=M1a^QiBE&*Svr-d>IWQ$&-P#{wW1zccW$QdROwjWkIg?#2m(P1tQH_Ke)DK`P;{6Ws@xEovh| zz#=<4WPS_bE4U>l4D%ALLFccXxFw$pbk1ujQfPzm_U<3-lLQ$NT&p7EHXsZ@+pQSI z%{7vG8C+))7Rsp6d^CURj;<0pfd5$mW$z((ijI%kL_x3s9f6jSv}oD~GOOP$_~z%p zmiluaPjK*ArdjI8KP~=t5LmE+^@#W)z8d*#QI;@_5s9zDy-?r8^cEk`?pz@HC@@UM z{$(~Q!A4hyg6s+Y-l&6|1bp2l{> z_Em42$Nu6vm7Dk+A1QKF;NEV;%Ioq4*RrV(|6^O-ji0k_D#*(`U(K`VLSQoWytrvJ zYro-7T&l5ex(;UF{{GwV1+0Gdh4i4_!YaCBMp}(gm%GJF_ue*Kb165>uWN$Yi+Bfv zxC}3e;{EMd9upIeL5;jyY$6Ec(ZxbVW;p) zhA|?xIdeX|M&r7bD~U&i`p@v~w`f+ST01s5TjM)uKHX|7`;{s)FMmcz+PfC% zekRP@XW@^@GwztDZ75u!CQ#K2zv=2*c!>Izs=kwKegCHVR&l*W`l#N*>v&Po<-`Io z@BDj#^nY`XoqFc?jdZaR7btN9iK~DKkXvzrwa>hpngO`Yx4sS>H|F4zqyKZ=`eU}> z*ChBg>5^`DUpGE9x6=DfEk`M^ZezUoF<#+$!3}lg<$39mHfM}gBr?s#&}15$P^gLg zl_;FCkbTqdOEVTBK0%i_BFPo+%}2)@8qt@6)h{*gNX#p!{l48^%_7y8X8>PQqnxo~)%J)-6q zLwDw8R*3`G$v_ACZJq^<g)Cy|5f=4%;m*;CRCYk!-|1pj z0ONI96~}$dw~n$owqHYz!_=&~CY#RSJ^8dK-xQbc@82Y!^{SiTXA7BAT+;N*NWv*7 z&m2P%9YM00!;ZAo|KLi}L?rCrA1FiLzk-fQA7xNL3f?%LZf^S#6cyuQq2)6V^8QHL znFHQGJTN5h4qsEIdvKg^Wv|0E$5tJl0j{IrSfiMRGIM>v_TfJ5ydJCm-AoU%M`dp) zwW*^rJv7&liYyytrn{7`OEcrDbtz@0iWGAXTTA9HSN99@?H7O<->yA^V(E3z)k?b} z>Cd7aef^uGFRyQXFRF>I7S({)(bc>8&66(>L3$4lbdDr{yx6k)5QqUMad!Q0#Dr?tJSbJ;dT(Ep9M64Q)oCgtsTO-n&B^jj+-D# z+XL%#h=17Xn_Vltn@EQ*6vvBy%qPqfM47W;00JGl+ys=a|C2@OFG&W)3qx>Zp)+bt z@$V?%XfR&7+&-i33!NY0#iDc2>EA1`ErBdIFZ4lf9u@vEV^}nFer<(AxxA}L7ep?IK0-IUY~@;(T7;hIXR9z*xunIHkYo|sBgrCkkoi5w(NvGnT_|nw-*l>1bfO`} zIbiySEQODJhi4yh9WseousKgi;$yd2u;uq|BygUXCG$Y=EcFx+%VjNYw7~JD-1OYgw`2wnQvhg1)AH1{yzO@ z({sT!#pV0^*U9JT-_KTIPH{=o8%T2WPm%+dIn2?=4@5&5`X3?sSFf^aEYX+&4&13u z{abMe^L2xh0-SF|2n>#{EvVksLd4sw9!!WBfRd=Yz@+7<=#!2bv7YR~|K-d;=X8~fmv9Xh9^Dj! zI4Az172<3zuLv!>WoBsU!txVB?Y$fw`4J$gOI*;KSzpvuPihQw#`(JRf$}#gDb>oW zg9=V-uep)CQu7pCV-klc-z+xYc}3y1N#~HX&5W{LVI6#kzY&Ziif^P*4qS9s2OhuW zTD2Nv%V)L=78bv|o$6)gsw9Gyd-iWQBOG>;v^4x>zp4y8Zc9F3zuJw(Ka*S=cw(}` zI|e#lV{6uWzl3q6!zvZ{b$2BGwX$&j`Xn3LugFg|9DR?tDKAE1sb@5oFa0?gF1V7| z4QGZrK5L#++rD6E0atuP{A>EcaZDSo6R9?-eK{YpA;n@x)oz%4cs?--*|j7fi^Got zlfV=o92OMXPYTH_M*t-bVW%pnZ))P)qSUM+5Fzl3Eup1nTKT~(9bHNJ#>>Jmn-HmE zZ5AS41v(bcXD|9>J3o0XH*wiaq(%2V*(2?f%ED{(J+GaWcK$kc$&b}7NqHewF&_`s zPWp(QWYs>X?3X8MM~s&OPQ4GLuhI47!2tjZ<=wjQ3Ae++*-Mye_rA1yO7Pfd&CIu; zkCq|Pn&b4)d|@O$y&(dKbl_w|NBM*N7LS8@=UsR{A_v`5Bf*Iti$mZ zViyqauc=k7b5$XMZCK70T%f>oge>=XC?8w9_vI;LUk=*?{u{BI)^7h`O2@m+RUW(l z?bIYA`%eL-HmU9V!3b%wr*A5}gqNQhjRuvZ@hVKNgVm$n8LSv(_4zx6 zopbO3pLatfesx2Ad{jXs@c4<}{QYp^+P>R7_>=m;s$B$jhB_KS1G|1*GeaBFuCmY3 z#z9>XR?Jb2$53O~`MNZwqk$);Hr2+St0NvR3RL;5Db+gzcMv8rZ&qDwdXv{PsgjOz z+~$orBFC}yoI0zIuh`1B+Kz&{z!Psp6c8-%>ksPlf8lXxhjBJ|v8iZclZX#fs}EA0 zVzqoF7=WobN;>9@a&OtRnW!cwpza1biJYGozqAnxP5Ehc)!6iZ!w0=pOi5glUstWb z*L>lnz`oqBs>lfhR7bz9+UzalhEU zrAmq}C;PO-@GvHmK`6y{&PA3bhNB0D8|}K#E<3fBocezWx_+((sqtmYbE-7Ae8iPM zjPgbO%MVp~8BH0-AHU7&*<_W(F7jebLozWZg{ffEM- z$Q=)J5S;Gk3A{@c$yW#yvTw8PL=^rH9;{~NPrjg|J`m=elLNqMH+>NRhx|}v=fw{i zES4h8gn1t!S?9ke91MqpKTQ7;i6_+Dvb)LoSPJ_ae8%3UNreL7eB*r$9 zdZbd1K;sdno}h>{g+p!XJdad}D$o4QY5*$u{t%mVmDDZZmuFrl2?eFXY$e5<%J!K# z$yI)Z7BVL*PYX>$tux9`647N?mDaxt*g2q=`=@8BTV`8wyo>QIaLt`Qg><-Dp1I!d z$(+CwU8G;*(x1GV^iriyB|Y#&UHM5){+#2||EDff{uDnQdQth2>U3)%e{OO;+0;zV zAT_!2Yu;zNxnC?ky(%1CJD3oX1rcKAM7Qi$EV$_nK6AcW%z4x?$cHK1(?{SHYmMAW z{qQNFOVht%e(C$YUT!v^VXwCO~_o*=_UBLPW${!>faVU=o!dgc6M^|q2Xn_0p}nbote(dXHbz^}JP2&5RTd0?lc*ZD#T#1~ru#3v<=f|(Lm zudOZrAa&*tEW3&`@3tO=x4jLwEXeXf+7$nzx71}*;v-~t z1=U$ws8ruIhK#sO{T{oAUrxE~{G@vHv1j1W51;L8MAA#t1d6U+Y-||LkKF_*7B1t3Gt+;bfZ*Sm< zxkTywED&wur9S?D$|CuH)HR09$I9}60(-9uNx(f2zNVC31Eb-vEw?IAkuHl6{f1+p z|5iM2tcFDYsu>AnH#Var$%H(+Pdw*nO0yZ1IdvUGJjoHUvmZHf)cVHK@l+5xL&xCv zInX2Y^>g9BrQ}mY5KL{G!|#zUeOW!}CG^h>CEb#9J}J-_)>?A~TLe^c_jP0%sZ2ll zGoaymBdsq+>BGHz00=m?EXCq)p1sW1{oL#ECTzw zFfpUbc$m2CW;HQGq$x8#r6&r%J)fSGt0z-glxGSs{sXuJkUm}fgJl5gKby|_(;q*i zPx^lfJ~n-*pYF#eIN(^>yNgNxlFGj?|AHy~d)1&`g;*|nD0NT``RId(PJz*b&rSC8 zY<-4Aj`Diz6ywrbUvn-suJ#~x`B$k}kRwpDIk?NsXT-H+tQDr=Gu0|iyFvV_+kYje zuU=KxR<;hd_N_FhT)8D$&~JkBVG{SPU3yvh7$W_THbp9!D14%ZA)#~TnWHtNxqMBJ zH0l4biL0`S`^C^N_uC3dd0=^y*Rin~1tx_5h0EU=qB52p&VRz3sLGBLey(uozsjaR zs`?5KQQuHu?U?B9eChmXK@<FRh(eHyGbW~q*DzB2#(HIFkL<}sdB#c`D3 z5dFR7?PO)^ZMH%P!wR0!A6(7%S{P!`9>o3MW&vZzt&&l-?`!88aHhshWO~rHx6uAP zeQB^cnv~;6y}LP8|5BCkADgi$bs~?zwMBM9YyS4{Qgu%Uzt?Qgn$vDGu@69Y-71^)hRRLA zYP09-C>`hJ~lStOjZ{oq*|mO4W#x7b#;u(NyXsir;!h~)iKifv@J?alCV78K3vQw?x8 zo$cZT^#38Dy{5#DvCzD3N0=Rwc#NRnpWnTv!3V0EEU{t7b1is+FU}Xy4=8h5xtHKS zDkw4Q?P5!wAhCR7*UMOS3eB(jKG!k`a!1z}u?Iw(=A(=KmeP;*wczIOkHWNr_TTId zBgBf~0kAgD@)qAx0*25+dIZ4>~_!)emgLf|KrIT`2Y+krTJva=s#}0vKdC9Nkurvo)|L3CcO+ z_oQ)xR)taBk1+1V$hb{m9A);tfs<>2*WG)5gfqDLoWSbQR`Ffm*G$m@LYOsxnyE}d zpzxQ9ZezPH>^jP~5me12+cqjSP>nhnmDkAw)OOiAah)$u+^gQ{6Gb7;_GBfhv z%go3*Y(w-7P>cIbK0Y*B?2!Mi51vcFDnJC{Ixx|+#;6AE8Bngj;*yU~HL1;yr-srf z!SBq~m%B)=cCPDrNm_Kbb1nEFe6Ti|Pa?Uqt`^Hwb1-%6|6=~164d+c@2L&?XQ#Zx zT!FdI2bP`V=q>o0T#5vQKxn_ji!~OxkSXU0>}BReU=SEnN3A%c5CY2{f5C`rA{a6R z@e)^E?C?zFk{}3DfwLGs5Q)ib-cNG;!-WH%7l3u`q|6O)Smo=B-@Sl?bq*qC_cR{_ z_R=!P0~~&DaO0z&H^7|0Z~9&2_is}(C(*Q58@-u9X?W&m1KpgJ+53I@uqX3DQ|k3V zEy}<|M%ySe+_YxW(}$VOnP-=`7G8m@#bDD-3E(OJxkTxDs96it0bWn7)H+pHmP!21 z_P)e2m#8jB*O&OLZct{V$<#>Dq>tTw?#YdRg&K%{@CD;r7;+KH_YC zS!OtJH;pJgPP35d%vQ6@$L}&F8d>EX?t$jfn$epxw9>o{S_wSiXvHs`Q;+!f_^Fxc zyRdIe>VNBa`VN{vX_$pH1-5C?F_TcjUa{rJ(}X9T*H@4Lc&t?A!=4mf=H!unfs zLMTxG_G#2_2#!9Mbu3sc-{E_(ud6`ibQ;eHa* zazD2-AFY{V^Ih!rtHpB6f5~Jw`YN6s7vR9?X!@uM%`aHbi?0Bx!VC4`*m1xk$=g`H zJx{D8rv^k9(n7MO)t=G`kxrOY+c?i6SGs{Hu>Sh&AzpUjL3@avD9PQQ;^5Sa0>2=25euX$uH@ZMoeT{%)QGD}ip?xnkojpSiJ$P+uy1u5mR! z5JW-cOBFWa%w>76{8qyf&tt=Eum)I_e$@V$oq{PJDpK(5k-s!8>pgWgyw-dJ zP^AX?T-V~4^qUIJeNb~B%$!DHB!v&m80G?ftcH&A%&$N(4HRrA4s3?onbr%4+405r zJMkd;5C)m!ZO3Mm2l1{-6#icHckyF_lBFQI;*+h&tf6Xwr|AE;{%fsF$kcD?`@@x= zum76=Mg8**>VLfWM7o>h&xe?rLegQMnW=dpGd09MjKG{=+3VyJp>gF7cw^s-Sv#eG z{pHkxK3?-h{2{O;DIDrQhX9WiDE>cvqVW=lhBz_rUE`wTD3|!vuL1wWvd0;5y{9r_;X!`YhH4w zkvRVUw(CDwmEoac2qjxZpTdb~&2L|X83j5;%tShQRBw8W7Z;F8MCJTt{y>6RYKbk2 zMv2lF`Rc_OK9Qu!`WK2l#V7G!(FnUEU1}Vez6hCMmi(~u{RU=-! z+~v?a*9Xsasq^@ORn_P>HHV=xfJfv$0e|8C$5-Jp=EKQQp7f@^nRMgFx^&R|v3{)- z42Dyk`963HpVg&vu>EMwXDHp=-)p&AnrHL9-(=#EIrSsUp0OR2X|3L(2AJ0pEpRKT zoXNFJ6xMmnq=Q%|^~MWVP_LyxO5dS2&ZG^8uy)tFZ`!G?$c$iUs=Fw4$|1)0f8F>( zn%^q%m@4@{c=1@5?H9~7@c8s185nT)iKtoF5u{7oN2=}Cv2>sC=Z(Xd8opa*Wa-ab zGnyo+!*V^-I(&@y6D)a~?kXI^Vli~jeSoeZS88@;9*LHYXo*`j1C+e5HqPq*uK%#82Q(>^v4=o_daJF+5J~S@A{ZhNH#g zI+wZ-T&wcP52dyOGat^tMk7?j|(E<)OD@x1t5YEEpVLi#f#vrvlg z)AnophgC}K>|Hd5bAW{QdQmeL^s0B@wT|F0#nVNNww@(6Yy5|H5Y$AB98g0m3vkF* zhu!lon<-{rBe5mQi<^}0tV|UD2o(|gwEAglghMbl4Zy|qC24C;T$Ildhq+iEminJ< zmDOA39p=SGecU$za2Ruu$Kiub{9&@6l|_CG5HxKsK|Br@0d0wSB;>Oct4E}C)kz;g z9rTpUIYyt~&CVpZ9qf}Wm)j0D>9&K?=~pV2xfdV4S-jv_|Aec*tsB3yJC7-1*_7en z$9dJYW%J9D%PyJOOZ>R@{rU5;>(K}Et`H#_>J8a!3e5Geu zl`z>(5~scrtMtI z)Q3Ih1>ThL5ng-RSMk^HO_%=|t=adCMylSdLgQnk8%eUg(F31+nYC4kT6TD^e}$ADREsfdfQ_r`CZw~YfpRLH?mzR@*kr$H)gwXx$8;^ zNwzC`peyI8E31L_<8CSUa@sfu@I zoxeU<8vMs-&D&24EJJ`tBj2==ZEB)r%d1q$%>o>pLf5aam+x&xkBSHXE$^-UEhCV&0rjsF;}dH26Fquboj+>bT53*OR!GG_aIT+h7u@)OXEop1cJsH#VjK;@18>s zrT(R^&bTV|;~SY5N52CHSo)nU`Pn4-*(CXsTnan(L;U3BwMVKq&-<2YpCfmsWbf@o z4Afq|gvq0!y(W*#VC8KD4{bB+IW?^I=SW(@v-#FnlNVoFq)}-Z5s4@Bc-H0~_NY}Q z_WMG%zxSj|G^i$|=WK2!?25$F_AozvVzX*_l3(bPt+Lj$!qvM7Vh{;j$j^KA<9^TW zd)z0tyFT#PgUZI$&Fk4;d^a5XLu4F*4&IFfrlixqBuoXv-W>^aFV{d74narSIMA}> zdrY9lQK?`EEhj1%f|pF1Z~x4xC=808OFV|O{bfTU;63wFB=)D;RjSmyrwXi|P`!2j zP;VUfJVeUpKzif0+9x?#Emq%%0FH$w1sipds7 zh#l=8J)%C@3Al}0Q?Uye&%&Nh$+(>(?(>W-(_}?I&2KrPw*6_Vs5BRadoC#XBiqD% zV9pVO4^{gJeMtfn$Jllv?Gw~fyK?OnJj{%@=3z5L%+>Nny4;``IZdxT$O(;smD zad`1;<(-2drB7aL4-b@~QjQ|yTCBx~O-oEzEBj{sIATD3T92l(MA^fHwCnzBvDL4u zKME}Q8ZCoI%Qe>$wG%$++n>%{&sa&GaD2kY9mKoX?8h0Xk3C1Mg96+iwDl6WL-%3T zCw`O%#ehiR?tfrZee0q``C;{mhs*QwxEO2i9|(}ZYfSfw)W>>s(OiA?v-1n;V zMXdD#-NSk}IcM1Wc<<*7yO*kP> zstGB6QW|6DRd|>?JdecPX1h);&$~yr-&pU)+L!)Z+wofSD;FouO^5Se%px!REgS#l zLfW_}{uKL?!MrK)E3KnfS#7lYvnkb^n~SC>w%exkH4cedj?Uhbd_x4}(LKpRseJi^ zmEi*RS#9s8Iu0{T2|RW&w|3s!Jq4e6*sX)Gf5ErC$4L-(l}BV|C!e!;37r~+w+-R= z#X-GQFaiG_+7&1sq0(hsY@&lfOhg0wAKH63njHv5 zi}M0g4(K*Z(Ti075FQ%?kE`9gwT`e1ejmj(X`kc9A~w(zLE=+f+^0B%2khA=JAb=1 zb)$Hw9|XkON3Y>*3c`Y`?o6e9-01u=3Tohg{xz89EK;<7_!7T4D+LYPE|35KZm;fc zwd*J3GEVigOoI%nr)~|D>VfI{Ow`HWT^eb>^RaTi{aSXJt%ox5Kpt%Bplf_Z5BBIR zTHFpLXxl;bPFDcyQlUQ+QKC<*h_(2Ou@+C9dC*#16mE_3^?}E|>zG{@wO<2+$AA!A zXU?t2@kX47-@z4iqxm*^mUT2s7n1W{4Ek(jY?yQ%vqUYqXTSR&ckL4^^s7umJH|}@ zaxR#(ur8D9&M_(C3}t`=j0B(77GM+VTia`s1P5hX(HJ(+E%YmK+$xHfwuN>0rFnR~ zbS_VvkJ|3GU)*}%6kFFBYfWXDuLj3(aq$yczF2APtd4HQ?$-YY#ukV@u zm9@(LNGEOp$mmX-bZ9<&e6RVMtyLeRih`Udd{T!4&SkR9plAE7I0Y56oo!6P5sMIu zPz#XskDjMyW-ep3vRawMT)&%$BZ+~>>AFYu&b0EJcXOC?oTxIo?okmR59=5(HTKkY zagO@LzYB1gG7j!{dHGEir0%xch_R`f=}oV0a7H z#kR9d4lKD9Fln?a?Pv!jy=VA>3=!6oYu>6!a2WdfQSpRl20P$a&jXgIPO zASfbOZ$Y?vM{VHyYpu8PTLd{PA67erwHSWjxS%CI!6s_w*%F{r3D9z3QEFJznQ=TdiLba$ zI)D$VKcD@1He$}K%$G8TD-9xF)m(iu(>3^J|Shx~yu+pWl&c1q2|FnQ-r`z?06``IV} zx$LWz#q2(d5x^2z`z}?TfDQi@TdzJsV4!lx=1Ntpz!mf&sbC`uH+wy{&JeYvJ1n;_ z>)6+{h|#p!vP+v>u4ALKo%G!p9EEcG55oNiYUF z|4a`1!l?GMcu$;9V#r|{unW<83&HXP zq%gV^WF$-pWon&Btya`4OQr3iMiO)ts49fsdD*}hu?vt(1kdBTgW#;53!2cFFSr(? z&;_%BkJjRg+BRH(Sn9bzMiu+POL~bbW@=JB?pauZ-(!y(C1>QXWUmCLtYMnEAo46f zP1pe*m4P`^OK-V0wDm*FzjWgRxvwTn;G`Dim;#h-r30NP0u zZ@Fg(zQePY{^XF#tw@yt(75#-txv4Sj3LaXw@=Yo@YLQDqgH z=tAHl46|%zAlp|nTs*NN24C^WRe>a$kBBg5#O+BG{)JVL`LtQUE8HgsqF=I8;rbcdtU^WJ-kthw zDAG{`wa00S`NwrwY{lQ$rj?}65H#FNS^D_)eFKEdnJ*RTlJ;CuqoEGg8JYRz>-C(f^LS)=~|&^Lu5aLkf|P}eKxxvD&kdt+ER*P4s!jT-p6-IKL0`) z<4bItVOTnb6P zEMWCP>bFLbYW)hX_fviU?I7MnmgqO3I0lsHoISkXbm47!m=!CN1{0O%O^YC2v z*@2U);ddNT7Hx*i9nw(Zr7N*Q;2^r%{y@Q6W`@FvQQXXcQ>u-)0&YCs4i(`&N|+8l zSMMa$7D-e%Ugww1H9zj{wZ{c>2b&=a@rRRg=^-`zAUm5~{{W+0-46M-5W4DH6Bb`# z(arAs+clp?!kQ1-W6gJe`R52cqqp@DsQK-Qx&27r(WhUQv|dd6An^@CSp8w8W#>w~ z#D(E6OL9I*BHYd(&9kcd5uI}KJ!me!SBWYcU0=D*{FE-GA664~{d9T%@v$5NUE%a< zq*7R$yU*b=)N5XK<^f>8h znfiw?^*;|LoLg*P_TFUdBD?E?1JXye6V|5lW~!MLUC>0A{*6bnDi{S?3Br->H@1ig z-Iu8O!zxE90V^~08DKTYQFOG}R#h`sg%qwNlfv??`j)y;xLU3PH{2*aCQ?3HV)CR} zNkkWNMb>Z^=hG`mSM_@@OIJu-_Rmz2K2j1B3sX+XAZ=W(Hj2J2P$+&D3b$BcBP;$O z3w=268=OpG^kzLGC#g)01TmaBe%F#?57MuX_u_7yVwW$s9y#wqFLvizxAw3J>C-50 zb=PE@7AvPF-I~R{#gk2T1%p52Qu_q*hCnNCos(|^PqEVPZn?#c13Ao>|H}fYG5g_o zeUPPz={0{x$i}BNO6RSNw+m$ia46|g#)PJ6M!aB)e=vdiMyb9N@aRzg8qMpk*rbue zNn)J?eEg)KcnNoG$&G-+kVc@%6E}yu`}*)IEpZhH~<~ zR>*%4kC|5D?E4#AB3^ZwVqM|&R>am>d>YS3;!5n&8;j(s$hVkRltu?D$h^QN&*5BU z30-Bt8Qvqf!&ngZnhdaNa!{Y({HlU=s);>k$60j|<2+puSuPL*u`+Yl|6}b;;G?Xr z{+~bsVTltI5ESb~Vw<=IMN5=ufwZOZ3qtkf1{F~_y^m<590h- zFETGLs~#)YJiL8TTtO6w#(}s3b#YxCA)YSDOXgT7XzmJ&auHYx-MarG##%s`Q*6V2hb(mSN*JJ(H0!zQi(NVTpugKc0Kd11xK!q6}y}cm4f5Up)evVVn!-8h*-3 zKE;kVB)aCD{_J6DVT?{>CW-INrBMtN@VT_)7SA0~3CPC^I*TGSodxVLv;5eq@qnu>z#gvOc!5X@$Rl((6> z5Fn^8^VGd_ms&E*KZFUx!>f~ zLicwbOsfVW#i3-F|I1-M%P=?mPX;D6Lx-7rkLZq0J0}w__$<}oZ@;9!9(xo+ZhR2H z;>piOe2btj_1Z z%5#c;v-bI$aq+=ha6eaD*vq+c74j+eoxtk)iT9KOL4^j7YBvfz{KRv%bOUc>ckm?N z`ta$@2=L{l;k%3vl3%t8&RBjG@MtY@u&`4GGx#JE7Cxq6VfA7EcGL#&ca{&$Yd$pT zQgi#*^lx}2dsFp9Mq4Nb6J2m>LCSuHEdQWr*&a;cz)wcIj8CdfA^&t3ui9Y^7`@B# zSAQ_=&~UrgM*lq!!5E?rm!>-0biY1`p6KmGnhD4&=&}>_xFp*S(8;3fqVkI z=S4(>6Xc8TZLw(XKpt(GeWK_u?4U~Z>sE%v#pc+o9IyI0m``1`wsw1o=bolnfK3qj z;!%OR<5>}cIYY7p0Tb=ZiM+U{k?E)5Jh>IteE)ENrX=3>#XZfBxkoWKU=%Z9NUWXQ zZ$zS+PMxBGQ<+m!MUw~NPZoC>b%RKCJnG0bIaWrB+rB*$9F29aV0 z0@-pUhveF0UXh|M6qxnz1uU?oUqqP;XyJDu+Uux{OgtVN@kRQ!gQ}-(v zpZV<&Iuh#M5eL7*r2v0WV~9MWKd~W&^As*JvUf;e$$hGr6|Yn`a_zonp!4)wT7aHo zJ^l1xMhzDsN$ZI>+Y7ne%CV(dK=Ij>9;2uH%{LPr6BYy8|6v0?jg8P2oe!$Vt6J5XHm2Bu z@`kUp^W5ur(<>xC(Hb&juM$f3QO?YDg-<<>!d6IFL}7*@2>z9IV+()UU8c{^CKK9e zN`B`^ftwvx{&XwKxr64F|I>y4=_s>BjWi;J&cZyx zd>Bk<)gO1ijf{R5%QC8)$rzlV4p@XOjuj;-_Pa)qOF@rP+<2ik8IDEq$Fcr+B zFY0o`Wozd44M!KMfKHSWio-XUF_r_5#_M^g`c>hT{ctH+=CG{W2l4lP2nOolEW}th z>TBR8U5fmQNlLe7@ueE=Zr6GdB^ffP(Y<7hz3srg%A(yFYau5>r51TFS;eJLE4dU( zHj|^NujO50uFGyR6(^i$vxGfllvyXLDFlyjd>k%0l-80q3r=V23zfCanaiz$Y%b@g zS6J;Y2N}!A9TwSjMPnw!Ze7`c7uZVT<2NvWJL?w;9i>7{trxpjv<_($_~XAd-_1|E zPStu#5bbPdsY$SxCMub3a*AnG1KiAIJ%aEty+ZF0@pOoIhNP4!GO-ThEBC|so5?|5 z?q^yZKw$3-I*`Dg%#>Umo9*Vm*MxE5fAQbL;D;#*5*bdQHY8~NHL_Qgy*cIHCf_=! zL9fjuhE~uyE*`pa#s9S%l%UT0Xr^8;9N?mNNb=IR;%!1YtH+1`0 zIQp>l7)sRV2qQ$Dh}BLf&JA~jRj_}**NqQapS@UYGj&)KmWK!4L%d9gh1(jMvb$X^ z6wW4=YpW?_OH7nGMjl^+7D5XwUM-s&7fq?C7bQY5E?X;kCK~*#aBT8)MXqV&J?;P1 z7FgJ%GSF10Y*k<(LGrUgC2gV3R;=kdaS>|S%^~lV;q2DxXj`acgKjQU2pU1!jCVcz zw~6CbgDx<+Pqd08XnI>c)k5b3lLo{gD)D_~jd`G>X1b1PFTRiuIB75f!c7y^14#-$ z$1Aru!dK#B(8;O~)ll&ca0q$2XeAYJtvdHUolC#nklL0uGGG&IxieA{~tbtVz;hkrDW%#Syx(gnCe1k>%~w^o*>bI$ zRbBEzbqQ^35ADJcS!5&k(`^&Ei$oERo*FLrEaOfMOn74+8udnXp*BR&yJIGSyii$7 zU0^~qXO&fcn-hHjRtKlPmH3hc1{V|)Vv*<9kMFb3zO4&K-!xCy$5!Ln-?nEpvCNtN z$5Z+B7+T>64ITn(z!1uw9gURf1cS$V)cu+8gS#Wu^W?_2yO6m*Eo^33@b&UPrmxVmm@~B9sF!POz`1!NQLHQ zUV8F!8-`QHp+XZFcmP+o;jZL7S(q4gunklvKb$7^5_zFf@QN(8?GA|%m23%*dAWL9K`s%ev>a9gs^Av58fWm-lz+ITRs|^aRuXL^m)O1?n*}P zmMmKnXnKlDn!(`6ZtJT>WgyZ7f6}Cy?oI+QBWkn)c&zNLKx=&wLJQK=rK}Z%YE6JHON?lzuV;g!7M#V2R`AnhU6hE?q11r^F zS)Q}!i#-#00^iDyWqapvbr2GttbUeR1QyPO zZW1yGHVg7vu@j$<+(3hZ(hj$%$4YbWVH1H@10{a16_#h$ga`|2QH!hb;Xb&TgROi2 z+(?_DzT`&+?5ET-)ZXjoCfy|kKD#lKc}gR094|fRqKW4nFas0!9eiiQ$yaXv{fNFY zEWEI`L?$vZBRxd3E%kQHW!S;Q)X*MP>5LWl9|$^{H*9fI}q6*nHhnMo|)x+yLT#6{|j^SK`hoC z@pzhj3q-_WfUP4Q)~z${|H43m_WOfH#r!tO>*{&mQ~$K11WEMi)aysryVo7y#b%=m zS#03nsrt$0Uj6L6%f?F}@eTgXSsV@dmU#3wiifyuOB2GjotE1^Ny$IR61jo+A(Rhu zX%tX!ZDni73K$!32xSqhl=psCsN?PG!dJub6DN{qa_rW>XQ2v)3pY%T51hu5-de!g z+BzXV@R$&>RTuuGKYKrxzjO99uw)6Zo_{hxOly|N6+U~~SyVPDcEamUNLU#z*&wj( z>Z3F7MC}O`Zm7;~=kSUY8x~;}|1MoDl)cwV67N?Rt`c-~Q)O{Pt?w6(U(w08Wbg5# z-qv9g;X*KM;#cy-49VcT?aRYOjrMmtp>lQP-72y~H|FOLq4St(rN_o=za59zAC>ilLe+b`j9oYO~PUtWE9w<%q)QC|M@7%q9)`uy@u9 zke+46kdy+;9Pd(VJ|Z<&sYlpUv|Lm0j4inS1HYi<|NDNg!rCO*`Ls=btSeda$5ubR z!nC{eXlD8f(#=qyHFy2imYAzlKV_OijJCRRY9q60&^$qY1p*zB{%P zihib0=`&z>)z|jRN}SBlPmGVn10%(jed~r_5BZKI-&a*90ez{hUR;d%tT9b&k#dmg zvhE>G$!Z<%dW9RoPAX?OQ1#K*wEWmL2ew=t-6Bzcn;I?a2rOPEdUN`X4aFK4Z={C} zqEUyxknH>V*I2#i)yh8zzYO=6T!{RpE<|<+A6bp(TFd*~iEQTtiSL~qj&7`u?hWDN z6F==}!2+*F+GCG~VwQpE;`H~A^UK(vx8@5O)9%twNsul^WY;gV!cQ+YPl9L4U!Ph20YAOe+~v|IW~R^c)5n+_ zNjES3hCgco*Nk&8k0bz`gL#V0>A0_{a==`(gH#rM_=lgWIby!)n)=E6q%!NX%n(1d zQ7?IvHCNJ*^uuXtCQWFK)`ZBa)J8_jA6NX^_Uev)DdXAt-?;+Hf&O)*1LRR*rH^WV z)KAw+OZo%q)fbQPXQygP<2?V0t0Y_v#E<=sqLt*uclnho^=UBc$lW%AzTi94wSTQP zSB_Hs6a4yBhWgKR3&rDFD26EgI6ob}VBr&Mo~!n6q$XTTzYBs0G4j+E{j3LN#&U<) z@0&dQRdhmZ;Oi*>&8*Kgg?wn4|NbnZgK+M5Sy-R9;)U1oo>%yq7a#cTlr2{4D;n*= z*H`47T5}=Tf_ARklN#)+gjOF}=3>{!qu(W!sl@)UpDG*+qGtWZ2P4q8nd4mM$?uWb zE`Y;rX7mXYaEs2mcl>&U-+h2D`mQlM|3{VNKGv0L>EBPUHSI1vnwh?WbTd@o1FeOl zbEQBM!?XMsgU@0M=G~U*d9e|UFPpd=ErLC}6$>`tE!xG|Z^s5U!Fu2Ax)*(fJFg6H zcPoW1O-Er4M_;avf>zh8wX0h*{ha>j0Ku#TuE=;ae+0+2#S+>epns*G)B6Goo%*-p zPAz!bWZR$B+pemnI7ey>C!B2m`Pfa3F)!|O2lMl!3l}sej{M5d$5w%H`inMe(O=+G za-%|jL7SXF4TDk=7|G~|@v+1Rd2RMdVL}6j;{$tlnFx?^IZlT4Y&L;FxjG=HH;Now zt1>TnOjj<{$llf2Z5ZNb6GeyENYsh`Xx$#1=ct6OpmbxzuFHxlWIuVtj`|TPteE#j zBoc^R|Ic)zK2Y&A7WGniBy8 zgfuUEzg0tU%+B7MJll-h+1aW4VOQ3lD7nEy4$3AvaxDMme-oFMUBm4!%JCdEVJ6FP zxQ zzYJclDC z5ekbBB&hu=!jR0x9%Od{ZOAKaNDUqyj*l2#9iPTE1P^6lR;kY37J6RxNw@j*W_8&r z4avPqW6wI*{Wwxl9{@ajj$Fow3{K7gTBNe@aH?X zFA*g;aTs$YZ_cSQb)(J8Mq)R|Q4m7AHdGf5-oa{<+NN9qRy28Pm^`(T5Zs;LIbZf- z4f1V}yZ+&L8XXh9WrR&WZ_QDl&TLkyn`z-SJq+pboIz%|MUVJC7ujeQQjK-4!wvoo ztq*XuZsx_=PbJTD(*Uy~{!tp9Imgp7bz{=#GAYWM2t2H36S6TP{ur80Tm->5tKd06 z<(|qceAvze>N8oVfps3pSnt;kUA%_MyMuUsD zk<}LtwQ|2*^?lwsQuY~NYhZi2<)gIl&|**xEKhxwDzcK_5eV10#&b7{y|yY=gIM_aVktIlo-m%SVcjN2J1`y>=N?-OlT71-^n zb=B^EB(Lnn`4hsjnMrDyLtqKXCQebQv_=pcLDG+@0;jKzc63*HT9SZkMWw{~;MQ6* zg9ORzQkRnuxK)pQIR{a62;toQPO=krT&N!$Wu=JBIdq7DZZ-?|G7|pzjS0eLn+nXe)zF^?~uLtbH8+pWEz#o>Cp?sjz8KiG3TRH;qZL_(_Ef7>#@(#!VPP3r>y~ zP18BO~FZ|0GZH8~o7vjElm%}Dud078GL?>9Mm!kdYs0HQjYFx6l5a`)T{o3og* z4e~5FYbYYgv6MGAAQm|CHb2|xCT(8g-meis@8HeBKO}7?&@DTOLIDD^u#Us?ISgw4s2qI^Yi!xGwPxc+)yXYp zVtD#Tu9z+A8yq-qcYF?o+)lJ&W>DB|_OrmG+>qML(Bo7!Ha18hpR?)R;IjmAz1AlU zfs}+N)KKg}+adHv?drtxKf^T$4e&$#AVAn<815APG^CBbJ(ZnpVha^0IU!jtSZ^tH z>&5~^hK;yxZ@TReuWVmn$tkv>%QogU+gOdU@~RuHBkRUI<{-OldpX4D74GKxw=LB= zuUELYT0xOMg8p?!-Q;)SoW}g*LGHOGuh&0nk+InXb&wY zXc~bg)bdu&#Mp=d6Jxgy$b*dov=?{u*11uqbLkB=L+enUdE}dd-y+0yMyJu;iE1{^ zGMX)GyX}fVq>M(@Ua4AU)5tYSCvzsmM&wP3RpqHs1c!q)N`8FHOli+XY0*Cg@1;~# zT8R%l9Q+ipNYCxZD!7`ngGquut!5GmSxqA#XU(S>)=sEJx>kAnG>1y|$(+u0rFQdi zH?c6~%oC1oHJ=leM2p3AtmUc7Sp|hX%L}r=e~Ks)^R1oBpEe6#c!(O%>f6n~f35`;M~8N^lt&%+Z;}2xj~6ZA z(YNm))l)PZ(6DI#L!V7_Tl?O_Ug>Kq(jVuZ+e3E*J;ON8RUjcdh*6$( z^Nh~dgkRn`TR?BD&`kV!Xb(=6QvOm}lHYn2a83K*fcBF=>{69z8C7v6D6)s2jO+PC~n=V30lmIDCp1t((i)-<%_w z30izOL$AsrihlxM-~B0~LavbX5l=SkNg4pBKgUVz2?;08*}s)z_?5(-$gZE{1)l%J zi|ofN!^UL;$l2-6_+gq36>bXcY6}zoh&wsLg%t%}$H!jbJ}>eXJ1B}ckY`mNZGZTH ztv2J-X8JX)bXc&F(^9B3&n3GfFfoypA`N{iehb&x2>xIpdD&~< zu45^SzL@(>uWaWWf`q^3b-XW2688Exo~r6<86|TBG)Rod|pF9=2X#rf?URFy`L}@ z!B2L}KJfmR%v}3zy(TZ8*E&YFYok{ z`x%JaaL`rK={E_7KTr5$4d4$!$s-MUSg^&lkd0L?E6o^fYN&D2HQdm(* zdO64YC3&!35v56$MmU=25e&CFx*cps_D|og72u5|{OySO!e74c)^)<*9XAp}+tkX^(hgmr9vx3~5utRLP%_=$8zI>$r z!KNO<3oIo?BI1wx26opC5+C?_Z)%EV=)coNAGM+njvjmeclMisNDe8xj5W$kw4y{+ z(F|E;wD2urm%=~e`ArlENQCi6PzW?Nl7J&{*J6|nqtX8G$gch2kD(9gr85|T*U+R8 zP~`8E_O}hkb504dd|RUeiRLg@e`Gi0@+%4h#!8qN5|H)Fg}}11b~7~xuS&d6`v~gW zCdx3Q^)-5rhRFsIV=;ifYoYJytEsk|1?gNt1PxUH(QZV4T!l0DtVzSwH|G?|9bPw! zmOWU8Mq$TqANvc=zVwc;;1Tno#q{Yme+2(Z0T_96B~~ZQKKUA`*i zOYP8p+rFTLwU`rlbQEq1wTTNvd5LfLAnFux^P9QqLDiVnI1kkgzx%-NI*Z>u*>%&w z7M}fcF%9bwJaNCuUgvy7WIvhyQ<+!<)~n>@kQ5y!S32k z)L~bQexo-DEpFih_I7K`NR>~gcx!XoY{haf{ABhHPTHSs{kPmsi6t7Z<1I8h+U%t5 z9bL7`mSJVRd`Tnl3cXnRH~Uy#Gev@K*m>zCDI8#BZBDCeyG5p#TR&W#%Jk3S&zeTD zZ*q&*LGZ^VVZz@}55V894PK#-!i&Eag<2}V5{rH<8Hl7QVtlQ_J_ag3`WjS9RUUCL zOs>}I>SNL@v%<*b2qBhIwV5 z&KZwFx=HqRzklnJY&2s1!sutNReQkl$#mDhg0B9_L_SRGggTjgER!;}c1_@YUgwM6 zNGPLQS6;-~Ji5vBqjp;jT|!vMfY+afi%mD;xtSNovbr=E^TIZAhzJUod7v*g7XNn%x1ex!MUtq}&#w&!{_sjDdlS-ZXDCqBhSMw7 zHBJovq0?KtRx>;tsCuP26u*RMS6h=$Ql6Z37lBYNe*6^LI%|&38D7xEALafhgPFh6 z#!ll`7|c>Tk}Yo?=k;SOcC7Xki@HK?)2pqQoB%(^0WMf8?fQZpuq715j@5!r5ssgi z9a^-zuFVQwq3Dk01RL)NJZqAF(4Xb{^Hkc1_x}JBAs%rT@uK^~(f5*<;(>=o5Q_eT zwnP2?5sKFp(f()kdC9v-;yV$wL%UuL1)l#0=-eZlM8`+y4g0&^LeOOVn(XkRck6$i z_%|@@t0L$j&m(_H6}eBoHFU1u8{znO$@xb8)xw~;!Q2clXMeYm|3 zedMNq`FG7jW`#GCLw^puzX0o7*7em=Q!(}hdJ+DjA`;JxE2x=@nZokz+chS#XjEAVV zV)n(Mz#n$_wC)9}(52Tv>aW|7njr$(hf3J@Zo@HbwYPSq!w8R7dkjZkk@on6hU~vX z8tRWjg?p+AK=DR$sme0haVzXduZ=>4`k(d-_1op(awoQtMtULE2{V6-rzXVX99%zl zch>hO`sm+$`IqCP^@Vb2-_=IvS5{g@mCh4i(MQebY?+TVNf_4p(R47y6X@XjW_H?b z$1t~JKgi~eXF3d#GtfGXVDIXIfY((nuK)@V1-<4BVncLpNc0J7pEHU&+d~c?WN5=` z)#lfEsI42Oh`L{4qCx+j#sTjhjJCUd z#)JHxE~P;>T8R@>f@hHGbsIo>0SD5)l%Qv zhH;oBT5Hf?pd0xoFsunSQeJmMKRo2GUcP(x5TvoAzW;r&AAMD~Rs9&e+x-nMnmd_X zI%iydE)Qm%C@xZ7rlQS(rt8%D@(sfBEE!vuiX^0;5nSAXBIoFJ$)m%u!R?5y z)!FNK%+KcR< z4&Y5nLNy8=EymCDUBEMr{k=cj&h}K$- zdYtTC9Xk{U$3TkZ zjt&-aacX!gduA__NHEtj;lumi@S%;TQu(h|$hI=W2EkUr3K5%A$ggQ0--P|(b>PB6 zB16p`cxyLvBC$Ble+87)?~rk8h?D09!W)@jkSrl*(GNbY!zw6-({&5n+V>oxqCi_j zCX@u)Y}CHcOb@z2UwKkfX#E|dQ@(}%a|zO|3c8@InR zmVY6y?7pvf?9oRb<-m*$OIj|I_}?#_~-UQZpCLo(TMFa@X_bB4(76&FnrWqlv_;H1SKH z!#Vzs54-peIF|qi4;>cEUq~g)GaSu^+|Fa7QF$=U6kzr+i#SX7tU3#o;dT8uqClcB zK9IRv!sDB{ka)Nt=w(BC;eujLBJlvz>>Vy(&hfz4F?=1yo^C;qiqY_^3W`$?rKyK8 z_JQ%H#FRYrF+~=cq6!=&HYA5SK=x>JB;UCHg~zJ+ zgkF`;3F*~=$J?DuU&sBXm8&q3p&JZ-8LnU@c*i+Zo z5w7J||JajdCkx>3F0x5%p*t+xT~wp2VsA=RelPB4iViL^SGFIpYv&_!!3)Cg>gR&g zi~la`H(0c@5KYotzoGkFZca=)=(a$5{OtTIfi}CZ?=dccj*ZK+^Y4LY95uMr-OL26 z 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

!KeL;T0`mHG(t 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 ?Mn&jw~`7a;9p;ANR&ixFRgK>3}7m{*7} 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ΠHcAY${9) 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%0AWsK%`mhSn9IG6Ky>s91hq-G0t}`}+z8ksK$fd-w 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 literal 0 HcmV?d00001 diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go index b3e407fcaa7..66f3da7d659 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go @@ -15,8 +15,6 @@ func FunctionWithSliceParameter(s []string) string { func FunctionWithVarArgsParameter(s ...string) string { return "" } -func FunctionWithVarArgsOutParameter(in string, out ...*string) { -} func FunctionWithSliceOfStructsParameter(s []A) string { return "" diff --git a/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/StoredXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/StoredXss.expected index 7524dd0f410..861e3e97ed1 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/StoredXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/StoredXss.expected @@ -24,11 +24,7 @@ edges | test.go:148:16:148:23 | &... | test.go:149:13:149:39 | type conversion | provenance | | | test.go:152:15:152:24 | &... | test.go:153:13:153:47 | type conversion | provenance | | | test.go:156:18:156:30 | &... | test.go:157:13:157:38 | type conversion | provenance | | -| test.go:160:2:160:23 | []type{args} [array] | test.go:160:14:160:22 | &... | provenance | | -| test.go:160:14:160:22 | &... | test.go:160:2:160:23 | []type{args} [array] | provenance | | | test.go:160:14:160:22 | &... | test.go:161:13:161:28 | type conversion | provenance | | -| test.go:164:2:164:25 | []type{args} [array] | test.go:164:15:164:24 | &... | provenance | | -| test.go:164:15:164:24 | &... | test.go:164:2:164:25 | []type{args} [array] | provenance | | | test.go:164:15:164:24 | &... | test.go:165:13:165:32 | type conversion | provenance | | nodes | test.go:80:13:80:16 | &... | semmle.label | &... | @@ -80,10 +76,8 @@ nodes | test.go:153:13:153:47 | type conversion | semmle.label | type conversion | | test.go:156:18:156:30 | &... | semmle.label | &... | | test.go:157:13:157:38 | type conversion | semmle.label | type conversion | -| test.go:160:2:160:23 | []type{args} [array] | semmle.label | []type{args} [array] | | test.go:160:14:160:22 | &... | semmle.label | &... | | test.go:161:13:161:28 | type conversion | semmle.label | type conversion | -| test.go:164:2:164:25 | []type{args} [array] | semmle.label | []type{args} [array] | | test.go:164:15:164:24 | &... | semmle.label | &... | | test.go:165:13:165:32 | type conversion | semmle.label | type conversion | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected b/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected index a0b34cd05b4..12be518a98b 100644 --- a/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected +++ b/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected @@ -3,15 +3,12 @@ edges | StoredCommand.go:11:2:11:27 | ... := ...[0] | StoredCommand.go:13:2:13:5 | rows | provenance | | | StoredCommand.go:13:2:13:5 | rows | StoredCommand.go:13:12:13:19 | &... | provenance | FunctionModel | -| StoredCommand.go:13:2:13:20 | []type{args} [array] | StoredCommand.go:13:12:13:19 | &... | provenance | | -| StoredCommand.go:13:12:13:19 | &... | StoredCommand.go:13:2:13:20 | []type{args} [array] | provenance | | | StoredCommand.go:13:12:13:19 | &... | StoredCommand.go:14:22:14:28 | cmdName | provenance | Sink:MaD:1 | models | 1 | Sink: os/exec; ; false; Command; ; ; Argument[0]; command-injection; manual | nodes | StoredCommand.go:11:2:11:27 | ... := ...[0] | semmle.label | ... := ...[0] | | StoredCommand.go:13:2:13:5 | rows | semmle.label | rows | -| StoredCommand.go:13:2:13:20 | []type{args} [array] | semmle.label | []type{args} [array] | | StoredCommand.go:13:12:13:19 | &... | semmle.label | &... | | StoredCommand.go:14:22:14:28 | cmdName | semmle.label | cmdName | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected index 321b1740c23..647113f3c6b 100644 --- a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected +++ b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected @@ -32,10 +32,8 @@ edges | contenttype.go:113:10:113:28 | call to FormValue | contenttype.go:114:50:114:53 | data | provenance | Src:MaD:8 | | reflectedxsstest.go:31:2:31:44 | ... := ...[0] | reflectedxsstest.go:32:34:32:37 | file | provenance | Src:MaD:7 | | reflectedxsstest.go:31:2:31:44 | ... := ...[1] | reflectedxsstest.go:34:46:34:60 | selection of Filename | provenance | Src:MaD:7 | -| reflectedxsstest.go:32:2:32:8 | definition of content | reflectedxsstest.go:33:49:33:55 | content | provenance | | | reflectedxsstest.go:32:2:32:38 | ... := ...[0] | reflectedxsstest.go:33:49:33:55 | content | provenance | | | reflectedxsstest.go:32:34:32:37 | file | reflectedxsstest.go:32:2:32:38 | ... := ...[0] | provenance | MaD:13 | -| reflectedxsstest.go:33:17:33:56 | []type{args} [array] | reflectedxsstest.go:32:2:32:8 | definition of content | provenance | | | reflectedxsstest.go:33:17:33:56 | []type{args} [array] | reflectedxsstest.go:33:17:33:56 | call to Sprintf | provenance | MaD:12 | | reflectedxsstest.go:33:17:33:56 | call to Sprintf | reflectedxsstest.go:33:10:33:57 | type conversion | provenance | | | reflectedxsstest.go:33:49:33:55 | content | reflectedxsstest.go:33:17:33:56 | []type{args} [array] | provenance | | @@ -65,33 +63,11 @@ edges | tst.go:48:14:48:19 | selection of Form | tst.go:48:14:48:34 | call to Get | provenance | Src:MaD:6 MaD:18 | | tst.go:48:14:48:34 | call to Get | tst.go:53:12:53:26 | type conversion | provenance | | | websocketXss.go:30:7:30:10 | definition of xnet | websocketXss.go:32:24:32:27 | xnet | provenance | Src:MaD:5 | -| websocketXss.go:30:7:30:10 | definition of xnet | websocketXss.go:32:24:32:27 | xnet | provenance | Src:MaD:5 | -| websocketXss.go:32:3:32:28 | []type{args} [array] | websocketXss.go:30:7:30:10 | definition of xnet | provenance | | -| websocketXss.go:32:24:32:27 | xnet | websocketXss.go:32:3:32:28 | []type{args} [array] | provenance | | | websocketXss.go:34:3:34:7 | definition of xnet2 | websocketXss.go:36:24:36:28 | xnet2 | provenance | Src:MaD:4 | -| websocketXss.go:34:3:34:7 | definition of xnet2 | websocketXss.go:36:24:36:28 | xnet2 | provenance | Src:MaD:4 | -| websocketXss.go:36:3:36:29 | []type{args} [array] | websocketXss.go:34:3:34:7 | definition of xnet2 | provenance | | -| websocketXss.go:36:24:36:28 | xnet2 | websocketXss.go:36:3:36:29 | []type{args} [array] | provenance | | | websocketXss.go:40:3:40:40 | ... := ...[1] | websocketXss.go:41:24:41:29 | nhooyr | provenance | Src:MaD:11 | -| websocketXss.go:40:3:40:40 | ... := ...[1] | websocketXss.go:41:24:41:29 | nhooyr | provenance | Src:MaD:11 | -| websocketXss.go:40:6:40:11 | definition of nhooyr | websocketXss.go:41:24:41:29 | nhooyr | provenance | | -| websocketXss.go:40:6:40:11 | definition of nhooyr | websocketXss.go:41:24:41:29 | nhooyr | provenance | | -| websocketXss.go:41:3:41:30 | []type{args} [array] | websocketXss.go:40:6:40:11 | definition of nhooyr | provenance | | -| websocketXss.go:41:24:41:29 | nhooyr | websocketXss.go:41:3:41:30 | []type{args} [array] | provenance | | | websocketXss.go:46:7:46:16 | definition of gorillaMsg | websocketXss.go:48:24:48:33 | gorillaMsg | provenance | Src:MaD:1 | -| websocketXss.go:46:7:46:16 | definition of gorillaMsg | websocketXss.go:48:24:48:33 | gorillaMsg | provenance | Src:MaD:1 | -| websocketXss.go:48:3:48:34 | []type{args} [array] | websocketXss.go:46:7:46:16 | definition of gorillaMsg | provenance | | -| websocketXss.go:48:24:48:33 | gorillaMsg | websocketXss.go:48:3:48:34 | []type{args} [array] | provenance | | | websocketXss.go:50:3:50:10 | definition of gorilla2 | websocketXss.go:52:24:52:31 | gorilla2 | provenance | Src:MaD:2 | -| websocketXss.go:50:3:50:10 | definition of gorilla2 | websocketXss.go:52:24:52:31 | gorilla2 | provenance | Src:MaD:2 | -| websocketXss.go:52:3:52:32 | []type{args} [array] | websocketXss.go:50:3:50:10 | definition of gorilla2 | provenance | | -| websocketXss.go:52:24:52:31 | gorilla2 | websocketXss.go:52:3:52:32 | []type{args} [array] | provenance | | | websocketXss.go:54:3:54:38 | ... := ...[1] | websocketXss.go:55:24:55:31 | gorilla3 | provenance | Src:MaD:3 | -| websocketXss.go:54:3:54:38 | ... := ...[1] | websocketXss.go:55:24:55:31 | gorilla3 | provenance | Src:MaD:3 | -| websocketXss.go:54:6:54:13 | definition of gorilla3 | websocketXss.go:55:24:55:31 | gorilla3 | provenance | | -| websocketXss.go:54:6:54:13 | definition of gorilla3 | websocketXss.go:55:24:55:31 | gorilla3 | provenance | | -| websocketXss.go:55:3:55:32 | []type{args} [array] | websocketXss.go:54:6:54:13 | definition of gorilla3 | provenance | | -| websocketXss.go:55:24:55:31 | gorilla3 | websocketXss.go:55:3:55:32 | []type{args} [array] | provenance | | models | 1 | Source: github.com/gorilla/websocket; ; false; ReadJSON; ; ; Argument[1]; remote; manual | | 2 | Source: github.com/gorilla/websocket; Conn; true; ReadJSON; ; ; Argument[0]; remote; manual | @@ -132,7 +108,6 @@ nodes | contenttype.go:114:50:114:53 | data | semmle.label | data | | reflectedxsstest.go:31:2:31:44 | ... := ...[0] | semmle.label | ... := ...[0] | | reflectedxsstest.go:31:2:31:44 | ... := ...[1] | semmle.label | ... := ...[1] | -| reflectedxsstest.go:32:2:32:8 | definition of content | semmle.label | definition of content | | reflectedxsstest.go:32:2:32:38 | ... := ...[0] | semmle.label | ... := ...[0] | | reflectedxsstest.go:32:34:32:37 | file | semmle.label | file | | reflectedxsstest.go:33:10:33:57 | type conversion | semmle.label | type conversion | @@ -167,29 +142,15 @@ nodes | tst.go:48:14:48:34 | call to Get | semmle.label | call to Get | | tst.go:53:12:53:26 | type conversion | semmle.label | type conversion | | websocketXss.go:30:7:30:10 | definition of xnet | semmle.label | definition of xnet | -| websocketXss.go:32:3:32:28 | []type{args} [array] | semmle.label | []type{args} [array] | -| websocketXss.go:32:24:32:27 | xnet | semmle.label | xnet | | websocketXss.go:32:24:32:27 | xnet | semmle.label | xnet | | websocketXss.go:34:3:34:7 | definition of xnet2 | semmle.label | definition of xnet2 | -| websocketXss.go:36:3:36:29 | []type{args} [array] | semmle.label | []type{args} [array] | -| websocketXss.go:36:24:36:28 | xnet2 | semmle.label | xnet2 | | websocketXss.go:36:24:36:28 | xnet2 | semmle.label | xnet2 | | websocketXss.go:40:3:40:40 | ... := ...[1] | semmle.label | ... := ...[1] | -| websocketXss.go:40:6:40:11 | definition of nhooyr | semmle.label | definition of nhooyr | -| websocketXss.go:41:3:41:30 | []type{args} [array] | semmle.label | []type{args} [array] | -| websocketXss.go:41:24:41:29 | nhooyr | semmle.label | nhooyr | | websocketXss.go:41:24:41:29 | nhooyr | semmle.label | nhooyr | | websocketXss.go:46:7:46:16 | definition of gorillaMsg | semmle.label | definition of gorillaMsg | -| websocketXss.go:48:3:48:34 | []type{args} [array] | semmle.label | []type{args} [array] | -| websocketXss.go:48:24:48:33 | gorillaMsg | semmle.label | gorillaMsg | | websocketXss.go:48:24:48:33 | gorillaMsg | semmle.label | gorillaMsg | | websocketXss.go:50:3:50:10 | definition of gorilla2 | semmle.label | definition of gorilla2 | -| websocketXss.go:52:3:52:32 | []type{args} [array] | semmle.label | []type{args} [array] | -| websocketXss.go:52:24:52:31 | gorilla2 | semmle.label | gorilla2 | | websocketXss.go:52:24:52:31 | gorilla2 | semmle.label | gorilla2 | | websocketXss.go:54:3:54:38 | ... := ...[1] | semmle.label | ... := ...[1] | -| websocketXss.go:54:6:54:13 | definition of gorilla3 | semmle.label | definition of gorilla3 | -| websocketXss.go:55:3:55:32 | []type{args} [array] | semmle.label | []type{args} [array] | -| websocketXss.go:55:24:55:31 | gorilla3 | semmle.label | gorilla3 | | websocketXss.go:55:24:55:31 | gorilla3 | semmle.label | gorilla3 | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected b/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected index ebeedf3d0ef..efe98650a4e 100644 --- a/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected +++ b/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected @@ -1,12 +1,7 @@ edges | StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | provenance | | | stored.go:18:3:18:28 | ... := ...[0] | stored.go:25:14:25:17 | rows | provenance | | -| stored.go:25:14:25:17 | rows | stored.go:25:24:25:26 | &... | provenance | FunctionModel | | stored.go:25:14:25:17 | rows | stored.go:25:29:25:33 | &... | provenance | FunctionModel | -| stored.go:25:14:25:34 | []type{args} [array] | stored.go:25:24:25:26 | &... | provenance | | -| stored.go:25:14:25:34 | []type{args} [array] | stored.go:25:29:25:33 | &... | provenance | | -| stored.go:25:24:25:26 | &... | stored.go:25:14:25:34 | []type{args} [array] | provenance | | -| stored.go:25:29:25:33 | &... | stored.go:25:14:25:34 | []type{args} [array] | provenance | | | stored.go:25:29:25:33 | &... | stored.go:30:22:30:25 | name | provenance | | | stored.go:59:30:59:33 | definition of path | stored.go:61:22:61:25 | path | provenance | | nodes @@ -14,8 +9,6 @@ nodes | StoredXss.go:13:21:13:36 | ...+... | semmle.label | ...+... | | stored.go:18:3:18:28 | ... := ...[0] | semmle.label | ... := ...[0] | | stored.go:25:14:25:17 | rows | semmle.label | rows | -| stored.go:25:14:25:34 | []type{args} [array] | semmle.label | []type{args} [array] | -| stored.go:25:24:25:26 | &... | semmle.label | &... | | stored.go:25:29:25:33 | &... | semmle.label | &... | | stored.go:30:22:30:25 | name | semmle.label | name | | stored.go:59:30:59:33 | definition of path | semmle.label | definition of path | diff --git a/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected b/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected index 9a7084ac836..1ce8c3d1dcf 100644 --- a/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected @@ -26,7 +26,6 @@ | mongoDB.go:81:18:81:25 | pipeline | mongoDB.go:40:20:40:30 | call to Referer | mongoDB.go:81:18:81:25 | pipeline | This query depends on a $@. | mongoDB.go:40:20:40:30 | call to Referer | user-provided value | edges | SqlInjection.go:10:7:11:30 | []type{args} [array] | SqlInjection.go:10:7:11:30 | call to Sprintf | provenance | MaD:23 | -| SqlInjection.go:10:7:11:30 | []type{args} [array] | SqlInjection.go:11:3:11:29 | index expression | provenance | | | SqlInjection.go:10:7:11:30 | call to Sprintf | SqlInjection.go:12:11:12:11 | q | provenance | Sink:MaD:1 | | SqlInjection.go:11:3:11:9 | selection of URL | SqlInjection.go:11:3:11:17 | call to Query | provenance | Src:MaD:21 MaD:26 | | SqlInjection.go:11:3:11:17 | call to Query | SqlInjection.go:11:3:11:29 | index expression | provenance | | @@ -37,7 +36,6 @@ edges | issue48.go:18:17:18:17 | b | issue48.go:18:20:18:39 | &... | provenance | MaD:22 | | issue48.go:18:20:18:39 | &... | issue48.go:21:3:21:33 | index expression | provenance | | | issue48.go:20:8:21:34 | []type{args} [array] | issue48.go:20:8:21:34 | call to Sprintf | provenance | MaD:23 | -| issue48.go:20:8:21:34 | []type{args} [array] | issue48.go:21:3:21:33 | index expression | provenance | | | issue48.go:20:8:21:34 | call to Sprintf | issue48.go:22:11:22:12 | q3 | provenance | Sink:MaD:1 | | issue48.go:21:3:21:33 | index expression | issue48.go:20:8:21:34 | []type{args} [array] | provenance | | | issue48.go:21:3:21:33 | index expression | issue48.go:20:8:21:34 | call to Sprintf | provenance | FunctionModel | @@ -46,7 +44,6 @@ edges | issue48.go:28:17:28:18 | b2 | issue48.go:28:21:28:41 | &... | provenance | MaD:22 | | issue48.go:28:21:28:41 | &... | issue48.go:31:3:31:31 | selection of Category | provenance | | | issue48.go:30:8:31:32 | []type{args} [array] | issue48.go:30:8:31:32 | call to Sprintf | provenance | MaD:23 | -| issue48.go:30:8:31:32 | []type{args} [array] | issue48.go:31:3:31:31 | selection of Category | provenance | | | issue48.go:30:8:31:32 | call to Sprintf | issue48.go:32:11:32:12 | q4 | provenance | Sink:MaD:1 | | issue48.go:31:3:31:31 | selection of Category | issue48.go:30:8:31:32 | []type{args} [array] | provenance | | | issue48.go:31:3:31:31 | selection of Category | issue48.go:30:8:31:32 | call to Sprintf | provenance | FunctionModel | @@ -55,13 +52,11 @@ edges | issue48.go:37:24:37:38 | call to Query | issue48.go:37:17:37:50 | type conversion | provenance | | | issue48.go:37:53:37:73 | &... | issue48.go:40:3:40:31 | selection of Category | provenance | | | issue48.go:39:8:40:32 | []type{args} [array] | issue48.go:39:8:40:32 | call to Sprintf | provenance | MaD:23 | -| issue48.go:39:8:40:32 | []type{args} [array] | issue48.go:40:3:40:31 | selection of Category | provenance | | | issue48.go:39:8:40:32 | call to Sprintf | issue48.go:41:11:41:12 | q5 | provenance | Sink:MaD:1 | | issue48.go:40:3:40:31 | selection of Category | issue48.go:39:8:40:32 | []type{args} [array] | provenance | | | issue48.go:40:3:40:31 | selection of Category | issue48.go:39:8:40:32 | call to Sprintf | provenance | FunctionModel | | main.go:11:11:11:16 | selection of Form | main.go:11:11:11:28 | index expression | provenance | Src:MaD:18 Sink:MaD:1 | | main.go:15:11:15:84 | []type{args} [array] | main.go:15:11:15:84 | call to Sprintf | provenance | MaD:23 Sink:MaD:2 | -| main.go:15:11:15:84 | []type{args} [array] | main.go:15:63:15:83 | index expression | provenance | | | main.go:15:63:15:67 | selection of URL | main.go:15:63:15:75 | call to Query | provenance | Src:MaD:21 MaD:26 | | main.go:15:63:15:75 | call to Query | main.go:15:63:15:83 | index expression | provenance | | | main.go:15:63:15:83 | index expression | main.go:15:11:15:84 | []type{args} [array] | provenance | | @@ -76,7 +71,6 @@ edges | main.go:30:13:30:27 | call to Query | main.go:30:13:30:39 | index expression | provenance | | | main.go:30:13:30:39 | index expression | main.go:28:18:31:2 | struct literal [Category] | provenance | | | main.go:33:7:34:23 | []type{args} [array] | main.go:33:7:34:23 | call to Sprintf | provenance | MaD:23 | -| main.go:33:7:34:23 | []type{args} [array] | main.go:34:3:34:22 | selection of Category | provenance | | | main.go:33:7:34:23 | call to Sprintf | main.go:35:11:35:11 | q | provenance | Sink:MaD:1 | | main.go:34:3:34:13 | RequestData [pointer, Category] | main.go:34:3:34:13 | implicit dereference [Category] | provenance | | | main.go:34:3:34:13 | implicit dereference [Category] | main.go:34:3:34:22 | selection of Category | provenance | | @@ -90,7 +84,6 @@ edges | main.go:40:25:40:39 | call to Query | main.go:40:25:40:51 | index expression | provenance | | | main.go:40:25:40:51 | index expression | main.go:40:2:40:12 | implicit dereference [Category] | provenance | | | main.go:42:7:43:23 | []type{args} [array] | main.go:42:7:43:23 | call to Sprintf | provenance | MaD:23 | -| main.go:42:7:43:23 | []type{args} [array] | main.go:43:3:43:22 | selection of Category | provenance | | | main.go:42:7:43:23 | call to Sprintf | main.go:44:11:44:11 | q | provenance | Sink:MaD:1 | | main.go:43:3:43:13 | RequestData [pointer, Category] | main.go:43:3:43:13 | implicit dereference [Category] | provenance | | | main.go:43:3:43:13 | implicit dereference [Category] | main.go:43:3:43:22 | selection of Category | provenance | | @@ -104,7 +97,6 @@ edges | main.go:49:28:49:42 | call to Query | main.go:49:28:49:54 | index expression | provenance | | | main.go:49:28:49:54 | index expression | main.go:49:3:49:14 | star expression [Category] | provenance | | | main.go:51:7:52:23 | []type{args} [array] | main.go:51:7:52:23 | call to Sprintf | provenance | MaD:23 | -| main.go:51:7:52:23 | []type{args} [array] | main.go:52:3:52:22 | selection of Category | provenance | | | main.go:51:7:52:23 | call to Sprintf | main.go:53:11:53:11 | q | provenance | Sink:MaD:1 | | main.go:52:3:52:13 | RequestData [pointer, Category] | main.go:52:3:52:13 | implicit dereference [Category] | provenance | | | main.go:52:3:52:13 | implicit dereference [Category] | main.go:52:3:52:22 | selection of Category | provenance | | @@ -118,7 +110,6 @@ edges | main.go:58:28:58:42 | call to Query | main.go:58:28:58:54 | index expression | provenance | | | main.go:58:28:58:54 | index expression | main.go:58:3:58:14 | star expression [Category] | provenance | | | main.go:60:7:61:26 | []type{args} [array] | main.go:60:7:61:26 | call to Sprintf | provenance | MaD:23 | -| main.go:60:7:61:26 | []type{args} [array] | main.go:61:3:61:25 | selection of Category | provenance | | | main.go:60:7:61:26 | call to Sprintf | main.go:62:11:62:11 | q | provenance | Sink:MaD:1 | | main.go:61:3:61:25 | selection of Category | main.go:60:7:61:26 | []type{args} [array] | provenance | | | main.go:61:3:61:25 | selection of Category | main.go:60:7:61:26 | call to Sprintf | provenance | FunctionModel | diff --git a/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected b/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected index a3d0c59798f..5deab249337 100644 --- a/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected +++ b/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected @@ -3,12 +3,7 @@ | StringBreakMismatched.go:17:26:17:32 | escaped | StringBreakMismatched.go:12:2:12:40 | ... := ...[0] | StringBreakMismatched.go:17:26:17:32 | escaped | If this $@ contains a single quote, it could break out of the enclosing quotes. | StringBreakMismatched.go:12:2:12:40 | ... := ...[0] | JSON value | | StringBreakMismatched.go:29:27:29:33 | escaped | StringBreakMismatched.go:24:2:24:40 | ... := ...[0] | StringBreakMismatched.go:29:27:29:33 | escaped | If this $@ contains a double quote, it could break out of the enclosing quotes. | StringBreakMismatched.go:24:2:24:40 | ... := ...[0] | JSON value | edges -| StringBreak.go:10:2:10:12 | definition of versionJSON | StringBreak.go:14:47:14:57 | versionJSON | provenance | | -| StringBreak.go:10:2:10:12 | definition of versionJSON | StringBreak.go:14:47:14:57 | versionJSON | provenance | | | StringBreak.go:10:2:10:40 | ... := ...[0] | StringBreak.go:14:47:14:57 | versionJSON | provenance | | -| StringBreak.go:10:2:10:40 | ... := ...[0] | StringBreak.go:14:47:14:57 | versionJSON | provenance | | -| StringBreak.go:14:22:14:58 | []type{args} [array] | StringBreak.go:10:2:10:12 | definition of versionJSON | provenance | | -| StringBreak.go:14:47:14:57 | versionJSON | StringBreak.go:14:22:14:58 | []type{args} [array] | provenance | | | StringBreakMismatched.go:12:2:12:40 | ... := ...[0] | StringBreakMismatched.go:13:29:13:47 | type conversion | provenance | | | StringBreakMismatched.go:13:13:13:62 | call to Replace | StringBreakMismatched.go:17:26:17:32 | escaped | provenance | | | StringBreakMismatched.go:13:29:13:47 | type conversion | StringBreakMismatched.go:13:13:13:62 | call to Replace | provenance | MaD:1 | @@ -18,10 +13,7 @@ edges models | 1 | Summary: strings; ; false; Replace; ; ; Argument[0]; ReturnValue; taint; manual | nodes -| StringBreak.go:10:2:10:12 | definition of versionJSON | semmle.label | definition of versionJSON | | StringBreak.go:10:2:10:40 | ... := ...[0] | semmle.label | ... := ...[0] | -| StringBreak.go:14:22:14:58 | []type{args} [array] | semmle.label | []type{args} [array] | -| StringBreak.go:14:47:14:57 | versionJSON | semmle.label | versionJSON | | StringBreak.go:14:47:14:57 | versionJSON | semmle.label | versionJSON | | StringBreakMismatched.go:12:2:12:40 | ... := ...[0] | semmle.label | ... := ...[0] | | StringBreakMismatched.go:13:13:13:62 | call to Replace | semmle.label | call to Replace | diff --git a/go/ql/test/query-tests/Security/CWE-209/StackTraceExposure.expected b/go/ql/test/query-tests/Security/CWE-209/StackTraceExposure.expected index b3396e7451b..c62c6126648 100644 --- a/go/ql/test/query-tests/Security/CWE-209/StackTraceExposure.expected +++ b/go/ql/test/query-tests/Security/CWE-209/StackTraceExposure.expected @@ -1,16 +1,8 @@ edges | test.go:14:2:14:4 | definition of buf | test.go:17:10:17:12 | buf | provenance | | -| test.go:14:2:14:4 | definition of buf | test.go:20:29:20:31 | buf | provenance | | -| test.go:15:2:15:4 | definition of buf | test.go:17:10:17:12 | buf | provenance | | -| test.go:15:2:15:4 | definition of buf | test.go:20:29:20:31 | buf | provenance | | -| test.go:20:2:20:32 | []type{args} [array] | test.go:15:2:15:4 | definition of buf | provenance | | -| test.go:20:29:20:31 | buf | test.go:20:2:20:32 | []type{args} [array] | provenance | | nodes | test.go:14:2:14:4 | definition of buf | semmle.label | definition of buf | -| test.go:15:2:15:4 | definition of buf | semmle.label | definition of buf | | test.go:17:10:17:12 | buf | semmle.label | buf | -| test.go:20:2:20:32 | []type{args} [array] | semmle.label | []type{args} [array] | -| test.go:20:29:20:31 | buf | semmle.label | buf | subpaths #select | test.go:17:10:17:12 | buf | test.go:14:2:14:4 | definition of buf | test.go:17:10:17:12 | buf | HTTP response depends on $@ and may be exposed to an external user. | test.go:14:2:14:4 | definition of buf | stack trace information | diff --git a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected index 31f709e456f..3435eff7775 100644 --- a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected +++ b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected @@ -64,61 +64,28 @@ edges | passwords.go:8:12:8:12 | definition of x | passwords.go:9:14:9:14 | x | provenance | | | passwords.go:30:8:30:15 | password | passwords.go:8:12:8:12 | definition of x | provenance | | | passwords.go:34:28:34:35 | password | passwords.go:34:14:34:35 | ...+... | provenance | Config | -| passwords.go:36:2:36:5 | definition of obj1 | passwords.go:39:14:39:17 | obj1 | provenance | | -| passwords.go:36:2:36:5 | definition of obj1 | passwords.go:39:14:39:17 | obj1 | provenance | | -| passwords.go:36:10:38:2 | struct literal | passwords.go:39:14:39:17 | obj1 | provenance | | | passwords.go:36:10:38:2 | struct literal | passwords.go:39:14:39:17 | obj1 | provenance | | | passwords.go:37:13:37:13 | x | passwords.go:36:10:38:2 | struct literal | provenance | Config | -| passwords.go:39:2:39:18 | []type{args} [array] | passwords.go:36:2:36:5 | definition of obj1 | provenance | | -| passwords.go:39:14:39:17 | obj1 | passwords.go:39:2:39:18 | []type{args} [array] | provenance | | -| passwords.go:41:2:41:5 | definition of obj2 | passwords.go:44:14:44:17 | obj2 | provenance | | -| passwords.go:41:2:41:5 | definition of obj2 | passwords.go:44:14:44:17 | obj2 | provenance | | -| passwords.go:41:10:43:2 | struct literal | passwords.go:44:14:44:17 | obj2 | provenance | | | passwords.go:41:10:43:2 | struct literal | passwords.go:44:14:44:17 | obj2 | provenance | | | passwords.go:42:6:42:13 | password | passwords.go:41:10:43:2 | struct literal | provenance | Config | -| passwords.go:44:2:44:18 | []type{args} [array] | passwords.go:41:2:41:5 | definition of obj2 | provenance | | -| passwords.go:44:14:44:17 | obj2 | passwords.go:44:2:44:18 | []type{args} [array] | provenance | | | passwords.go:46:6:46:9 | definition of obj3 | passwords.go:47:14:47:17 | obj3 | provenance | | -| passwords.go:46:6:46:9 | definition of obj3 | passwords.go:47:14:47:17 | obj3 | provenance | | -| passwords.go:47:2:47:18 | []type{args} [array] | passwords.go:46:6:46:9 | definition of obj3 | provenance | | -| passwords.go:47:14:47:17 | obj3 | passwords.go:47:2:47:18 | []type{args} [array] | provenance | | | passwords.go:48:11:48:18 | password | passwords.go:46:6:46:9 | definition of obj3 | provenance | Config | -| passwords.go:85:2:85:14 | definition of utilityObject | passwords.go:88:14:88:26 | utilityObject | provenance | | -| passwords.go:85:2:85:14 | definition of utilityObject | passwords.go:88:14:88:26 | utilityObject | provenance | | -| passwords.go:85:19:87:2 | struct literal | passwords.go:88:14:88:26 | utilityObject | provenance | | | passwords.go:85:19:87:2 | struct literal | passwords.go:88:14:88:26 | utilityObject | provenance | | | passwords.go:86:16:86:36 | call to make | passwords.go:85:19:87:2 | struct literal | provenance | Config | -| passwords.go:88:2:88:27 | []type{args} [array] | passwords.go:85:2:85:14 | definition of utilityObject | provenance | | -| passwords.go:88:14:88:26 | utilityObject | passwords.go:88:2:88:27 | []type{args} [array] | provenance | | | passwords.go:90:12:90:19 | password | passwords.go:91:23:91:28 | secret | provenance | | | passwords.go:101:33:101:40 | password | passwords.go:101:15:101:40 | ...+... | provenance | Config | | passwords.go:107:34:107:41 | password | passwords.go:107:16:107:41 | ...+... | provenance | Config | | passwords.go:112:33:112:40 | password | passwords.go:112:15:112:40 | ...+... | provenance | Config | | passwords.go:116:28:116:36 | password1 | passwords.go:116:28:116:45 | call to String | provenance | Config | | passwords.go:116:28:116:45 | call to String | passwords.go:116:14:116:45 | ...+... | provenance | Config | -| passwords.go:118:2:118:7 | definition of config | passwords.go:125:14:125:19 | config | provenance | | -| passwords.go:118:2:118:7 | definition of config | passwords.go:125:14:125:19 | config | provenance | | -| passwords.go:118:2:118:7 | definition of config [x] | passwords.go:125:14:125:19 | config [x] | provenance | | -| passwords.go:118:2:118:7 | definition of config [x] | passwords.go:126:14:126:19 | config [x] | provenance | | -| passwords.go:118:2:118:7 | definition of config [y] | passwords.go:125:14:125:19 | config [y] | provenance | | -| passwords.go:118:2:118:7 | definition of config [y] | passwords.go:127:14:127:19 | config [y] | provenance | | | passwords.go:118:12:123:2 | struct literal | passwords.go:125:14:125:19 | config | provenance | | -| passwords.go:118:12:123:2 | struct literal | passwords.go:125:14:125:19 | config | provenance | | -| passwords.go:118:12:123:2 | struct literal [x] | passwords.go:125:14:125:19 | config [x] | provenance | | | passwords.go:118:12:123:2 | struct literal [x] | passwords.go:126:14:126:19 | config [x] | provenance | | -| passwords.go:118:12:123:2 | struct literal [y] | passwords.go:125:14:125:19 | config [y] | provenance | | | passwords.go:118:12:123:2 | struct literal [y] | passwords.go:127:14:127:19 | config [y] | provenance | | | passwords.go:119:13:119:13 | x | passwords.go:118:12:123:2 | struct literal | provenance | Config | | passwords.go:121:13:121:20 | password | passwords.go:118:12:123:2 | struct literal | provenance | Config | | passwords.go:121:13:121:20 | password | passwords.go:118:12:123:2 | struct literal [x] | provenance | | | passwords.go:122:13:122:25 | call to getPassword | passwords.go:118:12:123:2 | struct literal | provenance | Config | | passwords.go:122:13:122:25 | call to getPassword | passwords.go:118:12:123:2 | struct literal [y] | provenance | | -| passwords.go:125:2:125:20 | []type{args} [array, x] | passwords.go:118:2:118:7 | definition of config [x] | provenance | | -| passwords.go:125:2:125:20 | []type{args} [array, y] | passwords.go:118:2:118:7 | definition of config [y] | provenance | | -| passwords.go:125:2:125:20 | []type{args} [array] | passwords.go:118:2:118:7 | definition of config | provenance | | -| passwords.go:125:14:125:19 | config | passwords.go:125:2:125:20 | []type{args} [array] | provenance | | -| passwords.go:125:14:125:19 | config [x] | passwords.go:125:2:125:20 | []type{args} [array, x] | provenance | | -| passwords.go:125:14:125:19 | config [y] | passwords.go:125:2:125:20 | []type{args} [array, y] | provenance | | | passwords.go:126:14:126:19 | config [x] | passwords.go:126:14:126:21 | selection of x | provenance | | | passwords.go:127:14:127:19 | config [y] | passwords.go:127:14:127:21 | selection of y | provenance | | | protobuf.go:11:2:11:6 | definition of query [pointer, Description] | protobuf.go:12:2:12:6 | query [pointer, Description] | provenance | | @@ -182,29 +149,18 @@ nodes | passwords.go:32:12:32:19 | password | semmle.label | password | | passwords.go:34:14:34:35 | ...+... | semmle.label | ...+... | | passwords.go:34:28:34:35 | password | semmle.label | password | -| passwords.go:36:2:36:5 | definition of obj1 | semmle.label | definition of obj1 | | passwords.go:36:10:38:2 | struct literal | semmle.label | struct literal | | passwords.go:37:13:37:13 | x | semmle.label | x | -| passwords.go:39:2:39:18 | []type{args} [array] | semmle.label | []type{args} [array] | | passwords.go:39:14:39:17 | obj1 | semmle.label | obj1 | -| passwords.go:39:14:39:17 | obj1 | semmle.label | obj1 | -| passwords.go:41:2:41:5 | definition of obj2 | semmle.label | definition of obj2 | | passwords.go:41:10:43:2 | struct literal | semmle.label | struct literal | | passwords.go:42:6:42:13 | password | semmle.label | password | -| passwords.go:44:2:44:18 | []type{args} [array] | semmle.label | []type{args} [array] | -| passwords.go:44:14:44:17 | obj2 | semmle.label | obj2 | | passwords.go:44:14:44:17 | obj2 | semmle.label | obj2 | | passwords.go:46:6:46:9 | definition of obj3 | semmle.label | definition of obj3 | -| passwords.go:47:2:47:18 | []type{args} [array] | semmle.label | []type{args} [array] | -| passwords.go:47:14:47:17 | obj3 | semmle.label | obj3 | | passwords.go:47:14:47:17 | obj3 | semmle.label | obj3 | | passwords.go:48:11:48:18 | password | semmle.label | password | | passwords.go:51:14:51:27 | fixed_password | semmle.label | fixed_password | -| passwords.go:85:2:85:14 | definition of utilityObject | semmle.label | definition of utilityObject | | passwords.go:85:19:87:2 | struct literal | semmle.label | struct literal | | passwords.go:86:16:86:36 | call to make | semmle.label | call to make | -| passwords.go:88:2:88:27 | []type{args} [array] | semmle.label | []type{args} [array] | -| passwords.go:88:14:88:26 | utilityObject | semmle.label | utilityObject | | passwords.go:88:14:88:26 | utilityObject | semmle.label | utilityObject | | passwords.go:90:12:90:19 | password | semmle.label | password | | passwords.go:91:23:91:28 | secret | semmle.label | secret | @@ -217,22 +173,13 @@ nodes | passwords.go:116:14:116:45 | ...+... | semmle.label | ...+... | | passwords.go:116:28:116:36 | password1 | semmle.label | password1 | | passwords.go:116:28:116:45 | call to String | semmle.label | call to String | -| passwords.go:118:2:118:7 | definition of config | semmle.label | definition of config | -| passwords.go:118:2:118:7 | definition of config [x] | semmle.label | definition of config [x] | -| passwords.go:118:2:118:7 | definition of config [y] | semmle.label | definition of config [y] | | passwords.go:118:12:123:2 | struct literal | semmle.label | struct literal | | passwords.go:118:12:123:2 | struct literal [x] | semmle.label | struct literal [x] | | passwords.go:118:12:123:2 | struct literal [y] | semmle.label | struct literal [y] | | passwords.go:119:13:119:13 | x | semmle.label | x | | passwords.go:121:13:121:20 | password | semmle.label | password | | passwords.go:122:13:122:25 | call to getPassword | semmle.label | call to getPassword | -| passwords.go:125:2:125:20 | []type{args} [array, x] | semmle.label | []type{args} [array, x] | -| passwords.go:125:2:125:20 | []type{args} [array, y] | semmle.label | []type{args} [array, y] | -| passwords.go:125:2:125:20 | []type{args} [array] | semmle.label | []type{args} [array] | | passwords.go:125:14:125:19 | config | semmle.label | config | -| passwords.go:125:14:125:19 | config | semmle.label | config | -| passwords.go:125:14:125:19 | config [x] | semmle.label | config [x] | -| passwords.go:125:14:125:19 | config [y] | semmle.label | config [y] | | passwords.go:126:14:126:19 | config [x] | semmle.label | config [x] | | passwords.go:126:14:126:21 | selection of x | semmle.label | selection of x | | passwords.go:127:14:127:19 | config [y] | semmle.label | config [y] | diff --git a/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected b/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected index b729c7baf83..ac5985f110d 100644 --- a/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected @@ -19,41 +19,17 @@ edges | main.go:46:21:46:31 | call to Referer | main.go:52:46:52:59 | untrustedInput | provenance | Src:MaD:2 | | main.go:46:21:46:31 | call to Referer | main.go:53:52:53:65 | untrustedInput | provenance | Src:MaD:2 | | main.go:58:21:58:31 | call to Referer | main.go:60:47:60:60 | untrustedInput | provenance | Src:MaD:2 | -| main.go:60:3:60:9 | definition of content | main.go:63:16:63:22 | content | provenance | | -| main.go:60:3:60:9 | definition of content | main.go:63:16:63:22 | content | provenance | | -| main.go:60:14:60:61 | call to NewContent | main.go:63:16:63:22 | content | provenance | | | main.go:60:14:60:61 | call to NewContent | main.go:63:16:63:22 | content | provenance | | | main.go:60:47:60:60 | untrustedInput | main.go:60:14:60:61 | call to NewContent | provenance | MaD:3 | -| main.go:63:3:63:23 | []type{args} [array] | main.go:60:3:60:9 | definition of content | provenance | | -| main.go:63:16:63:22 | content | main.go:63:3:63:23 | []type{args} [array] | provenance | | | main.go:68:21:68:31 | call to Referer | main.go:74:47:74:60 | untrustedInput | provenance | Src:MaD:2 | -| main.go:74:3:74:9 | definition of content | main.go:76:50:76:56 | content | provenance | | -| main.go:74:3:74:9 | definition of content | main.go:76:50:76:56 | content | provenance | | -| main.go:74:3:74:9 | definition of content | main.go:76:59:76:65 | content | provenance | | -| main.go:74:3:74:9 | definition of content | main.go:76:59:76:65 | content | provenance | | -| main.go:74:3:74:9 | definition of content | main.go:77:16:77:22 | content | provenance | | -| main.go:74:3:74:9 | definition of content | main.go:77:16:77:22 | content | provenance | | -| main.go:74:14:74:61 | call to NewContent | main.go:76:50:76:56 | content | provenance | | | main.go:74:14:74:61 | call to NewContent | main.go:76:50:76:56 | content | provenance | | | main.go:74:14:74:61 | call to NewContent | main.go:76:59:76:65 | content | provenance | | -| main.go:74:14:74:61 | call to NewContent | main.go:76:59:76:65 | content | provenance | | -| main.go:74:14:74:61 | call to NewContent | main.go:77:16:77:22 | content | provenance | | | main.go:74:14:74:61 | call to NewContent | main.go:77:16:77:22 | content | provenance | | | main.go:74:47:74:60 | untrustedInput | main.go:74:14:74:61 | call to NewContent | provenance | MaD:3 | -| main.go:76:8:76:66 | []type{args} [array] | main.go:74:3:74:9 | definition of content | provenance | | -| main.go:76:50:76:56 | content | main.go:76:8:76:66 | []type{args} [array] | provenance | | -| main.go:76:59:76:65 | content | main.go:76:8:76:66 | []type{args} [array] | provenance | | -| main.go:77:3:77:23 | []type{args} [array] | main.go:74:3:74:9 | definition of content | provenance | | -| main.go:77:16:77:22 | content | main.go:77:3:77:23 | []type{args} [array] | provenance | | | main.go:82:21:82:31 | call to Referer | main.go:89:37:89:50 | untrustedInput | provenance | Src:MaD:2 | | main.go:82:21:82:31 | call to Referer | main.go:91:48:91:61 | untrustedInput | provenance | Src:MaD:2 | -| main.go:91:3:91:10 | definition of content2 | main.go:93:16:93:23 | content2 | provenance | | -| main.go:91:3:91:10 | definition of content2 | main.go:93:16:93:23 | content2 | provenance | | -| main.go:91:15:91:62 | call to NewContent | main.go:93:16:93:23 | content2 | provenance | | | main.go:91:15:91:62 | call to NewContent | main.go:93:16:93:23 | content2 | provenance | | | main.go:91:48:91:61 | untrustedInput | main.go:91:15:91:62 | call to NewContent | provenance | MaD:3 | -| main.go:93:3:93:24 | []type{args} [array] | main.go:91:3:91:10 | definition of content2 | provenance | | -| main.go:93:16:93:23 | content2 | main.go:93:3:93:24 | []type{args} [array] | provenance | | models | 1 | Source: net/http; Request; true; Header; ; ; ; remote; manual | | 2 | Source: net/http; Request; true; Referer; ; ; ReturnValue; remote; manual | @@ -73,30 +49,18 @@ nodes | main.go:52:46:52:59 | untrustedInput | semmle.label | untrustedInput | | main.go:53:52:53:65 | untrustedInput | semmle.label | untrustedInput | | main.go:58:21:58:31 | call to Referer | semmle.label | call to Referer | -| main.go:60:3:60:9 | definition of content | semmle.label | definition of content | | main.go:60:14:60:61 | call to NewContent | semmle.label | call to NewContent | | main.go:60:47:60:60 | untrustedInput | semmle.label | untrustedInput | -| main.go:63:3:63:23 | []type{args} [array] | semmle.label | []type{args} [array] | -| main.go:63:16:63:22 | content | semmle.label | content | | main.go:63:16:63:22 | content | semmle.label | content | | main.go:68:21:68:31 | call to Referer | semmle.label | call to Referer | -| main.go:74:3:74:9 | definition of content | semmle.label | definition of content | | main.go:74:14:74:61 | call to NewContent | semmle.label | call to NewContent | | main.go:74:47:74:60 | untrustedInput | semmle.label | untrustedInput | -| main.go:76:8:76:66 | []type{args} [array] | semmle.label | []type{args} [array] | -| main.go:76:50:76:56 | content | semmle.label | content | | main.go:76:50:76:56 | content | semmle.label | content | | main.go:76:59:76:65 | content | semmle.label | content | -| main.go:76:59:76:65 | content | semmle.label | content | -| main.go:77:3:77:23 | []type{args} [array] | semmle.label | []type{args} [array] | -| main.go:77:16:77:22 | content | semmle.label | content | | main.go:77:16:77:22 | content | semmle.label | content | | main.go:82:21:82:31 | call to Referer | semmle.label | call to Referer | | main.go:89:37:89:50 | untrustedInput | semmle.label | untrustedInput | -| main.go:91:3:91:10 | definition of content2 | semmle.label | definition of content2 | | main.go:91:15:91:62 | call to NewContent | semmle.label | call to NewContent | | main.go:91:48:91:61 | untrustedInput | semmle.label | untrustedInput | -| main.go:93:3:93:24 | []type{args} [array] | semmle.label | []type{args} [array] | -| main.go:93:16:93:23 | content2 | semmle.label | content2 | | main.go:93:16:93:23 | content2 | semmle.label | content2 | subpaths From 88b6f1e79ae8afd5def5b0deda38e40ff6ce4513 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Jan 2025 20:50:36 +0000 Subject: [PATCH 27/71] Release preparation for version 2.20.1 --- actions/ql/lib/CHANGELOG.md | 5 +++++ actions/ql/lib/change-notes/released/0.4.0.md | 5 +++++ actions/ql/lib/codeql-pack.release.yml | 2 ++ actions/ql/lib/qlpack.yml | 2 +- .../CHANGELOG.md} | 7 ++++--- .../0.4.0.md} | 7 ++++--- actions/ql/src/codeql-pack.release.yml | 2 ++ actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 19 +++++++++++++++++ .../2024-12-04-guard-conditions.md | 4 ---- .../2024-12-17-template-parameter-base.md | 4 ---- .../2024-12-17-template-parameter.md | 4 ---- .../2024-12-18-non-type-template-parameter.md | 4 ---- .../change-notes/2024-12-20-sizeof-pack.md | 4 ---- ...4-12-20-template-template-instantiation.md | 6 ------ cpp/ql/lib/change-notes/released/3.1.0.md | 18 ++++++++++++++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 10 +++++++++ .../2024-11-27-active-template-library.md | 4 ---- .../2024-12-05-badly-bounded-write.md | 4 ---- ...024-12-05-wrong-number-format-arguments.md | 4 ---- .../2024-12-05-wrong-type-format-args.md | 4 ---- ...024-12-18-return-stack-allocated-memory.md | 4 ---- cpp/ql/src/change-notes/released/1.3.1.md | 9 ++++++++ cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../lib/change-notes/released/1.7.31.md | 3 +++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../src/change-notes/released/1.7.31.md | 3 +++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 13 ++++++++++++ .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ---- .../ql/lib/change-notes/2024-12-04-dotnet9.md | 4 ---- .../2024-12-05-aspnetcore-mvc-model.md | 4 ---- ...add-markupstring-as-html-injection-sink.md | 4 ---- .../2024-12-18-blazor-attribute-sources.md | 6 ------ .../2024-12-20-collection-params.md | 4 ---- csharp/ql/lib/change-notes/released/4.0.1.md | 12 +++++++++++ csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 6 ++++++ .../1.0.14.md} | 7 ++++--- csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 6 ++++++ .../3.0.1.md} | 8 +++---- go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.1.5.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 21 +++++++++++++++++++ ...sttemplate-getforobject-third-parameter.md | 4 ---- .../2024-12-04-dataflow-type-pruning-tweak.md | 4 ---- .../change-notes/2024-12-06-file-getname.md | 4 ---- .../6.0.0.md} | 13 +++++++++--- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.1.11.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ++++ .../ql/lib/change-notes/released/2.2.1.md | 3 +++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 4 ++++ .../ql/src/change-notes/released/1.2.6.md | 3 +++ javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 11 ++++++++++ .../2024-12-18-fastapi-request-modeling.md | 5 ----- .../3.1.0.md} | 11 +++++++--- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 6 ++++++ .../1.4.0.md} | 9 ++++---- python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ++++ ruby/ql/lib/change-notes/released/3.0.1.md | 3 +++ ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.1.9.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 6 ++++++ .../1.1.8.md} | 7 ++++--- shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.14.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.14.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/1.0.14.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ .../tutorial/change-notes/released/1.0.14.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ .../typeflow/change-notes/released/1.0.14.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.14.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.14.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.1.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.14.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.14.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 6 ++++++ .../3.1.0.md} | 7 ++++--- swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.0.14.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 165 files changed, 442 insertions(+), 188 deletions(-) create mode 100644 actions/ql/lib/CHANGELOG.md create mode 100644 actions/ql/lib/change-notes/released/0.4.0.md create mode 100644 actions/ql/lib/codeql-pack.release.yml rename actions/ql/{lib/change-notes/2024-12-19-initial-release.md => src/CHANGELOG.md} (55%) rename actions/ql/src/change-notes/{2024-12-19-initial-release.md => released/0.4.0.md} (55%) create mode 100644 actions/ql/src/codeql-pack.release.yml delete mode 100644 cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-17-template-parameter.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md delete mode 100644 cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md create mode 100644 cpp/ql/lib/change-notes/released/3.1.0.md delete mode 100644 cpp/ql/src/change-notes/2024-11-27-active-template-library.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md delete mode 100644 cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md delete mode 100644 cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md create mode 100644 cpp/ql/src/change-notes/released/1.3.1.md create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-04-dotnet9.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md delete mode 100644 csharp/ql/lib/change-notes/2024-12-20-collection-params.md create mode 100644 csharp/ql/lib/change-notes/released/4.0.1.md rename csharp/ql/src/change-notes/{2024-12-17-move-libraries.md => released/1.0.14.md} (65%) create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.14.md rename go/ql/lib/change-notes/{2024-12-13-os-args-model.md => released/3.0.1.md} (63%) create mode 100644 go/ql/src/change-notes/released/1.1.5.md delete mode 100644 java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md delete mode 100644 java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md delete mode 100644 java/ql/lib/change-notes/2024-12-06-file-getname.md rename java/ql/lib/change-notes/{2024-11-14-control-flow-graph-lightweight-IR-layer.md => released/6.0.0.md} (50%) create mode 100644 java/ql/src/change-notes/released/1.1.11.md create mode 100644 javascript/ql/lib/change-notes/released/2.2.1.md create mode 100644 javascript/ql/src/change-notes/released/1.2.6.md create mode 100644 misc/suite-helpers/change-notes/released/1.0.14.md delete mode 100644 python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md rename python/ql/lib/change-notes/{2024-11-26-parameter-annotation-api-graph-support.md => released/3.1.0.md} (58%) rename python/ql/src/change-notes/{2024-11-21-template-injection.md => released/1.4.0.md} (78%) create mode 100644 ruby/ql/lib/change-notes/released/3.0.1.md create mode 100644 ruby/ql/src/change-notes/released/1.1.9.md create mode 100644 shared/controlflow/change-notes/released/1.0.14.md rename shared/dataflow/change-notes/{2023-10-02-deduplicate-path-graph.md => released/1.1.8.md} (77%) create mode 100644 shared/mad/change-notes/released/1.0.14.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.14.md create mode 100644 shared/regex/change-notes/released/1.0.14.md create mode 100644 shared/ssa/change-notes/released/1.0.14.md create mode 100644 shared/threat-models/change-notes/released/1.0.14.md create mode 100644 shared/tutorial/change-notes/released/1.0.14.md create mode 100644 shared/typeflow/change-notes/released/1.0.14.md create mode 100644 shared/typetracking/change-notes/released/1.0.14.md create mode 100644 shared/typos/change-notes/released/1.0.14.md create mode 100644 shared/util/change-notes/released/2.0.1.md create mode 100644 shared/xml/change-notes/released/1.0.14.md create mode 100644 shared/yaml/change-notes/released/1.0.14.md rename swift/ql/lib/change-notes/{2024-12-09-swift-6.md => released/3.1.0.md} (51%) create mode 100644 swift/ql/src/change-notes/released/1.0.14.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md new file mode 100644 index 00000000000..7ad10899ce1 --- /dev/null +++ b/actions/ql/lib/CHANGELOG.md @@ -0,0 +1,5 @@ +## 0.4.0 + +### New Features + +* Initial public preview release diff --git a/actions/ql/lib/change-notes/released/0.4.0.md b/actions/ql/lib/change-notes/released/0.4.0.md new file mode 100644 index 00000000000..7ad10899ce1 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.0.md @@ -0,0 +1,5 @@ +## 0.4.0 + +### New Features + +* Initial public preview release diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml new file mode 100644 index 00000000000..458bfbeccff --- /dev/null +++ b/actions/ql/lib/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.4.0 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 83cdaabc80d..2f6aa980728 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.0-dev +version: 0.4.0 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/lib/change-notes/2024-12-19-initial-release.md b/actions/ql/src/CHANGELOG.md similarity index 55% rename from actions/ql/lib/change-notes/2024-12-19-initial-release.md rename to actions/ql/src/CHANGELOG.md index 09263f5089d..caa8feca558 100644 --- a/actions/ql/lib/change-notes/2024-12-19-initial-release.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,4 +1,5 @@ ---- -category: feature ---- +## 0.4.0 + +### New Queries + * Initial public preview release diff --git a/actions/ql/src/change-notes/2024-12-19-initial-release.md b/actions/ql/src/change-notes/released/0.4.0.md similarity index 55% rename from actions/ql/src/change-notes/2024-12-19-initial-release.md rename to actions/ql/src/change-notes/released/0.4.0.md index e02078ea273..caa8feca558 100644 --- a/actions/ql/src/change-notes/2024-12-19-initial-release.md +++ b/actions/ql/src/change-notes/released/0.4.0.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- +## 0.4.0 + +### New Queries + * Initial public preview release diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml new file mode 100644 index 00000000000..458bfbeccff --- /dev/null +++ b/actions/ql/src/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.4.0 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index f822a516e56..7ea8f9d77dd 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.4.0-dev +version: 0.4.0 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 19784b530e7..919bd905e73 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,22 @@ +## 3.1.0 + +### Deprecated APIs + +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. + +### New Features + +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. + +### Minor Analysis Improvements + +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. + ## 3.0.0 ### Breaking Changes diff --git a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md b/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md deleted file mode 100644 index f60a6a2970a..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-04-guard-conditions.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md deleted file mode 100644 index 6fec6d5f4f5..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-17-template-parameter-base.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md deleted file mode 100644 index 0ac7085b371..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-17-template-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. diff --git a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md b/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md deleted file mode 100644 index 41fe400ed66..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-18-non-type-template-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. diff --git a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md b/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md deleted file mode 100644 index bd912e4fb2e..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-20-sizeof-pack.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. diff --git a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md b/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md deleted file mode 100644 index 6e3ecd3468c..00000000000 --- a/cpp/ql/lib/change-notes/2024-12-20-template-template-instantiation.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: feature ---- -* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. -* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. -* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. diff --git a/cpp/ql/lib/change-notes/released/3.1.0.md b/cpp/ql/lib/change-notes/released/3.1.0.md new file mode 100644 index 00000000000..3c7f181f60a --- /dev/null +++ b/cpp/ql/lib/change-notes/released/3.1.0.md @@ -0,0 +1,18 @@ +## 3.1.0 + +### Deprecated APIs + +* The `TemplateParameter` class, representing C++ type template parameters has been deprecated. Use `TypeTemplateParameter` instead. + +### New Features + +* New classes `SizeofPackExprOperator` and `SizeofPackTypeOperator` were introduced, which represent the C++ `sizeof...` operator taking expressions and type arguments, respectively. +* A new class `TemplateTemplateParameterInstantiation` was introduced, which represents instantiations of template template parameters. +* A new predicate `getAnInstantiation` was added to the `TemplateTemplateParameter` class, which yields instantiations of template template parameters. +* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of template template parameters. +* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters. +* A new class `TemplateParameterBase` was introduced, which represents C++ non-type template parameters, type template parameters, and template template parameters. + +### Minor Analysis Improvements + +* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 4bb4b04e02f..2d83b8d4840 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 3.0.1-dev +version: 3.1.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index db16fe6f8b3..7d957e42696 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 1.3.1 + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). + ## 1.3.0 ### New Queries diff --git a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md b/cpp/ql/src/change-notes/2024-11-27-active-template-library.md deleted file mode 100644 index a677ac66107..00000000000 --- a/cpp/ql/src/change-notes/2024-11-27-active-template-library.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md b/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md deleted file mode 100644 index c7ddd104ad0..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-badly-bounded-write.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md b/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md deleted file mode 100644 index 6b41378f556..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-wrong-number-format-arguments.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md b/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md deleted file mode 100644 index 1bf77d55a61..00000000000 --- a/cpp/ql/src/change-notes/2024-12-05-wrong-type-format-args.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. diff --git a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md b/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md deleted file mode 100644 index 76f5b9d7eae..00000000000 --- a/cpp/ql/src/change-notes/2024-12-18-return-stack-allocated-memory.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. diff --git a/cpp/ql/src/change-notes/released/1.3.1.md b/cpp/ql/src/change-notes/released/1.3.1.md new file mode 100644 index 00000000000..bb3b2bf16c7 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.3.1.md @@ -0,0 +1,9 @@ +## 1.3.1 + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" query (`cpp/return-stack-allocated-memory`) no longer produces results if there is an extraction error in the returned expression. +* The "Badly bounded write" query (`cpp/badly-bounded-write`) no longer produces results if there is an extraction error in the type of the output buffer. +* The "Too few arguments to formatting function" query (`cpp/wrong-number-format-arguments`) no longer produces results if an argument has an extraction error. +* The "Wrong type of arguments to formatting function" query (`cpp/wrong-type-format-argument`) no longer produces results when an argument type has an extraction error. +* Added dataflow models and flow sources for Microsoft's Active Template Library (ATL). diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index ec16350ed6f..e71b6d081f1 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.0 +lastReleaseVersion: 1.3.1 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 940c3e2a4cb..b37fc604fc6 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.3.1-dev +version: 1.3.1 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index a71f93aacd4..0a74ff6d7d0 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.31 + +No user-facing changes. + ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md new file mode 100644 index 00000000000..17df0436207 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.31.md @@ -0,0 +1,3 @@ +## 1.7.31 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index c0346e526b9..908f8a00a39 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.30 +lastReleaseVersion: 1.7.31 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 781915bf1a1..d5274444753 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.31-dev +version: 1.7.31 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index a71f93aacd4..0a74ff6d7d0 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.31 + +No user-facing changes. + ## 1.7.30 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md new file mode 100644 index 00000000000..17df0436207 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.31.md @@ -0,0 +1,3 @@ +## 1.7.31 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index c0346e526b9..908f8a00a39 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.30 +lastReleaseVersion: 1.7.31 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 979d8e6c661..41d5662ed57 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.31-dev +version: 1.7.31 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 86f279365f0..857acdec93a 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,16 @@ +## 4.0.1 + +### Minor Analysis Improvements + +* C# 13: Added QL library support for *collection* like type `params` parameters. +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. + ## 4.0.0 ### Breaking Changes diff --git a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md deleted file mode 100644 index 258c0e5326b..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md b/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md deleted file mode 100644 index e166040e155..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-04-dotnet9.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md b/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md deleted file mode 100644 index 04afe96522b..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-05-aspnetcore-mvc-model.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md b/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md deleted file mode 100644 index 032edbb1f10..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-12-add-markupstring-as-html-injection-sink.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. diff --git a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md b/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md deleted file mode 100644 index 5a48753b259..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-18-blazor-attribute-sources.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - - `[SupplyParameterFromForm]` - - `[SupplyParameterFromQuery]` diff --git a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md b/csharp/ql/lib/change-notes/2024-12-20-collection-params.md deleted file mode 100644 index bb5ea26c6d4..00000000000 --- a/csharp/ql/lib/change-notes/2024-12-20-collection-params.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* C# 13: Added QL library support for *collection* like type `params` parameters. diff --git a/csharp/ql/lib/change-notes/released/4.0.1.md b/csharp/ql/lib/change-notes/released/4.0.1.md new file mode 100644 index 00000000000..703439b4cfe --- /dev/null +++ b/csharp/ql/lib/change-notes/released/4.0.1.md @@ -0,0 +1,12 @@ +## 4.0.1 + +### Minor Analysis Improvements + +* C# 13: Added QL library support for *collection* like type `params` parameters. +* Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: + - `[SupplyParameterFromForm]` + - `[SupplyParameterFromQuery]` +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. +* Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 49fe3eef697..c0db4dcc0b3 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.0.0 +lastReleaseVersion: 4.0.1 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 81a55470a4d..bb79e33a528 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 4.0.1-dev +version: 4.0.1 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 370a9cf4a6a..1adfe6e1822 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.0.14 + +### Minor Analysis Improvements + +* The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. + ## 1.0.13 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/2024-12-17-move-libraries.md b/csharp/ql/src/change-notes/released/1.0.14.md similarity index 65% rename from csharp/ql/src/change-notes/2024-12-17-move-libraries.md rename to csharp/ql/src/change-notes/released/1.0.14.md index 07bf61b7e35..d49594169df 100644 --- a/csharp/ql/src/change-notes/2024-12-17-move-libraries.md +++ b/csharp/ql/src/change-notes/released/1.0.14.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.0.14 + +### Minor Analysis Improvements + * The `ExternalApi` and `TestLibrary` modules have been moved to the library pack. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index e4d9400d96d..5334c690270 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.0.14-dev +version: 1.0.14 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 3c6fa155a32..2d5ba191d2e 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.14.md b/go/ql/consistency-queries/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 1812705438c..5e500c12eb7 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.14-dev +version: 1.0.14 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 83052b3a1d9..b48a4098866 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 3.0.1 + +### Minor Analysis Improvements + +* Added a `commandargs` local source model for the `os.Args` variable. + ## 3.0.0 ### Breaking Changes diff --git a/go/ql/lib/change-notes/2024-12-13-os-args-model.md b/go/ql/lib/change-notes/released/3.0.1.md similarity index 63% rename from go/ql/lib/change-notes/2024-12-13-os-args-model.md rename to go/ql/lib/change-notes/released/3.0.1.md index 20a16d222e4..a2bce4d06cf 100644 --- a/go/ql/lib/change-notes/2024-12-13-os-args-model.md +++ b/go/ql/lib/change-notes/released/3.0.1.md @@ -1,5 +1,5 @@ ---- -category: minorAnalysis ---- -* Added a `commandargs` local source model for the `os.Args` variable. +## 3.0.1 +### Minor Analysis Improvements + +* Added a `commandargs` local source model for the `os.Args` variable. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 33d3a2cd113..e3b15d965db 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.0.1 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 4e72aa3857b..a540b7905c3 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 3.0.1-dev +version: 3.0.1 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index c9044e55cdc..838a8bce5ea 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.5 + +No user-facing changes. + ## 1.1.4 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/1.1.5.md b/go/ql/src/change-notes/released/1.1.5.md new file mode 100644 index 00000000000..11a52a121d1 --- /dev/null +++ b/go/ql/src/change-notes/released/1.1.5.md @@ -0,0 +1,3 @@ +## 1.1.5 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 26cbcd3f123..df39a9de059 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.4 +lastReleaseVersion: 1.1.5 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 36775d0d862..52d3c0012ba 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.1.5-dev +version: 1.1.5 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 09ee80087e8..e7aa3c152de 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,24 @@ +## 6.0.0 + +### Breaking Changes + +* The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer + directly equatable to `Expr` and `Stmt`. Any queries that have been + exploiting these equalities, for example by using casts, will need minor + updates in order to fix any compilation errors. Conversions can be inserted + in either direction depending on what is most convenient. Available + conversions include `Expr.getControlFlowNode()`, `Stmt.getControlFlowNode()`, + `ControlFlowNode.asExpr()`, `ControlFlowNode.asStmt()`, and + `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a + `ControlFlowNode` equal to its enclosing `Callable`; these are now instead + modelled by the class `ControlFlow::ExitNode`. + +### Minor Analysis Improvements + +* Added `java.io.File.getName()` as a path injection sanitizer. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. + ## 5.0.0 ### Breaking Changes diff --git a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md b/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md deleted file mode 100644 index 4f45d19e5e8..00000000000 --- a/java/ql/lib/change-notes/2024-11-28-model-resttemplate-getforobject-third-parameter.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md deleted file mode 100644 index 258c0e5326b..00000000000 --- a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/java/ql/lib/change-notes/2024-12-06-file-getname.md b/java/ql/lib/change-notes/2024-12-06-file-getname.md deleted file mode 100644 index b2d1d271ab5..00000000000 --- a/java/ql/lib/change-notes/2024-12-06-file-getname.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `java.io.File.getName()` as a path injection sanitizer. diff --git a/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md b/java/ql/lib/change-notes/released/6.0.0.md similarity index 50% rename from java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md rename to java/ql/lib/change-notes/released/6.0.0.md index 2fbb6a537c7..f66dd1b2bbf 100644 --- a/java/ql/lib/change-notes/2024-11-14-control-flow-graph-lightweight-IR-layer.md +++ b/java/ql/lib/change-notes/released/6.0.0.md @@ -1,6 +1,7 @@ ---- -category: breaking ---- +## 6.0.0 + +### Breaking Changes + * The class `ControlFlowNode` (and by extension `BasicBlock`) is no longer directly equatable to `Expr` and `Stmt`. Any queries that have been exploiting these equalities, for example by using casts, will need minor @@ -11,3 +12,9 @@ category: breaking `ControlFlowNode.asCall()`. Exit nodes were until now modelled as a `ControlFlowNode` equal to its enclosing `Callable`; these are now instead modelled by the class `ControlFlow::ExitNode`. + +### Minor Analysis Improvements + +* Added `java.io.File.getName()` as a path injection sanitizer. +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. +* Added a sink for "Server-side request forgery" (`java/ssrf`) for the third parameter to org.springframework.web.client.RestTemplate.getForObject, when we cannot statically determine that it does not affect the host in the URL. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index c9e54136ca5..f8c4fa43ccb 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.0 +lastReleaseVersion: 6.0.0 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index f892ca1c450..d0490615f69 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 5.0.1-dev +version: 6.0.0 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 0bb38874b82..c7148cba8d8 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.11 + +No user-facing changes. + ## 1.1.10 ### Minor Analysis Improvements diff --git a/java/ql/src/change-notes/released/1.1.11.md b/java/ql/src/change-notes/released/1.1.11.md new file mode 100644 index 00000000000..c94f527264e --- /dev/null +++ b/java/ql/src/change-notes/released/1.1.11.md @@ -0,0 +1,3 @@ +## 1.1.11 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 4c01918d414..121f8cf035d 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.10 +lastReleaseVersion: 1.1.11 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 8ee211fb536..dd530febd2e 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.1.11-dev +version: 1.1.11 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index ebe424935eb..7aa60446f0e 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.1 + +No user-facing changes. + ## 2.2.0 ### Major Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/2.2.1.md b/javascript/ql/lib/change-notes/released/2.2.1.md new file mode 100644 index 00000000000..62b48f9d2e8 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.2.1.md @@ -0,0 +1,3 @@ +## 2.2.1 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 2f308354195..863e3cd380d 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.2.0 +lastReleaseVersion: 2.2.1 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 4d568ff4813..d78821f0892 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.2.1-dev +version: 2.2.1 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 195298ec89f..5bf4466796e 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.6 + +No user-facing changes. + ## 1.2.5 No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/1.2.6.md b/javascript/ql/src/change-notes/released/1.2.6.md new file mode 100644 index 00000000000..0832850ff8c --- /dev/null +++ b/javascript/ql/src/change-notes/released/1.2.6.md @@ -0,0 +1,3 @@ +## 1.2.6 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 40355f0807f..24962f7ba24 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.5 +lastReleaseVersion: 1.2.6 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 78f0585027b..04e84d1ac74 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 1.2.6-dev +version: 1.2.6 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 5d46c57bf4e..490b5dc360a 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.14.md b/misc/suite-helpers/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index eeb8f762b13..f14cabfe129 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.14-dev +version: 1.0.14 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 81c7659c4ed..dce2aad3c6d 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 3.1.0 + +### New Features + +- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. + +### Minor Analysis Improvements + +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. + ## 3.0.0 ### Breaking Changes diff --git a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md b/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md deleted file mode 100644 index adc7d39653f..00000000000 --- a/python/ql/lib/change-notes/2024-12-18-fastapi-request-modeling.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, - and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md b/python/ql/lib/change-notes/released/3.1.0.md similarity index 58% rename from python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md rename to python/ql/lib/change-notes/released/3.1.0.md index 57bb1b4a078..50b4b8184b7 100644 --- a/python/ql/lib/change-notes/2024-11-26-parameter-annotation-api-graph-support.md +++ b/python/ql/lib/change-notes/released/3.1.0.md @@ -1,5 +1,10 @@ ---- -category: feature ---- +## 3.1.0 + +### New Features - Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. + +### Minor Analysis Improvements + +* Added modeling of `fastapi.Request` and `starlette.requests.Request` as sources of untrusted input, + and modeling of tainted data flow out of these request objects. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 147933b96fe..8e015428c49 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 3.0.1-dev +version: 3.1.0 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index c247e217acf..d5cacfc8401 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.4.0 + +### New Queries + +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. + ## 1.3.4 No user-facing changes. diff --git a/python/ql/src/change-notes/2024-11-21-template-injection.md b/python/ql/src/change-notes/released/1.4.0.md similarity index 78% rename from python/ql/src/change-notes/2024-11-21-template-injection.md rename to python/ql/src/change-notes/released/1.4.0.md index 7c604e9c993..02acaabcb98 100644 --- a/python/ql/src/change-notes/2024-11-21-template-injection.md +++ b/python/ql/src/change-notes/released/1.4.0.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- -* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. \ No newline at end of file +## 1.4.0 + +### New Queries + +* The Server Side Template Injection query (`py/template-injection`), originally contributed to the experimental query pack by @porcupineyhairs, has been promoted to the main query suite. This query finds instances of templates for a template engine such as Jinja being constructed with user input. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index 8263ddf2c8b..b8b2e97d508 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.4 +lastReleaseVersion: 1.4.0 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index d83b6433ac6..9d330fc3526 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.3.5-dev +version: 1.4.0 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 737903a3232..9179de3b7d5 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.1 + +No user-facing changes. + ## 3.0.0 ### Breaking Changes diff --git a/ruby/ql/lib/change-notes/released/3.0.1.md b/ruby/ql/lib/change-notes/released/3.0.1.md new file mode 100644 index 00000000000..ac5998ace61 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/3.0.1.md @@ -0,0 +1,3 @@ +## 3.0.1 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 33d3a2cd113..e3b15d965db 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.0.1 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index ddf106c95bf..a169addf8e7 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 3.0.1-dev +version: 3.0.1 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 5fe04780136..7d341c3f808 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.9 + +No user-facing changes. + ## 1.1.8 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.1.9.md b/ruby/ql/src/change-notes/released/1.1.9.md new file mode 100644 index 00000000000..f9d367d4248 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.1.9.md @@ -0,0 +1,3 @@ +## 1.1.9 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 64972659c42..6f4795f3ea0 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.8 +lastReleaseVersion: 1.1.9 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 43bfe75f566..72ff669503a 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.1.9-dev +version: 1.1.9 groups: - ruby - queries diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 285b39a4359..5f4501ed1e3 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/1.0.14.md b/shared/controlflow/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/controlflow/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 268f142bd1b..590d3e1666d 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index df038524d2d..949660e3381 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.1.8 + +### Minor Analysis Improvements + +* Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. + ## 1.1.7 No user-facing changes. diff --git a/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md b/shared/dataflow/change-notes/released/1.1.8.md similarity index 77% rename from shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md rename to shared/dataflow/change-notes/released/1.1.8.md index 30e71ade6af..d951e6bf0c7 100644 --- a/shared/dataflow/change-notes/2023-10-02-deduplicate-path-graph.md +++ b/shared/dataflow/change-notes/released/1.1.8.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.1.8 + +### Minor Analysis Improvements + * Added a module `DataFlow::DeduplicatePathGraph` that can be used to avoid generating duplicate path explanations in queries that use flow state. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 75910556516..64972659c42 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.7 +lastReleaseVersion: 1.1.8 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 6a8e8c3a4ae..fe44120b3c1 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 1.1.8-dev +version: 1.1.8 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 93a528a4f3c..1b2146927e5 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.14.md b/shared/mad/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 125bcad622d..341373b22f5 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 6b25d16e0f7..993922ecc49 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.14.md b/shared/rangeanalysis/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 62c8c1e46b6..efb29bbc02c 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 54c3ed2b307..45bb8da81db 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.14.md b/shared/regex/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index e2cda264dc8..8db7e73e336 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 01c19388c92..d31fb6c6120 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/ssa/change-notes/released/1.0.14.md b/shared/ssa/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/ssa/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index b146ce5bc91..1276fd498f7 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 3c6fa155a32..2d5ba191d2e 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.14.md b/shared/threat-models/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 6ec41bbcc04..f337bfa721d 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.14-dev +version: 1.0.14 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 1f4e7ad4ed3..cc4652e04ff 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.14.md b/shared/tutorial/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 6677c74eed4..4c55d52356c 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index dd8fb7a60b2..ac6192fd7d8 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.14.md b/shared/typeflow/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index cd9e70bba8c..15761af538a 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 0ab05873af4..f651b953118 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/1.0.14.md b/shared/typetracking/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typetracking/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index fbe63f0da01..224b85826c4 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index c0c3cea3948..924a3fc0a7b 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.14.md b/shared/typos/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 250f729ab5f..31f04e60666 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index e03d990b747..9dd6c05d40a 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.1 + +No user-facing changes. + ## 2.0.0 ### Breaking Changes diff --git a/shared/util/change-notes/released/2.0.1.md b/shared/util/change-notes/released/2.0.1.md new file mode 100644 index 00000000000..b5b6d0dee91 --- /dev/null +++ b/shared/util/change-notes/released/2.0.1.md @@ -0,0 +1,3 @@ +## 2.0.1 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 0abe6ccede0..fe974a4dbf3 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.0 +lastReleaseVersion: 2.0.1 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index b327c25a3d9..da932a6ed36 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.1-dev +version: 2.0.1 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index c3ebc31994b..6837f7507d8 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.14.md b/shared/xml/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 76c408c2920..a3ace631d1b 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 28fcbceec8e..6e940e8d264 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.14.md b/shared/yaml/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 0c756e1edbb..006f30012bb 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.14-dev +version: 1.0.14 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index ba76b51c80e..c976d0c8514 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 3.1.0 + +### Major Analysis Improvements + +* Upgraded to allow analysis of Swift 6.0.2. + ## 3.0.0 ### Breaking Changes diff --git a/swift/ql/lib/change-notes/2024-12-09-swift-6.md b/swift/ql/lib/change-notes/released/3.1.0.md similarity index 51% rename from swift/ql/lib/change-notes/2024-12-09-swift-6.md rename to swift/ql/lib/change-notes/released/3.1.0.md index e32344b28d8..655a8ad323a 100644 --- a/swift/ql/lib/change-notes/2024-12-09-swift-6.md +++ b/swift/ql/lib/change-notes/released/3.1.0.md @@ -1,4 +1,5 @@ ---- -category: majorAnalysis ---- +## 3.1.0 + +### Major Analysis Improvements + * Upgraded to allow analysis of Swift 6.0.2. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 33d3a2cd113..82f62960aa3 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.0.0 +lastReleaseVersion: 3.1.0 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 7752975faea..91e4d06f537 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 3.0.1-dev +version: 3.1.0 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 73ac6bef86d..a26a68434eb 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.14 + +No user-facing changes. + ## 1.0.13 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.0.14.md b/swift/ql/src/change-notes/released/1.0.14.md new file mode 100644 index 00000000000..84f6736f1a1 --- /dev/null +++ b/swift/ql/src/change-notes/released/1.0.14.md @@ -0,0 +1,3 @@ +## 1.0.14 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index c3be7eb7716..3b484f28dfa 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.13 +lastReleaseVersion: 1.0.14 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index ec8e2cb9932..1ce09dc0969 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.0.14-dev +version: 1.0.14 groups: - swift - queries From 45c00d6880b15665bb8ff89ba7edf67220158642 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 15:58:19 -0500 Subject: [PATCH 28/71] Update python/ql/lib/CHANGELOG.md --- python/ql/lib/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index dce2aad3c6d..aabefe63a42 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -2,7 +2,7 @@ ### New Features -- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. +* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. ### Minor Analysis Improvements From 4c53caf0210932a5100d3e41f72e9e5c3b5b240b Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 7 Jan 2025 15:58:28 -0500 Subject: [PATCH 29/71] Update python/ql/lib/change-notes/released/3.1.0.md --- python/ql/lib/change-notes/released/3.1.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/lib/change-notes/released/3.1.0.md b/python/ql/lib/change-notes/released/3.1.0.md index 50b4b8184b7..4b135bae79c 100644 --- a/python/ql/lib/change-notes/released/3.1.0.md +++ b/python/ql/lib/change-notes/released/3.1.0.md @@ -2,7 +2,7 @@ ### New Features -- Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. +* Added support for parameter annotations in API graphs. This means that in a function definition such as `def foo(x: Bar): ...`, you can now use the `getInstanceFromAnnotation()` method to step from `Bar` to `x`. In addition to this, the `getAnInstance` method now also includes instances arising from parameter annotations. ### Minor Analysis Improvements From fb20f6ca63f7b96c3de706b9afb7a817a86f99b1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Jan 2025 22:07:40 +0000 Subject: [PATCH 30/71] Post-release preparation for codeql-cli-2.20.1 --- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 36 files changed, 36 insertions(+), 36 deletions(-) diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 2f6aa980728..56654cd7eab 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.0 +version: 0.4.1-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 7ea8f9d77dd..7c4d7dde27b 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.4.0 +version: 0.4.1-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 2d83b8d4840..6ffc77714d4 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 3.1.0 +version: 3.1.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index b37fc604fc6..5f0e63bfec4 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.3.1 +version: 1.3.2-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index d5274444753..39d5520bf76 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.31 +version: 1.7.32-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 41d5662ed57..23f5eddd141 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.31 +version: 1.7.32-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index bb79e33a528..e32376ee270 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 4.0.1 +version: 4.0.2-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 5334c690270..0034f69ef87 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.0.14 +version: 1.0.15-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 5e500c12eb7..47d3802ccdb 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.14 +version: 1.0.15-dev groups: - go - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index a540b7905c3..23156a6939f 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 3.0.1 +version: 3.0.2-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 52d3c0012ba..e33da9a8c91 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.1.5 +version: 1.1.6-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index d0490615f69..18b74a919dd 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 6.0.0 +version: 6.0.1-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index dd530febd2e..c808e5db6b0 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.1.11 +version: 1.1.12-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index d78821f0892..6b86693b913 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.2.1 +version: 2.2.2-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 04e84d1ac74..152a266ef96 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 1.2.6 +version: 1.2.7-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index f14cabfe129..26c6f3aee9c 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.14 +version: 1.0.15-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 8e015428c49..2c1d49af4c4 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 3.1.0 +version: 3.1.1-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 9d330fc3526..daed42ec94b 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.4.0 +version: 1.4.1-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index a169addf8e7..fa3b6fbd3c3 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 3.0.1 +version: 3.0.2-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 72ff669503a..6ece819a2d6 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.1.9 +version: 1.1.10-dev groups: - ruby - queries diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 590d3e1666d..900e7ad7355 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index fe44120b3c1..93379260c46 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 1.1.8 +version: 1.1.9-dev groups: shared library: true dependencies: diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 341373b22f5..c77998a779f 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index efb29bbc02c..01248548139 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 8db7e73e336..2598750f3b6 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 1276fd498f7..b535eee6056 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index f337bfa721d..903324ab6e7 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.14 +version: 1.0.15-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 4c55d52356c..9268c70aa43 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 15761af538a..10306beaf68 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 224b85826c4..5f4f23526b6 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 31f04e60666..665e3ab8d14 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index da932a6ed36..372d7a95b70 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.1 +version: 2.0.2-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index a3ace631d1b..e87c526b006 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 006f30012bb..3f800572c97 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.14 +version: 1.0.15-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 91e4d06f537..2d7ecc9e029 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 3.1.0 +version: 3.1.1-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 1ce09dc0969..a99bde028ca 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.0.14 +version: 1.0.15-dev groups: - swift - queries From ca1e9d7c7521989924d730e20225202f64d290bb Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 7 Jan 2025 21:08:43 -0500 Subject: [PATCH 31/71] Revert "`database/sql` summary models for `Row` types" This reverts commit 80ad349a481317248da1989f9bbfda7822fdaf39. --- go/ql/lib/ext/database.sql.driver.model.yml | 1 - go/ql/lib/ext/database.sql.model.yml | 2 -- .../go/frameworks/stdlib/DatabaseSql.qll | 20 +++++++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/go/ql/lib/ext/database.sql.driver.model.yml b/go/ql/lib/ext/database.sql.driver.model.yml index 0f33a6e14b8..f4e46eaa343 100644 --- a/go/ql/lib/ext/database.sql.driver.model.yml +++ b/go/ql/lib/ext/database.sql.driver.model.yml @@ -23,6 +23,5 @@ extensions: data: - ["database/sql/driver", "Conn", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "ConnPrepareContext", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] - - ["database/sql/driver", "Rows", True, "Next", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"] - ["database/sql/driver", "ValueConverter", True, "ConvertValue", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "Valuer", True, "Value", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] diff --git a/go/ql/lib/ext/database.sql.model.yml b/go/ql/lib/ext/database.sql.model.yml index 34042a39774..8d67dd92142 100644 --- a/go/ql/lib/ext/database.sql.model.yml +++ b/go/ql/lib/ext/database.sql.model.yml @@ -53,8 +53,6 @@ extensions: - ["database/sql", "Conn", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] - ["database/sql", "DB", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql", "DB", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] - - ["database/sql", "Row", True, "Scan", "", "", "Argument[receiver]", "Argument[0].ArrayElement", "taint", "manual"] - - ["database/sql", "Rows", True, "Scan", "", "", "Argument[receiver]", "Argument[0].ArrayElement", "taint", "manual"] - ["database/sql", "Scanner", True, "Scan", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] - ["database/sql", "Tx", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql", "Tx", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] diff --git a/go/ql/lib/semmle/go/frameworks/stdlib/DatabaseSql.qll b/go/ql/lib/semmle/go/frameworks/stdlib/DatabaseSql.qll index 14534d2fa45..f4132688796 100644 --- a/go/ql/lib/semmle/go/frameworks/stdlib/DatabaseSql.qll +++ b/go/ql/lib/semmle/go/frameworks/stdlib/DatabaseSql.qll @@ -66,4 +66,24 @@ module DatabaseSql { result = this.getReceiver().getAPredecessor*().(DataFlow::MethodCallNode).getAnArgument() } } + + // These are expressed using TaintTracking::FunctionModel because varargs functions don't work with Models-as-Data sumamries yet. + private class SqlMethodModels extends TaintTracking::FunctionModel, Method { + FunctionInput inp; + FunctionOutput outp; + + SqlMethodModels() { + // signature: func (*Row) Scan(dest ...interface{}) error + this.hasQualifiedName("database/sql", "Row", "Scan") and + (inp.isReceiver() and outp.isParameter(_)) + or + // signature: func (*Rows) Scan(dest ...interface{}) error + this.hasQualifiedName("database/sql", "Rows", "Scan") and + (inp.isReceiver() and outp.isParameter(_)) + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + input = inp and output = outp + } + } } From 6a862f2f80e0a05862657bdb6040b0199bbcc93e Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 7 Jan 2025 21:10:48 -0500 Subject: [PATCH 32/71] Add Rows::Next back --- go/ql/lib/ext/database.sql.driver.model.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/go/ql/lib/ext/database.sql.driver.model.yml b/go/ql/lib/ext/database.sql.driver.model.yml index f4e46eaa343..ddaea25b793 100644 --- a/go/ql/lib/ext/database.sql.driver.model.yml +++ b/go/ql/lib/ext/database.sql.driver.model.yml @@ -23,5 +23,6 @@ extensions: data: - ["database/sql/driver", "Conn", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "ConnPrepareContext", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] + - ["database/sql/driver", "Rows", True, "Next", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "ValueConverter", True, "ConvertValue", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "Valuer", True, "Value", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] From c086945a9e1ebd1c7ab4cb909efb648ca26c7bf6 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 7 Jan 2025 21:14:25 -0500 Subject: [PATCH 33/71] Fix typo --- go/ql/lib/ext/database.sql.driver.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/lib/ext/database.sql.driver.model.yml b/go/ql/lib/ext/database.sql.driver.model.yml index ddaea25b793..0f33a6e14b8 100644 --- a/go/ql/lib/ext/database.sql.driver.model.yml +++ b/go/ql/lib/ext/database.sql.driver.model.yml @@ -23,6 +23,6 @@ extensions: data: - ["database/sql/driver", "Conn", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "ConnPrepareContext", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] - - ["database/sql/driver", "Rows", True, "Next", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["database/sql/driver", "Rows", True, "Next", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"] - ["database/sql/driver", "ValueConverter", True, "ConvertValue", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "Valuer", True, "Value", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] From 4e5d2e27b1d2a89ba3388ae2faf0a2d33a4b2bee Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 7 Jan 2025 22:07:58 -0500 Subject: [PATCH 34/71] user.go for example type --- .../semmle/go/dataflow/flowsources/local/database/user.go | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/user.go diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/user.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/user.go new file mode 100644 index 00000000000..f5a03dbe8b1 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/user.go @@ -0,0 +1,3 @@ +package test + +type User struct{} From 55c6bea08b142fda7a7f1679e1ca2cf1903793d6 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 7 Jan 2025 22:08:21 -0500 Subject: [PATCH 35/71] Add missing models --- go/ql/lib/ext/gorm.io.gorm.model.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/go/ql/lib/ext/gorm.io.gorm.model.yml b/go/ql/lib/ext/gorm.io.gorm.model.yml index a157d9d0899..7cea07e18ff 100644 --- a/go/ql/lib/ext/gorm.io.gorm.model.yml +++ b/go/ql/lib/ext/gorm.io.gorm.model.yml @@ -19,6 +19,10 @@ extensions: - ["group:gorm", "DB", True, "FirstOrCreate", "", "", "Argument[0]", "database", "manual"] - ["group:gorm", "DB", True, "FirstOrInit", "", "", "Argument[0]", "database", "manual"] - ["group:gorm", "DB", True, "Last", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "Model", "", "", "Argument[0]", "database", "manual"] + - ["group:gorm", "DB", True, "Pluck", "", "", "Argument[1]", "database", "manual"] + - ["group:gorm", "DB", True, "Row", "", "", "ReturnValue", "database", "manual"] + - ["group:gorm", "DB", True, "Rows", "", "", "ReturnValue[0]", "database", "manual"] - ["group:gorm", "DB", True, "Scan", "", "", "Argument[0]", "database", "manual"] - ["group:gorm", "DB", True, "Take", "", "", "Argument[0]", "database", "manual"] - addsTo: @@ -38,3 +42,8 @@ extensions: - ["group:gorm", "DB", True, "Exec", "", "", "Argument[0]", "sql-injection", "manual"] - ["group:gorm", "DB", True, "Distinct", "", "", "Argument[0]", "sql-injection", "manual"] - ["group:gorm", "DB", True, "Pluck", "", "", "Argument[0]", "sql-injection", "manual"] + - addsTo: + pack: codeql/go-all + extensible: summaryModel + data: + - ["group:gorm", "DB", True, "ScanRows", "", "", "Argument[0]", "Argument[1]", "taint", "manual"] From e7b0329d5d1755441d49c7ca02d0ac9218c1596c Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 7 Jan 2025 22:08:37 -0500 Subject: [PATCH 36/71] Test missing models --- .../flowsources/local/database/test_gorm.go | 18 +++++++++++++++-- .../database/vendor/gorm.io/gorm/stub.go | 20 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go index 02dc1feee85..9fc1de0de4e 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_gorm.go @@ -2,8 +2,6 @@ package test import "gorm.io/gorm" -type User struct{} - // test querying an Association func test_gorm_AssociationQuery(association *gorm.Association) { association.Find(&User{}) // $ source @@ -42,4 +40,20 @@ func test_gorm_db(db *gorm.DB) { db.Scan(&User{}) // $ source + var user User + db.Model(&user) // $ source + + row := db.Row() // $ source + ignore(row) + + rows, err := db.Rows() // $ source + ignore(err) + + var user2 User + db.ScanRows(rows, &user2) + + sink(user2) // $ hasTaintFlow="user2" + + var names []string + db.Pluck("name", &names) // $ source } diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go index e6170a2ed90..d1768610645 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go @@ -27,10 +27,18 @@ func (db *DB) First(dest interface{}, conds ...interface{}) *DB { return db } +func (db *DB) Model(value interface{}) *DB { + return db +} + func (db *DB) Last(dest interface{}, conds ...interface{}) *DB { return db } +func (db *DB) Pluck(column string, dest interface{}) *DB { + return db +} + func (db *DB) Take(dest interface{}, conds ...interface{}) *DB { return db } @@ -39,6 +47,18 @@ func (db *DB) Scan(dest interface{}) *DB { return db } +func (db *DB) ScanRows(rows *sql.Rows, result interface{}) error { + return nil +} + +func (db *DB) Row() *sql.Row { + return nil +} + +func (db *DB) Rows() (*sql.Rows, error) { + return nil, nil +} + type Association struct { DB *DB } From b249ee5a01f6494c39557a56c80e1e32a3c1184b Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Wed, 18 Dec 2024 23:37:20 -0500 Subject: [PATCH 37/71] Basic integration tests --- .../blazor/BlazorTest/BlazorTest.csproj | 9 ++ .../blazor/BlazorTest/Components/App.razor | 20 +++ .../Components/Layout/MainLayout.razor | 23 ++++ .../Components/Layout/MainLayout.razor.css | 96 ++++++++++++++ .../Components/Layout/NavMenu.razor | 19 +++ .../Components/Layout/NavMenu.razor.css | 105 +++++++++++++++ .../BlazorTest/Components/MyInput.razor | 20 +++ .../BlazorTest/Components/MyOutput.razor | 11 ++ .../BlazorTest/Components/Pages/Error.razor | 36 +++++ .../Components/Pages/TestPage.razor | 125 ++++++++++++++++++ .../blazor/BlazorTest/Components/Routes.razor | 6 + .../BlazorTest/Components/_Imports.razor | 10 ++ .../blazor/BlazorTest/Program.cs | 27 ++++ .../BlazorTest/Properties/launchSettings.json | 14 ++ .../blazor/BlazorTest/appsettings.json | 9 ++ .../blazor/BlazorTest/global.json | 5 + .../blazor/BlazorTest/wwwroot/app.css | 51 +++++++ .../wwwroot/bootstrap/bootstrap.min.css | 7 + .../wwwroot/bootstrap/bootstrap.min.css.map | 1 + .../blazor/BlazorTest/wwwroot/favicon.png | Bin 0 -> 1148 bytes .../all-platforms/blazor/Files.expected | 22 +++ .../all-platforms/blazor/Files.ql | 5 + .../all-platforms/blazor/htmlSinks.expected | 8 ++ .../all-platforms/blazor/htmlSinks.ql | 7 + .../all-platforms/blazor/test.py | 2 + .../BlazorTest/BlazorTest.csproj | 9 ++ .../BlazorTest/Components/App.razor | 20 +++ .../Components/Layout/MainLayout.razor | 23 ++++ .../Components/Layout/MainLayout.razor.css | 96 ++++++++++++++ .../Components/Layout/NavMenu.razor | 19 +++ .../Components/Layout/NavMenu.razor.css | 105 +++++++++++++++ .../BlazorTest/Components/MyInput.razor | 20 +++ .../BlazorTest/Components/MyOutput.razor | 11 ++ .../BlazorTest/Components/Pages/Error.razor | 36 +++++ .../Components/Pages/TestPage.razor | 125 ++++++++++++++++++ .../BlazorTest/Components/Routes.razor | 6 + .../BlazorTest/Components/_Imports.razor | 10 ++ .../BlazorTest/Program.cs | 27 ++++ .../BlazorTest/Properties/launchSettings.json | 14 ++ .../BlazorTest/appsettings.json | 9 ++ .../BlazorTest/global.json | 5 + .../BlazorTest/wwwroot/app.css | 51 +++++++ .../wwwroot/bootstrap/bootstrap.min.css | 7 + .../wwwroot/bootstrap/bootstrap.min.css.map | 1 + .../BlazorTest/wwwroot/favicon.png | Bin 0 -> 1148 bytes .../blazor_build_mode_none/Files.expected | 22 +++ .../blazor_build_mode_none/Files.ql | 5 + .../blazor_build_mode_none/htmlSinks.expected | 8 ++ .../blazor_build_mode_none/htmlSinks.ql | 7 + .../blazor_build_mode_none/test.py | 2 + .../blazor_net_8/BlazorTest/BlazorTest.csproj | 9 ++ .../BlazorTest/Components/App.razor | 20 +++ .../Components/Layout/MainLayout.razor | 23 ++++ .../Components/Layout/MainLayout.razor.css | 96 ++++++++++++++ .../Components/Layout/NavMenu.razor | 19 +++ .../Components/Layout/NavMenu.razor.css | 105 +++++++++++++++ .../BlazorTest/Components/MyInput.razor | 20 +++ .../BlazorTest/Components/MyOutput.razor | 11 ++ .../BlazorTest/Components/Pages/Error.razor | 36 +++++ .../Components/Pages/TestPage.razor | 125 ++++++++++++++++++ .../BlazorTest/Components/Routes.razor | 6 + .../BlazorTest/Components/_Imports.razor | 10 ++ .../blazor_net_8/BlazorTest/Program.cs | 27 ++++ .../BlazorTest/Properties/launchSettings.json | 14 ++ .../blazor_net_8/BlazorTest/appsettings.json | 9 ++ .../blazor_net_8/BlazorTest/global.json | 5 + .../blazor_net_8/BlazorTest/wwwroot/app.css | 51 +++++++ .../wwwroot/bootstrap/bootstrap.min.css | 7 + .../wwwroot/bootstrap/bootstrap.min.css.map | 1 + .../BlazorTest/wwwroot/favicon.png | Bin 0 -> 1148 bytes .../all-platforms/blazor_net_8/Files.expected | 22 +++ .../all-platforms/blazor_net_8/Files.ql | 5 + .../blazor_net_8/htmlSinks.expected | 8 ++ .../all-platforms/blazor_net_8/htmlSinks.ql | 7 + .../all-platforms/blazor_net_8/test.py | 2 + 75 files changed, 1914 insertions(+) create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/App.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyInput.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyOutput.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/Error.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/TestPage.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Routes.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/_Imports.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Properties/launchSettings.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/appsettings.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/app.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css.map create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/favicon.png create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/Files.expected create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/Files.ql create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/htmlSinks.expected create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/htmlSinks.ql create mode 100644 csharp/ql/integration-tests/all-platforms/blazor/test.py create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/BlazorTest.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/App.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/Layout/MainLayout.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/Layout/MainLayout.razor.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/Layout/NavMenu.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/Layout/NavMenu.razor.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/MyInput.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/MyOutput.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/Pages/Error.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/Pages/TestPage.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/Routes.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Components/_Imports.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/Properties/launchSettings.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/appsettings.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/wwwroot/app.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/wwwroot/bootstrap/bootstrap.min.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/wwwroot/bootstrap/bootstrap.min.css.map create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/wwwroot/favicon.png create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/Files.expected create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/Files.ql create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/htmlSinks.expected create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/htmlSinks.ql create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/test.py create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/BlazorTest.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/App.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/Layout/MainLayout.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/Layout/MainLayout.razor.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/Layout/NavMenu.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/Layout/NavMenu.razor.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/MyInput.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/MyOutput.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/Pages/Error.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/Pages/TestPage.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/Routes.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Components/_Imports.razor create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/Properties/launchSettings.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/appsettings.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/global.json create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/wwwroot/app.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/wwwroot/bootstrap/bootstrap.min.css create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/wwwroot/bootstrap/bootstrap.min.css.map create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/BlazorTest/wwwroot/favicon.png create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/Files.expected create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/Files.ql create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/htmlSinks.expected create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/htmlSinks.ql create mode 100644 csharp/ql/integration-tests/all-platforms/blazor_net_8/test.py diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj new file mode 100644 index 00000000000..1b28a01c81c --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/App.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/App.razor new file mode 100644 index 00000000000..98d89955634 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/App.razor @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor new file mode 100644 index 00000000000..5a24bb13711 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor @@ -0,0 +1,23 @@ +@inherits LayoutComponentBase + +

+ + +
+ + +
+ @Body +
+
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor.css b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor.css new file mode 100644 index 00000000000..038baf178b4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/MainLayout.razor.css @@ -0,0 +1,96 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor new file mode 100644 index 00000000000..1d88eaaf906 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor @@ -0,0 +1,19 @@ + + + + + diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor.css b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor.css new file mode 100644 index 00000000000..4e15395e091 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Layout/NavMenu.razor.css @@ -0,0 +1,105 @@ +.navbar-toggler { + appearance: none; + cursor: pointer; + width: 3.5rem; + height: 2.5rem; + color: white; + position: absolute; + top: 0.5rem; + right: 1rem; + border: 1px solid rgba(255, 255, 255, 0.1); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); +} + +.navbar-toggler:checked { + background-color: rgba(255, 255, 255, 0.5); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep .nav-link { + color: #d7d7d7; + background: none; + border: none; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + width: 100%; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep .nav-link:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +.nav-scrollable { + display: none; +} + +.navbar-toggler:checked ~ .nav-scrollable { + display: block; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .nav-scrollable { + /* Never collapse the sidebar for wide screens */ + display: block; + + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyInput.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyInput.razor new file mode 100644 index 00000000000..30a4cb1d4ab --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyInput.razor @@ -0,0 +1,20 @@ +@rendermode InteractiveServer + + + +@code { + [Parameter] + public string? Param1 { get; set; } = ""; + + [Parameter] + public EventCallback ValueChanged { get; set; } + + [Parameter] + public EventCallback Param1Changed { get; set; } + + private void Fire() + { + ValueChanged.InvokeAsync(Param1); + Param1Changed.InvokeAsync(Param1); + } +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyOutput.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyOutput.razor new file mode 100644 index 00000000000..e583e6b2e9c --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/MyOutput.razor @@ -0,0 +1,11 @@ +@rendermode InteractiveServer + +
+

Value from InputText: @Value

+

Raw value from InputText: @(new MarkupString(Value))

+
+ +@code { + [Parameter] + public string Value { get; set; } = ""; +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/Error.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/Error.razor new file mode 100644 index 00000000000..576cc2d2f4d --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/Error.razor @@ -0,0 +1,36 @@ +@page "/Error" +@using System.Diagnostics + +Error + +

Error.

+

An error occurred while processing your request.

+ +@if (ShowRequestId) +{ +

+ Request ID: @RequestId +

+} + +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+ +@code{ + [CascadingParameter] + private HttpContext? HttpContext { get; set; } + + private string? RequestId { get; set; } + private bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + protected override void OnInitialized() => + RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier; +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/TestPage.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/TestPage.razor new file mode 100644 index 00000000000..39238d72429 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Pages/TestPage.razor @@ -0,0 +1,125 @@ +@page "/" +@page "/test/{urlParam?}" +@rendermode InteractiveServer + +TestPage + +
+

Route parameter

+

Go to: /test/@XssUrl

+

Parameter from URL: @UrlParam

+

Raw parameter from URL: @((MarkupString)UrlParam)

+
+ +
+ +
+

Query parameter

+

Go to: /test/?qs=@XssUrl

+

Parameter from query string: @QueryParam

+

Raw parameter from query string: @(new MarkupString(QueryParam))

+
+ +
+ +
+

Bind InputText component

+ +

Value from InputText: @InputValue1

+

Raw value from InputText: @(new MarkupString(InputValue1))

+
+ +
+ +
+

Bind input element

+ +

Value from InputText: @InputValue2

+

Raw value from InputText: @(new MarkupString(InputValue2))

+
+ +
+ +
+

Bind through object property

+ +

Value from InputText: @Container1.Value

+

Raw value from InputText: @(new MarkupString(Container1.Value))

+
+ +
+ +
+

Input component with custom event

+ +

Value from InputText: @InputValue3

+

Raw value from InputText: @(new MarkupString(InputValue3))

+
+ +
+ +
+

Input component with binding

+ +

Value from InputText: @InputValue4

+

Raw value from InputText: @(new MarkupString(InputValue4))

+
+ +
+ +
+

Input, Output components

+ + +
+ +
+ +
+

Bind InputText, Output component

+ + +
+ +@code { + + public class Container + { + public string? Value { get; set; } = ""; + } + + private const string XssUrl = "aaaa<%2Fb>"; + private const string XssUrl2 = "aaaa"; + + [Parameter] + public string UrlParam { get; set; } = ""; + + [SupplyParameterFromQuery(Name = "qs")] + public string QueryParam { get; set; } = ""; + + public string InputValue1 { get; set; } = ""; + public string InputValue2 { get; set; } = ""; + public string InputValue3 { get; set; } = ""; + public string InputValue4 { get; set; } = ""; + public string InputValue5 { get; set; } = ""; + public string InputValue6 { get; set; } = ""; + + public Container Container1 { get; set; } = new Container(); + + protected override void OnInitialized() + { + InputValue1 = XssUrl2; + InputValue2 = XssUrl2; + Container1.Value = XssUrl2; + InputValue3 = XssUrl2; + InputValue4 = XssUrl2; + InputValue5 = XssUrl2; + InputValue6 = XssUrl2; + + } + + private void MyInputChanged(string value) + { + InputValue3 = value; + } +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Routes.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Routes.razor new file mode 100644 index 00000000000..f756e19dfbc --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/Routes.razor @@ -0,0 +1,6 @@ + + + + + + diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/_Imports.razor b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/_Imports.razor new file mode 100644 index 00000000000..42dc51355f0 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Components/_Imports.razor @@ -0,0 +1,10 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using BlazorTest +@using BlazorTest.Components diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Program.cs b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Program.cs new file mode 100644 index 00000000000..55b6db8d0aa --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Program.cs @@ -0,0 +1,27 @@ +using BlazorTest.Components; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error", createScopeForErrors: true); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); + +app.UseStaticFiles(); +app.UseAntiforgery(); + +app.MapRazorComponents() + .AddInteractiveServerRenderMode(); + +app.Run(); diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Properties/launchSettings.json b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Properties/launchSettings.json new file mode 100644 index 00000000000..10df13b7b0b --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/Properties/launchSettings.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5047", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/appsettings.json b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/appsettings.json new file mode 100644 index 00000000000..10f68b8c8b4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json new file mode 100644 index 00000000000..7a0e39d71fa --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "9.0.100" + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/app.css b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/app.css new file mode 100644 index 00000000000..2bd9b7896d3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/app.css @@ -0,0 +1,51 @@ +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +a, .btn-link { + color: #006bb7; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +h1:focus { + outline: none; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid #e50000; +} + +.validation-message { + color: #e50000; +} + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.darker-border-checkbox.form-check-input { + border-color: #929292; +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css new file mode 100644 index 00000000000..02ae65b5fe5 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-rgb:33,37,41;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css.map b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css.map new file mode 100644 index 00000000000..afcd9e33e9e --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/wwwroot/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}-root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`