diff --git a/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLLexer.g4 b/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLLexer.g4 index d13921c946adb..aa79ba245f380 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLLexer.g4 +++ b/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLLexer.g4 @@ -203,6 +203,10 @@ PARAMETERS: '"Parameters"'; CREDENTIALS: '"Credentials"'; +ROLEARN: '"RoleArn"'; + +ROLEARNPATH: '"RoleArn.$"'; + RESULTSELECTOR: '"ResultSelector"'; ITEMREADER: '"ItemReader"'; diff --git a/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLParser.g4 b/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLParser.g4 index 2cc3d09e048d2..62e6d283d5653 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLParser.g4 +++ b/localstack-core/localstack/services/stepfunctions/asl/antlr/ASLParser.g4 @@ -178,7 +178,16 @@ max_concurrency_path_decl: parameters_decl: PARAMETERS COLON payload_tmpl_decl; -credentials_decl: CREDENTIALS COLON payload_tmpl_decl; +credentials_decl: CREDENTIALS COLON LBRACE role_arn_decl RBRACE; + +role_arn_decl: + ROLEARN COLON STRINGJSONATA # role_arn_jsonata + | ROLEARNPATH COLON STRINGPATH # role_arn_path + | ROLEARNPATH COLON STRINGPATHCONTEXTOBJ # role_arn_path_context_obj + | ROLEARNPATH COLON STRINGINTRINSICFUNC # role_arn_intrinsic_func + | ROLEARNPATH COLON variable_sample # role_arn_var + | ROLEARN COLON keyword_or_string # role_arn_str +; timeout_seconds_decl: TIMEOUTSECONDS COLON STRINGJSONATA # timeout_seconds_jsonata @@ -648,6 +657,8 @@ keyword_or_string: | RESULT | PARAMETERS | CREDENTIALS + | ROLEARN + | ROLEARNPATH | RESULTSELECTOR | ITEMREADER | READERCONFIG diff --git a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLLexer.py b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLLexer.py index ef4944bfd32e9..578ffc75320f7 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLLexer.py +++ b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLLexer.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,0,160,2837,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7, + 4,0,162,2863,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7, 5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12, 2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19, 7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25, @@ -37,1044 +37,1055 @@ def serializedATN(): 7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,2,152,7,152, 2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157,7,157,2,158, 7,158,2,159,7,159,2,160,7,160,2,161,7,161,2,162,7,162,2,163,7,163, - 2,164,7,164,2,165,7,165,2,166,7,166,1,0,1,0,1,1,1,1,1,2,1,2,1,3, - 1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7, - 1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13, - 1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15, - 1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17, - 1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18, - 1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20, - 1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21, - 1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24, - 1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25, - 1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27, - 1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28, - 1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29, - 1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30, - 1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,31, - 1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33, - 1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, - 1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36, - 1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38, - 1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, - 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, - 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40, + 2,164,7,164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168,1,0, + 1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,6,1,6, + 1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9, + 1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12, + 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14, + 1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19, + 1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21, + 1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,23, + 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24, + 1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25, + 1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26, + 1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27, + 1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29, + 1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30, + 1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30, + 1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31, + 1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33, + 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34, + 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35, + 1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36, + 1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37, + 1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, + 1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, + 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40, 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41, 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, - 1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, + 1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42, 1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, - 1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43, + 1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43, 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44, - 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,45, + 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,44, + 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, + 1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46, 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, - 1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47, 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, - 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48, - 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49, - 1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50, - 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51, + 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49, + 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50, + 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50, 1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51, - 1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52, + 1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52, 1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52, + 1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, - 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, - 1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54, + 1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54, 1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54, - 1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55, - 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56, + 1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55, + 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55, 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56, - 1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57, + 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57, 1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57, + 1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, - 1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61, - 1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61, - 1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61, + 1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62, 1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, - 1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, + 1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63, 1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64, + 1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64, 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64, - 1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65, 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66, - 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67, + 1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66, + 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67, 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68, 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, - 1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, + 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, - 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70, - 1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72, - 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73, - 1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74, - 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74, + 1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70, + 1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, + 1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73, + 1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74, + 1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75, 1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75, - 1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76, 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76, - 1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77, - 1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78, - 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78, - 1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80, - 1,80,1,80,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81, - 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82, - 1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83, - 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84, - 1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85, - 1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86, - 1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87, - 1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87, - 1,87,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88, - 1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89, - 1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90, - 1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,91, - 1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92, - 1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93, - 1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94, - 1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96, - 1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1,97, - 1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,98,1,98, - 1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98, - 1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99, - 1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100, - 1,100,1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101, + 1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77, + 1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77, + 1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78, + 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79, + 1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81,1,81, + 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82, + 1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82, + 1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83, + 1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84, + 1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85, + 1,85,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86, + 1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87, + 1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,88,1,88, + 1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88, + 1,88,1,88,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89, + 1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91, + 1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92, + 1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93, + 1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94, + 1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95, + 1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96, + 1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97, + 1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98, + 1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,100, + 1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100,1,100, + 1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101, 1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102, 1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102, - 1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103, - 1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105, + 1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103, + 1,103,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, + 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,105, 1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105, - 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, - 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, - 1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108, + 1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108, 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108, - 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108, - 1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109, + 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109, 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109, 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109, - 1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110, - 1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111, - 1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,112, - 1,112,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114, - 1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115,1,115, - 1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116, - 1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117, - 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118, - 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119, - 1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,120, - 1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,121, - 1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121, - 1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122, - 1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,123, - 1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123, - 1,123,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124, - 1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125, - 1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,127, - 1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128,1,128,1,128, - 1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128, - 1,128,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129, + 1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110, + 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110, + 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112, + 1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113, + 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114, + 1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115, + 1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117, + 1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,118, + 1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119, + 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120, + 1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121, + 1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122, + 1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122, + 1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,123,1,123, + 1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124, + 1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,125, + 1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,125, + 1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,126, + 1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126, + 1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128,1,128, + 1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129,1,129,1,129, 1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,130,1,130,1,130,1,130, - 1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,132,1,132, - 1,132,1,132,1,132,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133, - 1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,134,1,134,1,134, - 1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,135, - 1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135, - 1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135, - 1,135,1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,136,1,136,1,136, - 1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,136, - 1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,137,1,137,1,137, + 1,130,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131,1,131, + 1,131,1,131,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132, + 1,132,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,133,1,133, + 1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,134,1,134,1,134,1,134, + 1,134,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135, + 1,135,1,135,1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,136,1,136, + 1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137,1,137,1,137,1,137, 1,137,1,137,1,137,1,137,1,137,1,137,1,137,1,137,1,137,1,137,1,137, - 1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138, + 1,137,1,137,1,137,1,137,1,137,1,137,1,137,1,137,1,137,1,138,1,138, 1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138, - 1,138,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139, - 1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139, - 1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140, + 1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138,1,138, + 1,138,1,138,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139, + 1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,139,1,140,1,140,1,140, 1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140, - 1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,140,1,141, + 1,140,1,140,1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,141, 1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141, - 1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141, - 1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142, + 1,141,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142,1,142,1,142, + 1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142, 1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142, - 1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143, + 1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,143,1,143,1,143, 1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143, - 1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,144, - 1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144, + 1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143,1,143, + 1,143,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144, 1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144, - 1,144,1,144,1,144,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145, - 1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145, + 1,144,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145, 1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145, - 1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145,1,145, - 1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146, + 1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146,1,146,1,146,1,146, 1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146, - 1,146,1,146,1,146,1,146,1,147,1,147,1,147,1,147,1,147,1,147,1,147, + 1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,146,1,147,1,147,1,147, 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147, - 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,148, - 1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148, + 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147, + 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147, + 1,147,1,147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,1,148,1,148, 1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148, - 1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149, + 1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,149,1,149, + 1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149, 1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149, - 1,149,1,149,1,150,1,150,1,150,5,150,2679,8,150,10,150,12,150,2682, - 9,150,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,151,1,151,1,151, - 5,151,2694,8,151,10,151,12,151,2697,9,151,1,151,1,151,1,152,1,152, - 1,152,1,152,1,152,1,152,1,152,1,152,1,152,5,152,2710,8,152,10,152, - 12,152,2713,9,152,1,152,3,152,2716,8,152,1,153,1,153,1,153,1,153, - 1,153,1,153,5,153,2724,8,153,10,153,12,153,2727,9,153,1,153,1,153, - 1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154, - 4,154,2742,8,154,11,154,12,154,2743,1,154,1,154,1,154,5,154,2749, - 8,154,10,154,12,154,2752,9,154,1,154,1,154,1,154,1,155,1,155,1,155, - 5,155,2760,8,155,10,155,12,155,2763,9,155,1,155,1,155,1,156,1,156, - 1,156,5,156,2770,8,156,10,156,12,156,2773,9,156,1,156,1,156,1,157, - 1,157,1,157,3,157,2780,8,157,1,158,1,158,1,158,1,158,1,158,1,158, - 1,159,1,159,1,160,1,160,1,161,1,161,1,161,1,161,1,162,1,162,1,162, - 1,162,1,163,1,163,1,163,5,163,2803,8,163,10,163,12,163,2806,9,163, - 3,163,2808,8,163,1,164,3,164,2811,8,164,1,164,1,164,1,164,4,164, - 2816,8,164,11,164,12,164,2817,3,164,2820,8,164,1,164,3,164,2823, - 8,164,1,165,1,165,3,165,2827,8,165,1,165,1,165,1,166,4,166,2832, - 8,166,11,166,12,166,2833,1,166,1,166,0,0,167,1,1,3,2,5,3,7,4,9,5, - 11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33, - 17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55, - 28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77, - 39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99, - 50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,59, - 119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137, - 69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78, - 157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175, - 88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193,97, - 195,98,197,99,199,100,201,101,203,102,205,103,207,104,209,105,211, - 106,213,107,215,108,217,109,219,110,221,111,223,112,225,113,227, - 114,229,115,231,116,233,117,235,118,237,119,239,120,241,121,243, - 122,245,123,247,124,249,125,251,126,253,127,255,128,257,129,259, - 130,261,131,263,132,265,133,267,134,269,135,271,136,273,137,275, - 138,277,139,279,140,281,141,283,142,285,143,287,144,289,145,291, - 146,293,147,295,148,297,149,299,150,301,151,303,152,305,153,307, - 154,309,155,311,156,313,157,315,0,317,0,319,0,321,0,323,0,325,0, - 327,158,329,159,331,0,333,160,1,0,10,2,0,46,46,91,91,3,0,65,90,95, - 95,97,122,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116, - 116,3,0,48,57,65,70,97,102,3,0,0,31,34,34,92,92,1,0,49,57,1,0,48, - 57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,9,10,13,13,32,32,2855,0, - 1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1, - 0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1, - 0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1, - 0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1, - 0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1, - 0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1, - 0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1, - 0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1, - 0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1, - 0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101, - 1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0, - 0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1, - 0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0, - 129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0, - 0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147, - 1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0, - 0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1, - 0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0, - 175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0, - 0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193, - 1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0, - 0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1, - 0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0, - 221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0, - 0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239, - 1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0, - 0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1, - 0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0, - 267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0, - 0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285, - 1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0, - 0,295,1,0,0,0,0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1, - 0,0,0,0,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0, - 313,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,333,1,0,0,0,1,335,1,0, - 0,0,3,337,1,0,0,0,5,339,1,0,0,0,7,341,1,0,0,0,9,343,1,0,0,0,11,345, - 1,0,0,0,13,347,1,0,0,0,15,352,1,0,0,0,17,358,1,0,0,0,19,363,1,0, - 0,0,21,373,1,0,0,0,23,382,1,0,0,0,25,392,1,0,0,0,27,404,1,0,0,0, - 29,414,1,0,0,0,31,421,1,0,0,0,33,428,1,0,0,0,35,437,1,0,0,0,37,444, - 1,0,0,0,39,454,1,0,0,0,41,461,1,0,0,0,43,468,1,0,0,0,45,479,1,0, - 0,0,47,485,1,0,0,0,49,495,1,0,0,0,51,507,1,0,0,0,53,518,1,0,0,0, - 55,528,1,0,0,0,57,539,1,0,0,0,59,545,1,0,0,0,61,561,1,0,0,0,63,581, - 1,0,0,0,65,593,1,0,0,0,67,602,1,0,0,0,69,614,1,0,0,0,71,626,1,0, - 0,0,73,637,1,0,0,0,75,651,1,0,0,0,77,657,1,0,0,0,79,673,1,0,0,0, - 81,693,1,0,0,0,83,714,1,0,0,0,85,739,1,0,0,0,87,766,1,0,0,0,89,797, - 1,0,0,0,91,815,1,0,0,0,93,837,1,0,0,0,95,861,1,0,0,0,97,889,1,0, - 0,0,99,894,1,0,0,0,101,909,1,0,0,0,103,928,1,0,0,0,105,948,1,0,0, - 0,107,972,1,0,0,0,109,998,1,0,0,0,111,1028,1,0,0,0,113,1045,1,0, - 0,0,115,1066,1,0,0,0,117,1089,1,0,0,0,119,1116,1,0,0,0,121,1132, - 1,0,0,0,123,1150,1,0,0,0,125,1172,1,0,0,0,127,1195,1,0,0,0,129,1222, - 1,0,0,0,131,1251,1,0,0,0,133,1284,1,0,0,0,135,1304,1,0,0,0,137,1328, - 1,0,0,0,139,1354,1,0,0,0,141,1384,1,0,0,0,143,1398,1,0,0,0,145,1408, - 1,0,0,0,147,1424,1,0,0,0,149,1436,1,0,0,0,151,1453,1,0,0,0,153,1474, - 1,0,0,0,155,1493,1,0,0,0,157,1516,1,0,0,0,159,1534,1,0,0,0,161,1541, - 1,0,0,0,163,1550,1,0,0,0,165,1564,1,0,0,0,167,1580,1,0,0,0,169,1591, - 1,0,0,0,171,1607,1,0,0,0,173,1618,1,0,0,0,175,1633,1,0,0,0,177,1654, - 1,0,0,0,179,1671,1,0,0,0,181,1682,1,0,0,0,183,1694,1,0,0,0,185,1707, - 1,0,0,0,187,1715,1,0,0,0,189,1727,1,0,0,0,191,1740,1,0,0,0,193,1749, - 1,0,0,0,195,1762,1,0,0,0,197,1776,1,0,0,0,199,1793,1,0,0,0,201,1806, - 1,0,0,0,203,1821,1,0,0,0,205,1833,1,0,0,0,207,1853,1,0,0,0,209,1866, - 1,0,0,0,211,1877,1,0,0,0,213,1892,1,0,0,0,215,1916,1,0,0,0,217,1944, - 1,0,0,0,219,1973,1,0,0,0,221,2006,1,0,0,0,223,2014,1,0,0,0,225,2029, - 1,0,0,0,227,2036,1,0,0,0,229,2042,1,0,0,0,231,2050,1,0,0,0,233,2062, - 1,0,0,0,235,2070,1,0,0,0,237,2082,1,0,0,0,239,2090,1,0,0,0,241,2104, - 1,0,0,0,243,2122,1,0,0,0,245,2136,1,0,0,0,247,2150,1,0,0,0,249,2168, - 1,0,0,0,251,2185,1,0,0,0,253,2192,1,0,0,0,255,2199,1,0,0,0,257,2207, - 1,0,0,0,259,2223,1,0,0,0,261,2234,1,0,0,0,263,2244,1,0,0,0,265,2253, - 1,0,0,0,267,2262,1,0,0,0,269,2274,1,0,0,0,271,2287,1,0,0,0,273,2314, - 1,0,0,0,275,2340,1,0,0,0,277,2357,1,0,0,0,279,2377,1,0,0,0,281,2398, - 1,0,0,0,283,2430,1,0,0,0,285,2460,1,0,0,0,287,2482,1,0,0,0,289,2507, - 1,0,0,0,291,2533,1,0,0,0,293,2574,1,0,0,0,295,2600,1,0,0,0,297,2628, - 1,0,0,0,299,2658,1,0,0,0,301,2675,1,0,0,0,303,2687,1,0,0,0,305,2715, - 1,0,0,0,307,2717,1,0,0,0,309,2730,1,0,0,0,311,2756,1,0,0,0,313,2766, - 1,0,0,0,315,2776,1,0,0,0,317,2781,1,0,0,0,319,2787,1,0,0,0,321,2789, - 1,0,0,0,323,2791,1,0,0,0,325,2795,1,0,0,0,327,2807,1,0,0,0,329,2810, - 1,0,0,0,331,2824,1,0,0,0,333,2831,1,0,0,0,335,336,5,44,0,0,336,2, - 1,0,0,0,337,338,5,58,0,0,338,4,1,0,0,0,339,340,5,91,0,0,340,6,1, - 0,0,0,341,342,5,93,0,0,342,8,1,0,0,0,343,344,5,123,0,0,344,10,1, - 0,0,0,345,346,5,125,0,0,346,12,1,0,0,0,347,348,5,116,0,0,348,349, - 5,114,0,0,349,350,5,117,0,0,350,351,5,101,0,0,351,14,1,0,0,0,352, - 353,5,102,0,0,353,354,5,97,0,0,354,355,5,108,0,0,355,356,5,115,0, - 0,356,357,5,101,0,0,357,16,1,0,0,0,358,359,5,110,0,0,359,360,5,117, - 0,0,360,361,5,108,0,0,361,362,5,108,0,0,362,18,1,0,0,0,363,364,5, - 34,0,0,364,365,5,67,0,0,365,366,5,111,0,0,366,367,5,109,0,0,367, - 368,5,109,0,0,368,369,5,101,0,0,369,370,5,110,0,0,370,371,5,116, - 0,0,371,372,5,34,0,0,372,20,1,0,0,0,373,374,5,34,0,0,374,375,5,83, - 0,0,375,376,5,116,0,0,376,377,5,97,0,0,377,378,5,116,0,0,378,379, - 5,101,0,0,379,380,5,115,0,0,380,381,5,34,0,0,381,22,1,0,0,0,382, - 383,5,34,0,0,383,384,5,83,0,0,384,385,5,116,0,0,385,386,5,97,0,0, - 386,387,5,114,0,0,387,388,5,116,0,0,388,389,5,65,0,0,389,390,5,116, - 0,0,390,391,5,34,0,0,391,24,1,0,0,0,392,393,5,34,0,0,393,394,5,78, - 0,0,394,395,5,101,0,0,395,396,5,120,0,0,396,397,5,116,0,0,397,398, - 5,83,0,0,398,399,5,116,0,0,399,400,5,97,0,0,400,401,5,116,0,0,401, - 402,5,101,0,0,402,403,5,34,0,0,403,26,1,0,0,0,404,405,5,34,0,0,405, - 406,5,86,0,0,406,407,5,101,0,0,407,408,5,114,0,0,408,409,5,115,0, - 0,409,410,5,105,0,0,410,411,5,111,0,0,411,412,5,110,0,0,412,413, - 5,34,0,0,413,28,1,0,0,0,414,415,5,34,0,0,415,416,5,84,0,0,416,417, - 5,121,0,0,417,418,5,112,0,0,418,419,5,101,0,0,419,420,5,34,0,0,420, - 30,1,0,0,0,421,422,5,34,0,0,422,423,5,84,0,0,423,424,5,97,0,0,424, - 425,5,115,0,0,425,426,5,107,0,0,426,427,5,34,0,0,427,32,1,0,0,0, - 428,429,5,34,0,0,429,430,5,67,0,0,430,431,5,104,0,0,431,432,5,111, - 0,0,432,433,5,105,0,0,433,434,5,99,0,0,434,435,5,101,0,0,435,436, - 5,34,0,0,436,34,1,0,0,0,437,438,5,34,0,0,438,439,5,70,0,0,439,440, - 5,97,0,0,440,441,5,105,0,0,441,442,5,108,0,0,442,443,5,34,0,0,443, - 36,1,0,0,0,444,445,5,34,0,0,445,446,5,83,0,0,446,447,5,117,0,0,447, - 448,5,99,0,0,448,449,5,99,0,0,449,450,5,101,0,0,450,451,5,101,0, - 0,451,452,5,100,0,0,452,453,5,34,0,0,453,38,1,0,0,0,454,455,5,34, - 0,0,455,456,5,80,0,0,456,457,5,97,0,0,457,458,5,115,0,0,458,459, - 5,115,0,0,459,460,5,34,0,0,460,40,1,0,0,0,461,462,5,34,0,0,462,463, - 5,87,0,0,463,464,5,97,0,0,464,465,5,105,0,0,465,466,5,116,0,0,466, - 467,5,34,0,0,467,42,1,0,0,0,468,469,5,34,0,0,469,470,5,80,0,0,470, - 471,5,97,0,0,471,472,5,114,0,0,472,473,5,97,0,0,473,474,5,108,0, - 0,474,475,5,108,0,0,475,476,5,101,0,0,476,477,5,108,0,0,477,478, - 5,34,0,0,478,44,1,0,0,0,479,480,5,34,0,0,480,481,5,77,0,0,481,482, - 5,97,0,0,482,483,5,112,0,0,483,484,5,34,0,0,484,46,1,0,0,0,485,486, - 5,34,0,0,486,487,5,67,0,0,487,488,5,104,0,0,488,489,5,111,0,0,489, - 490,5,105,0,0,490,491,5,99,0,0,491,492,5,101,0,0,492,493,5,115,0, - 0,493,494,5,34,0,0,494,48,1,0,0,0,495,496,5,34,0,0,496,497,5,67, - 0,0,497,498,5,111,0,0,498,499,5,110,0,0,499,500,5,100,0,0,500,501, - 5,105,0,0,501,502,5,116,0,0,502,503,5,105,0,0,503,504,5,111,0,0, - 504,505,5,110,0,0,505,506,5,34,0,0,506,50,1,0,0,0,507,508,5,34,0, - 0,508,509,5,86,0,0,509,510,5,97,0,0,510,511,5,114,0,0,511,512,5, - 105,0,0,512,513,5,97,0,0,513,514,5,98,0,0,514,515,5,108,0,0,515, - 516,5,101,0,0,516,517,5,34,0,0,517,52,1,0,0,0,518,519,5,34,0,0,519, - 520,5,68,0,0,520,521,5,101,0,0,521,522,5,102,0,0,522,523,5,97,0, - 0,523,524,5,117,0,0,524,525,5,108,0,0,525,526,5,116,0,0,526,527, - 5,34,0,0,527,54,1,0,0,0,528,529,5,34,0,0,529,530,5,66,0,0,530,531, - 5,114,0,0,531,532,5,97,0,0,532,533,5,110,0,0,533,534,5,99,0,0,534, - 535,5,104,0,0,535,536,5,101,0,0,536,537,5,115,0,0,537,538,5,34,0, - 0,538,56,1,0,0,0,539,540,5,34,0,0,540,541,5,65,0,0,541,542,5,110, - 0,0,542,543,5,100,0,0,543,544,5,34,0,0,544,58,1,0,0,0,545,546,5, - 34,0,0,546,547,5,66,0,0,547,548,5,111,0,0,548,549,5,111,0,0,549, - 550,5,108,0,0,550,551,5,101,0,0,551,552,5,97,0,0,552,553,5,110,0, - 0,553,554,5,69,0,0,554,555,5,113,0,0,555,556,5,117,0,0,556,557,5, - 97,0,0,557,558,5,108,0,0,558,559,5,115,0,0,559,560,5,34,0,0,560, - 60,1,0,0,0,561,562,5,34,0,0,562,563,5,66,0,0,563,564,5,111,0,0,564, - 565,5,111,0,0,565,566,5,108,0,0,566,567,5,101,0,0,567,568,5,97,0, - 0,568,569,5,110,0,0,569,570,5,69,0,0,570,571,5,113,0,0,571,572,5, - 117,0,0,572,573,5,97,0,0,573,574,5,108,0,0,574,575,5,115,0,0,575, - 576,5,80,0,0,576,577,5,97,0,0,577,578,5,116,0,0,578,579,5,104,0, - 0,579,580,5,34,0,0,580,62,1,0,0,0,581,582,5,34,0,0,582,583,5,73, - 0,0,583,584,5,115,0,0,584,585,5,66,0,0,585,586,5,111,0,0,586,587, - 5,111,0,0,587,588,5,108,0,0,588,589,5,101,0,0,589,590,5,97,0,0,590, - 591,5,110,0,0,591,592,5,34,0,0,592,64,1,0,0,0,593,594,5,34,0,0,594, - 595,5,73,0,0,595,596,5,115,0,0,596,597,5,78,0,0,597,598,5,117,0, - 0,598,599,5,108,0,0,599,600,5,108,0,0,600,601,5,34,0,0,601,66,1, - 0,0,0,602,603,5,34,0,0,603,604,5,73,0,0,604,605,5,115,0,0,605,606, - 5,78,0,0,606,607,5,117,0,0,607,608,5,109,0,0,608,609,5,101,0,0,609, - 610,5,114,0,0,610,611,5,105,0,0,611,612,5,99,0,0,612,613,5,34,0, - 0,613,68,1,0,0,0,614,615,5,34,0,0,615,616,5,73,0,0,616,617,5,115, - 0,0,617,618,5,80,0,0,618,619,5,114,0,0,619,620,5,101,0,0,620,621, - 5,115,0,0,621,622,5,101,0,0,622,623,5,110,0,0,623,624,5,116,0,0, - 624,625,5,34,0,0,625,70,1,0,0,0,626,627,5,34,0,0,627,628,5,73,0, - 0,628,629,5,115,0,0,629,630,5,83,0,0,630,631,5,116,0,0,631,632,5, - 114,0,0,632,633,5,105,0,0,633,634,5,110,0,0,634,635,5,103,0,0,635, - 636,5,34,0,0,636,72,1,0,0,0,637,638,5,34,0,0,638,639,5,73,0,0,639, - 640,5,115,0,0,640,641,5,84,0,0,641,642,5,105,0,0,642,643,5,109,0, - 0,643,644,5,101,0,0,644,645,5,115,0,0,645,646,5,116,0,0,646,647, - 5,97,0,0,647,648,5,109,0,0,648,649,5,112,0,0,649,650,5,34,0,0,650, - 74,1,0,0,0,651,652,5,34,0,0,652,653,5,78,0,0,653,654,5,111,0,0,654, - 655,5,116,0,0,655,656,5,34,0,0,656,76,1,0,0,0,657,658,5,34,0,0,658, - 659,5,78,0,0,659,660,5,117,0,0,660,661,5,109,0,0,661,662,5,101,0, - 0,662,663,5,114,0,0,663,664,5,105,0,0,664,665,5,99,0,0,665,666,5, - 69,0,0,666,667,5,113,0,0,667,668,5,117,0,0,668,669,5,97,0,0,669, - 670,5,108,0,0,670,671,5,115,0,0,671,672,5,34,0,0,672,78,1,0,0,0, - 673,674,5,34,0,0,674,675,5,78,0,0,675,676,5,117,0,0,676,677,5,109, - 0,0,677,678,5,101,0,0,678,679,5,114,0,0,679,680,5,105,0,0,680,681, - 5,99,0,0,681,682,5,69,0,0,682,683,5,113,0,0,683,684,5,117,0,0,684, - 685,5,97,0,0,685,686,5,108,0,0,686,687,5,115,0,0,687,688,5,80,0, - 0,688,689,5,97,0,0,689,690,5,116,0,0,690,691,5,104,0,0,691,692,5, - 34,0,0,692,80,1,0,0,0,693,694,5,34,0,0,694,695,5,78,0,0,695,696, - 5,117,0,0,696,697,5,109,0,0,697,698,5,101,0,0,698,699,5,114,0,0, - 699,700,5,105,0,0,700,701,5,99,0,0,701,702,5,71,0,0,702,703,5,114, - 0,0,703,704,5,101,0,0,704,705,5,97,0,0,705,706,5,116,0,0,706,707, - 5,101,0,0,707,708,5,114,0,0,708,709,5,84,0,0,709,710,5,104,0,0,710, - 711,5,97,0,0,711,712,5,110,0,0,712,713,5,34,0,0,713,82,1,0,0,0,714, - 715,5,34,0,0,715,716,5,78,0,0,716,717,5,117,0,0,717,718,5,109,0, - 0,718,719,5,101,0,0,719,720,5,114,0,0,720,721,5,105,0,0,721,722, - 5,99,0,0,722,723,5,71,0,0,723,724,5,114,0,0,724,725,5,101,0,0,725, - 726,5,97,0,0,726,727,5,116,0,0,727,728,5,101,0,0,728,729,5,114,0, - 0,729,730,5,84,0,0,730,731,5,104,0,0,731,732,5,97,0,0,732,733,5, - 110,0,0,733,734,5,80,0,0,734,735,5,97,0,0,735,736,5,116,0,0,736, - 737,5,104,0,0,737,738,5,34,0,0,738,84,1,0,0,0,739,740,5,34,0,0,740, - 741,5,78,0,0,741,742,5,117,0,0,742,743,5,109,0,0,743,744,5,101,0, - 0,744,745,5,114,0,0,745,746,5,105,0,0,746,747,5,99,0,0,747,748,5, - 71,0,0,748,749,5,114,0,0,749,750,5,101,0,0,750,751,5,97,0,0,751, - 752,5,116,0,0,752,753,5,101,0,0,753,754,5,114,0,0,754,755,5,84,0, - 0,755,756,5,104,0,0,756,757,5,97,0,0,757,758,5,110,0,0,758,759,5, - 69,0,0,759,760,5,113,0,0,760,761,5,117,0,0,761,762,5,97,0,0,762, - 763,5,108,0,0,763,764,5,115,0,0,764,765,5,34,0,0,765,86,1,0,0,0, - 766,767,5,34,0,0,767,768,5,78,0,0,768,769,5,117,0,0,769,770,5,109, - 0,0,770,771,5,101,0,0,771,772,5,114,0,0,772,773,5,105,0,0,773,774, - 5,99,0,0,774,775,5,71,0,0,775,776,5,114,0,0,776,777,5,101,0,0,777, - 778,5,97,0,0,778,779,5,116,0,0,779,780,5,101,0,0,780,781,5,114,0, - 0,781,782,5,84,0,0,782,783,5,104,0,0,783,784,5,97,0,0,784,785,5, - 110,0,0,785,786,5,69,0,0,786,787,5,113,0,0,787,788,5,117,0,0,788, - 789,5,97,0,0,789,790,5,108,0,0,790,791,5,115,0,0,791,792,5,80,0, - 0,792,793,5,97,0,0,793,794,5,116,0,0,794,795,5,104,0,0,795,796,5, - 34,0,0,796,88,1,0,0,0,797,798,5,34,0,0,798,799,5,78,0,0,799,800, - 5,117,0,0,800,801,5,109,0,0,801,802,5,101,0,0,802,803,5,114,0,0, - 803,804,5,105,0,0,804,805,5,99,0,0,805,806,5,76,0,0,806,807,5,101, - 0,0,807,808,5,115,0,0,808,809,5,115,0,0,809,810,5,84,0,0,810,811, - 5,104,0,0,811,812,5,97,0,0,812,813,5,110,0,0,813,814,5,34,0,0,814, - 90,1,0,0,0,815,816,5,34,0,0,816,817,5,78,0,0,817,818,5,117,0,0,818, - 819,5,109,0,0,819,820,5,101,0,0,820,821,5,114,0,0,821,822,5,105, - 0,0,822,823,5,99,0,0,823,824,5,76,0,0,824,825,5,101,0,0,825,826, - 5,115,0,0,826,827,5,115,0,0,827,828,5,84,0,0,828,829,5,104,0,0,829, - 830,5,97,0,0,830,831,5,110,0,0,831,832,5,80,0,0,832,833,5,97,0,0, - 833,834,5,116,0,0,834,835,5,104,0,0,835,836,5,34,0,0,836,92,1,0, - 0,0,837,838,5,34,0,0,838,839,5,78,0,0,839,840,5,117,0,0,840,841, - 5,109,0,0,841,842,5,101,0,0,842,843,5,114,0,0,843,844,5,105,0,0, - 844,845,5,99,0,0,845,846,5,76,0,0,846,847,5,101,0,0,847,848,5,115, - 0,0,848,849,5,115,0,0,849,850,5,84,0,0,850,851,5,104,0,0,851,852, - 5,97,0,0,852,853,5,110,0,0,853,854,5,69,0,0,854,855,5,113,0,0,855, - 856,5,117,0,0,856,857,5,97,0,0,857,858,5,108,0,0,858,859,5,115,0, - 0,859,860,5,34,0,0,860,94,1,0,0,0,861,862,5,34,0,0,862,863,5,78, - 0,0,863,864,5,117,0,0,864,865,5,109,0,0,865,866,5,101,0,0,866,867, - 5,114,0,0,867,868,5,105,0,0,868,869,5,99,0,0,869,870,5,76,0,0,870, - 871,5,101,0,0,871,872,5,115,0,0,872,873,5,115,0,0,873,874,5,84,0, - 0,874,875,5,104,0,0,875,876,5,97,0,0,876,877,5,110,0,0,877,878,5, - 69,0,0,878,879,5,113,0,0,879,880,5,117,0,0,880,881,5,97,0,0,881, - 882,5,108,0,0,882,883,5,115,0,0,883,884,5,80,0,0,884,885,5,97,0, - 0,885,886,5,116,0,0,886,887,5,104,0,0,887,888,5,34,0,0,888,96,1, - 0,0,0,889,890,5,34,0,0,890,891,5,79,0,0,891,892,5,114,0,0,892,893, - 5,34,0,0,893,98,1,0,0,0,894,895,5,34,0,0,895,896,5,83,0,0,896,897, - 5,116,0,0,897,898,5,114,0,0,898,899,5,105,0,0,899,900,5,110,0,0, - 900,901,5,103,0,0,901,902,5,69,0,0,902,903,5,113,0,0,903,904,5,117, - 0,0,904,905,5,97,0,0,905,906,5,108,0,0,906,907,5,115,0,0,907,908, - 5,34,0,0,908,100,1,0,0,0,909,910,5,34,0,0,910,911,5,83,0,0,911,912, - 5,116,0,0,912,913,5,114,0,0,913,914,5,105,0,0,914,915,5,110,0,0, - 915,916,5,103,0,0,916,917,5,69,0,0,917,918,5,113,0,0,918,919,5,117, - 0,0,919,920,5,97,0,0,920,921,5,108,0,0,921,922,5,115,0,0,922,923, - 5,80,0,0,923,924,5,97,0,0,924,925,5,116,0,0,925,926,5,104,0,0,926, - 927,5,34,0,0,927,102,1,0,0,0,928,929,5,34,0,0,929,930,5,83,0,0,930, - 931,5,116,0,0,931,932,5,114,0,0,932,933,5,105,0,0,933,934,5,110, - 0,0,934,935,5,103,0,0,935,936,5,71,0,0,936,937,5,114,0,0,937,938, - 5,101,0,0,938,939,5,97,0,0,939,940,5,116,0,0,940,941,5,101,0,0,941, - 942,5,114,0,0,942,943,5,84,0,0,943,944,5,104,0,0,944,945,5,97,0, - 0,945,946,5,110,0,0,946,947,5,34,0,0,947,104,1,0,0,0,948,949,5,34, - 0,0,949,950,5,83,0,0,950,951,5,116,0,0,951,952,5,114,0,0,952,953, - 5,105,0,0,953,954,5,110,0,0,954,955,5,103,0,0,955,956,5,71,0,0,956, - 957,5,114,0,0,957,958,5,101,0,0,958,959,5,97,0,0,959,960,5,116,0, - 0,960,961,5,101,0,0,961,962,5,114,0,0,962,963,5,84,0,0,963,964,5, - 104,0,0,964,965,5,97,0,0,965,966,5,110,0,0,966,967,5,80,0,0,967, - 968,5,97,0,0,968,969,5,116,0,0,969,970,5,104,0,0,970,971,5,34,0, - 0,971,106,1,0,0,0,972,973,5,34,0,0,973,974,5,83,0,0,974,975,5,116, - 0,0,975,976,5,114,0,0,976,977,5,105,0,0,977,978,5,110,0,0,978,979, - 5,103,0,0,979,980,5,71,0,0,980,981,5,114,0,0,981,982,5,101,0,0,982, - 983,5,97,0,0,983,984,5,116,0,0,984,985,5,101,0,0,985,986,5,114,0, - 0,986,987,5,84,0,0,987,988,5,104,0,0,988,989,5,97,0,0,989,990,5, - 110,0,0,990,991,5,69,0,0,991,992,5,113,0,0,992,993,5,117,0,0,993, - 994,5,97,0,0,994,995,5,108,0,0,995,996,5,115,0,0,996,997,5,34,0, - 0,997,108,1,0,0,0,998,999,5,34,0,0,999,1000,5,83,0,0,1000,1001,5, - 116,0,0,1001,1002,5,114,0,0,1002,1003,5,105,0,0,1003,1004,5,110, - 0,0,1004,1005,5,103,0,0,1005,1006,5,71,0,0,1006,1007,5,114,0,0,1007, - 1008,5,101,0,0,1008,1009,5,97,0,0,1009,1010,5,116,0,0,1010,1011, - 5,101,0,0,1011,1012,5,114,0,0,1012,1013,5,84,0,0,1013,1014,5,104, - 0,0,1014,1015,5,97,0,0,1015,1016,5,110,0,0,1016,1017,5,69,0,0,1017, - 1018,5,113,0,0,1018,1019,5,117,0,0,1019,1020,5,97,0,0,1020,1021, - 5,108,0,0,1021,1022,5,115,0,0,1022,1023,5,80,0,0,1023,1024,5,97, - 0,0,1024,1025,5,116,0,0,1025,1026,5,104,0,0,1026,1027,5,34,0,0,1027, - 110,1,0,0,0,1028,1029,5,34,0,0,1029,1030,5,83,0,0,1030,1031,5,116, - 0,0,1031,1032,5,114,0,0,1032,1033,5,105,0,0,1033,1034,5,110,0,0, - 1034,1035,5,103,0,0,1035,1036,5,76,0,0,1036,1037,5,101,0,0,1037, - 1038,5,115,0,0,1038,1039,5,115,0,0,1039,1040,5,84,0,0,1040,1041, - 5,104,0,0,1041,1042,5,97,0,0,1042,1043,5,110,0,0,1043,1044,5,34, - 0,0,1044,112,1,0,0,0,1045,1046,5,34,0,0,1046,1047,5,83,0,0,1047, - 1048,5,116,0,0,1048,1049,5,114,0,0,1049,1050,5,105,0,0,1050,1051, - 5,110,0,0,1051,1052,5,103,0,0,1052,1053,5,76,0,0,1053,1054,5,101, - 0,0,1054,1055,5,115,0,0,1055,1056,5,115,0,0,1056,1057,5,84,0,0,1057, - 1058,5,104,0,0,1058,1059,5,97,0,0,1059,1060,5,110,0,0,1060,1061, - 5,80,0,0,1061,1062,5,97,0,0,1062,1063,5,116,0,0,1063,1064,5,104, - 0,0,1064,1065,5,34,0,0,1065,114,1,0,0,0,1066,1067,5,34,0,0,1067, - 1068,5,83,0,0,1068,1069,5,116,0,0,1069,1070,5,114,0,0,1070,1071, - 5,105,0,0,1071,1072,5,110,0,0,1072,1073,5,103,0,0,1073,1074,5,76, - 0,0,1074,1075,5,101,0,0,1075,1076,5,115,0,0,1076,1077,5,115,0,0, - 1077,1078,5,84,0,0,1078,1079,5,104,0,0,1079,1080,5,97,0,0,1080,1081, - 5,110,0,0,1081,1082,5,69,0,0,1082,1083,5,113,0,0,1083,1084,5,117, - 0,0,1084,1085,5,97,0,0,1085,1086,5,108,0,0,1086,1087,5,115,0,0,1087, - 1088,5,34,0,0,1088,116,1,0,0,0,1089,1090,5,34,0,0,1090,1091,5,83, - 0,0,1091,1092,5,116,0,0,1092,1093,5,114,0,0,1093,1094,5,105,0,0, - 1094,1095,5,110,0,0,1095,1096,5,103,0,0,1096,1097,5,76,0,0,1097, - 1098,5,101,0,0,1098,1099,5,115,0,0,1099,1100,5,115,0,0,1100,1101, - 5,84,0,0,1101,1102,5,104,0,0,1102,1103,5,97,0,0,1103,1104,5,110, - 0,0,1104,1105,5,69,0,0,1105,1106,5,113,0,0,1106,1107,5,117,0,0,1107, - 1108,5,97,0,0,1108,1109,5,108,0,0,1109,1110,5,115,0,0,1110,1111, - 5,80,0,0,1111,1112,5,97,0,0,1112,1113,5,116,0,0,1113,1114,5,104, - 0,0,1114,1115,5,34,0,0,1115,118,1,0,0,0,1116,1117,5,34,0,0,1117, - 1118,5,83,0,0,1118,1119,5,116,0,0,1119,1120,5,114,0,0,1120,1121, - 5,105,0,0,1121,1122,5,110,0,0,1122,1123,5,103,0,0,1123,1124,5,77, - 0,0,1124,1125,5,97,0,0,1125,1126,5,116,0,0,1126,1127,5,99,0,0,1127, - 1128,5,104,0,0,1128,1129,5,101,0,0,1129,1130,5,115,0,0,1130,1131, - 5,34,0,0,1131,120,1,0,0,0,1132,1133,5,34,0,0,1133,1134,5,84,0,0, - 1134,1135,5,105,0,0,1135,1136,5,109,0,0,1136,1137,5,101,0,0,1137, - 1138,5,115,0,0,1138,1139,5,116,0,0,1139,1140,5,97,0,0,1140,1141, - 5,109,0,0,1141,1142,5,112,0,0,1142,1143,5,69,0,0,1143,1144,5,113, - 0,0,1144,1145,5,117,0,0,1145,1146,5,97,0,0,1146,1147,5,108,0,0,1147, - 1148,5,115,0,0,1148,1149,5,34,0,0,1149,122,1,0,0,0,1150,1151,5,34, - 0,0,1151,1152,5,84,0,0,1152,1153,5,105,0,0,1153,1154,5,109,0,0,1154, - 1155,5,101,0,0,1155,1156,5,115,0,0,1156,1157,5,116,0,0,1157,1158, - 5,97,0,0,1158,1159,5,109,0,0,1159,1160,5,112,0,0,1160,1161,5,69, - 0,0,1161,1162,5,113,0,0,1162,1163,5,117,0,0,1163,1164,5,97,0,0,1164, - 1165,5,108,0,0,1165,1166,5,115,0,0,1166,1167,5,80,0,0,1167,1168, - 5,97,0,0,1168,1169,5,116,0,0,1169,1170,5,104,0,0,1170,1171,5,34, - 0,0,1171,124,1,0,0,0,1172,1173,5,34,0,0,1173,1174,5,84,0,0,1174, - 1175,5,105,0,0,1175,1176,5,109,0,0,1176,1177,5,101,0,0,1177,1178, - 5,115,0,0,1178,1179,5,116,0,0,1179,1180,5,97,0,0,1180,1181,5,109, - 0,0,1181,1182,5,112,0,0,1182,1183,5,71,0,0,1183,1184,5,114,0,0,1184, - 1185,5,101,0,0,1185,1186,5,97,0,0,1186,1187,5,116,0,0,1187,1188, - 5,101,0,0,1188,1189,5,114,0,0,1189,1190,5,84,0,0,1190,1191,5,104, - 0,0,1191,1192,5,97,0,0,1192,1193,5,110,0,0,1193,1194,5,34,0,0,1194, - 126,1,0,0,0,1195,1196,5,34,0,0,1196,1197,5,84,0,0,1197,1198,5,105, - 0,0,1198,1199,5,109,0,0,1199,1200,5,101,0,0,1200,1201,5,115,0,0, - 1201,1202,5,116,0,0,1202,1203,5,97,0,0,1203,1204,5,109,0,0,1204, - 1205,5,112,0,0,1205,1206,5,71,0,0,1206,1207,5,114,0,0,1207,1208, - 5,101,0,0,1208,1209,5,97,0,0,1209,1210,5,116,0,0,1210,1211,5,101, - 0,0,1211,1212,5,114,0,0,1212,1213,5,84,0,0,1213,1214,5,104,0,0,1214, - 1215,5,97,0,0,1215,1216,5,110,0,0,1216,1217,5,80,0,0,1217,1218,5, - 97,0,0,1218,1219,5,116,0,0,1219,1220,5,104,0,0,1220,1221,5,34,0, - 0,1221,128,1,0,0,0,1222,1223,5,34,0,0,1223,1224,5,84,0,0,1224,1225, - 5,105,0,0,1225,1226,5,109,0,0,1226,1227,5,101,0,0,1227,1228,5,115, - 0,0,1228,1229,5,116,0,0,1229,1230,5,97,0,0,1230,1231,5,109,0,0,1231, - 1232,5,112,0,0,1232,1233,5,71,0,0,1233,1234,5,114,0,0,1234,1235, - 5,101,0,0,1235,1236,5,97,0,0,1236,1237,5,116,0,0,1237,1238,5,101, - 0,0,1238,1239,5,114,0,0,1239,1240,5,84,0,0,1240,1241,5,104,0,0,1241, - 1242,5,97,0,0,1242,1243,5,110,0,0,1243,1244,5,69,0,0,1244,1245,5, - 113,0,0,1245,1246,5,117,0,0,1246,1247,5,97,0,0,1247,1248,5,108,0, - 0,1248,1249,5,115,0,0,1249,1250,5,34,0,0,1250,130,1,0,0,0,1251,1252, - 5,34,0,0,1252,1253,5,84,0,0,1253,1254,5,105,0,0,1254,1255,5,109, - 0,0,1255,1256,5,101,0,0,1256,1257,5,115,0,0,1257,1258,5,116,0,0, - 1258,1259,5,97,0,0,1259,1260,5,109,0,0,1260,1261,5,112,0,0,1261, - 1262,5,71,0,0,1262,1263,5,114,0,0,1263,1264,5,101,0,0,1264,1265, - 5,97,0,0,1265,1266,5,116,0,0,1266,1267,5,101,0,0,1267,1268,5,114, - 0,0,1268,1269,5,84,0,0,1269,1270,5,104,0,0,1270,1271,5,97,0,0,1271, - 1272,5,110,0,0,1272,1273,5,69,0,0,1273,1274,5,113,0,0,1274,1275, - 5,117,0,0,1275,1276,5,97,0,0,1276,1277,5,108,0,0,1277,1278,5,115, - 0,0,1278,1279,5,80,0,0,1279,1280,5,97,0,0,1280,1281,5,116,0,0,1281, - 1282,5,104,0,0,1282,1283,5,34,0,0,1283,132,1,0,0,0,1284,1285,5,34, - 0,0,1285,1286,5,84,0,0,1286,1287,5,105,0,0,1287,1288,5,109,0,0,1288, - 1289,5,101,0,0,1289,1290,5,115,0,0,1290,1291,5,116,0,0,1291,1292, - 5,97,0,0,1292,1293,5,109,0,0,1293,1294,5,112,0,0,1294,1295,5,76, - 0,0,1295,1296,5,101,0,0,1296,1297,5,115,0,0,1297,1298,5,115,0,0, - 1298,1299,5,84,0,0,1299,1300,5,104,0,0,1300,1301,5,97,0,0,1301,1302, - 5,110,0,0,1302,1303,5,34,0,0,1303,134,1,0,0,0,1304,1305,5,34,0,0, - 1305,1306,5,84,0,0,1306,1307,5,105,0,0,1307,1308,5,109,0,0,1308, - 1309,5,101,0,0,1309,1310,5,115,0,0,1310,1311,5,116,0,0,1311,1312, - 5,97,0,0,1312,1313,5,109,0,0,1313,1314,5,112,0,0,1314,1315,5,76, - 0,0,1315,1316,5,101,0,0,1316,1317,5,115,0,0,1317,1318,5,115,0,0, - 1318,1319,5,84,0,0,1319,1320,5,104,0,0,1320,1321,5,97,0,0,1321,1322, - 5,110,0,0,1322,1323,5,80,0,0,1323,1324,5,97,0,0,1324,1325,5,116, - 0,0,1325,1326,5,104,0,0,1326,1327,5,34,0,0,1327,136,1,0,0,0,1328, - 1329,5,34,0,0,1329,1330,5,84,0,0,1330,1331,5,105,0,0,1331,1332,5, - 109,0,0,1332,1333,5,101,0,0,1333,1334,5,115,0,0,1334,1335,5,116, - 0,0,1335,1336,5,97,0,0,1336,1337,5,109,0,0,1337,1338,5,112,0,0,1338, - 1339,5,76,0,0,1339,1340,5,101,0,0,1340,1341,5,115,0,0,1341,1342, - 5,115,0,0,1342,1343,5,84,0,0,1343,1344,5,104,0,0,1344,1345,5,97, - 0,0,1345,1346,5,110,0,0,1346,1347,5,69,0,0,1347,1348,5,113,0,0,1348, - 1349,5,117,0,0,1349,1350,5,97,0,0,1350,1351,5,108,0,0,1351,1352, - 5,115,0,0,1352,1353,5,34,0,0,1353,138,1,0,0,0,1354,1355,5,34,0,0, - 1355,1356,5,84,0,0,1356,1357,5,105,0,0,1357,1358,5,109,0,0,1358, - 1359,5,101,0,0,1359,1360,5,115,0,0,1360,1361,5,116,0,0,1361,1362, - 5,97,0,0,1362,1363,5,109,0,0,1363,1364,5,112,0,0,1364,1365,5,76, - 0,0,1365,1366,5,101,0,0,1366,1367,5,115,0,0,1367,1368,5,115,0,0, - 1368,1369,5,84,0,0,1369,1370,5,104,0,0,1370,1371,5,97,0,0,1371,1372, - 5,110,0,0,1372,1373,5,69,0,0,1373,1374,5,113,0,0,1374,1375,5,117, - 0,0,1375,1376,5,97,0,0,1376,1377,5,108,0,0,1377,1378,5,115,0,0,1378, - 1379,5,80,0,0,1379,1380,5,97,0,0,1380,1381,5,116,0,0,1381,1382,5, - 104,0,0,1382,1383,5,34,0,0,1383,140,1,0,0,0,1384,1385,5,34,0,0,1385, - 1386,5,83,0,0,1386,1387,5,101,0,0,1387,1388,5,99,0,0,1388,1389,5, - 111,0,0,1389,1390,5,110,0,0,1390,1391,5,100,0,0,1391,1392,5,115, - 0,0,1392,1393,5,80,0,0,1393,1394,5,97,0,0,1394,1395,5,116,0,0,1395, - 1396,5,104,0,0,1396,1397,5,34,0,0,1397,142,1,0,0,0,1398,1399,5,34, - 0,0,1399,1400,5,83,0,0,1400,1401,5,101,0,0,1401,1402,5,99,0,0,1402, - 1403,5,111,0,0,1403,1404,5,110,0,0,1404,1405,5,100,0,0,1405,1406, - 5,115,0,0,1406,1407,5,34,0,0,1407,144,1,0,0,0,1408,1409,5,34,0,0, - 1409,1410,5,84,0,0,1410,1411,5,105,0,0,1411,1412,5,109,0,0,1412, - 1413,5,101,0,0,1413,1414,5,115,0,0,1414,1415,5,116,0,0,1415,1416, - 5,97,0,0,1416,1417,5,109,0,0,1417,1418,5,112,0,0,1418,1419,5,80, - 0,0,1419,1420,5,97,0,0,1420,1421,5,116,0,0,1421,1422,5,104,0,0,1422, - 1423,5,34,0,0,1423,146,1,0,0,0,1424,1425,5,34,0,0,1425,1426,5,84, - 0,0,1426,1427,5,105,0,0,1427,1428,5,109,0,0,1428,1429,5,101,0,0, - 1429,1430,5,115,0,0,1430,1431,5,116,0,0,1431,1432,5,97,0,0,1432, - 1433,5,109,0,0,1433,1434,5,112,0,0,1434,1435,5,34,0,0,1435,148,1, - 0,0,0,1436,1437,5,34,0,0,1437,1438,5,84,0,0,1438,1439,5,105,0,0, - 1439,1440,5,109,0,0,1440,1441,5,101,0,0,1441,1442,5,111,0,0,1442, - 1443,5,117,0,0,1443,1444,5,116,0,0,1444,1445,5,83,0,0,1445,1446, - 5,101,0,0,1446,1447,5,99,0,0,1447,1448,5,111,0,0,1448,1449,5,110, - 0,0,1449,1450,5,100,0,0,1450,1451,5,115,0,0,1451,1452,5,34,0,0,1452, - 150,1,0,0,0,1453,1454,5,34,0,0,1454,1455,5,84,0,0,1455,1456,5,105, - 0,0,1456,1457,5,109,0,0,1457,1458,5,101,0,0,1458,1459,5,111,0,0, - 1459,1460,5,117,0,0,1460,1461,5,116,0,0,1461,1462,5,83,0,0,1462, - 1463,5,101,0,0,1463,1464,5,99,0,0,1464,1465,5,111,0,0,1465,1466, - 5,110,0,0,1466,1467,5,100,0,0,1467,1468,5,115,0,0,1468,1469,5,80, - 0,0,1469,1470,5,97,0,0,1470,1471,5,116,0,0,1471,1472,5,104,0,0,1472, - 1473,5,34,0,0,1473,152,1,0,0,0,1474,1475,5,34,0,0,1475,1476,5,72, - 0,0,1476,1477,5,101,0,0,1477,1478,5,97,0,0,1478,1479,5,114,0,0,1479, - 1480,5,116,0,0,1480,1481,5,98,0,0,1481,1482,5,101,0,0,1482,1483, - 5,97,0,0,1483,1484,5,116,0,0,1484,1485,5,83,0,0,1485,1486,5,101, - 0,0,1486,1487,5,99,0,0,1487,1488,5,111,0,0,1488,1489,5,110,0,0,1489, - 1490,5,100,0,0,1490,1491,5,115,0,0,1491,1492,5,34,0,0,1492,154,1, - 0,0,0,1493,1494,5,34,0,0,1494,1495,5,72,0,0,1495,1496,5,101,0,0, - 1496,1497,5,97,0,0,1497,1498,5,114,0,0,1498,1499,5,116,0,0,1499, - 1500,5,98,0,0,1500,1501,5,101,0,0,1501,1502,5,97,0,0,1502,1503,5, - 116,0,0,1503,1504,5,83,0,0,1504,1505,5,101,0,0,1505,1506,5,99,0, - 0,1506,1507,5,111,0,0,1507,1508,5,110,0,0,1508,1509,5,100,0,0,1509, - 1510,5,115,0,0,1510,1511,5,80,0,0,1511,1512,5,97,0,0,1512,1513,5, - 116,0,0,1513,1514,5,104,0,0,1514,1515,5,34,0,0,1515,156,1,0,0,0, - 1516,1517,5,34,0,0,1517,1518,5,80,0,0,1518,1519,5,114,0,0,1519,1520, - 5,111,0,0,1520,1521,5,99,0,0,1521,1522,5,101,0,0,1522,1523,5,115, - 0,0,1523,1524,5,115,0,0,1524,1525,5,111,0,0,1525,1526,5,114,0,0, - 1526,1527,5,67,0,0,1527,1528,5,111,0,0,1528,1529,5,110,0,0,1529, - 1530,5,102,0,0,1530,1531,5,105,0,0,1531,1532,5,103,0,0,1532,1533, - 5,34,0,0,1533,158,1,0,0,0,1534,1535,5,34,0,0,1535,1536,5,77,0,0, - 1536,1537,5,111,0,0,1537,1538,5,100,0,0,1538,1539,5,101,0,0,1539, - 1540,5,34,0,0,1540,160,1,0,0,0,1541,1542,5,34,0,0,1542,1543,5,73, - 0,0,1543,1544,5,78,0,0,1544,1545,5,76,0,0,1545,1546,5,73,0,0,1546, - 1547,5,78,0,0,1547,1548,5,69,0,0,1548,1549,5,34,0,0,1549,162,1,0, - 0,0,1550,1551,5,34,0,0,1551,1552,5,68,0,0,1552,1553,5,73,0,0,1553, - 1554,5,83,0,0,1554,1555,5,84,0,0,1555,1556,5,82,0,0,1556,1557,5, - 73,0,0,1557,1558,5,66,0,0,1558,1559,5,85,0,0,1559,1560,5,84,0,0, - 1560,1561,5,69,0,0,1561,1562,5,68,0,0,1562,1563,5,34,0,0,1563,164, - 1,0,0,0,1564,1565,5,34,0,0,1565,1566,5,69,0,0,1566,1567,5,120,0, - 0,1567,1568,5,101,0,0,1568,1569,5,99,0,0,1569,1570,5,117,0,0,1570, - 1571,5,116,0,0,1571,1572,5,105,0,0,1572,1573,5,111,0,0,1573,1574, - 5,110,0,0,1574,1575,5,84,0,0,1575,1576,5,121,0,0,1576,1577,5,112, - 0,0,1577,1578,5,101,0,0,1578,1579,5,34,0,0,1579,166,1,0,0,0,1580, - 1581,5,34,0,0,1581,1582,5,83,0,0,1582,1583,5,84,0,0,1583,1584,5, - 65,0,0,1584,1585,5,78,0,0,1585,1586,5,68,0,0,1586,1587,5,65,0,0, - 1587,1588,5,82,0,0,1588,1589,5,68,0,0,1589,1590,5,34,0,0,1590,168, - 1,0,0,0,1591,1592,5,34,0,0,1592,1593,5,73,0,0,1593,1594,5,116,0, - 0,1594,1595,5,101,0,0,1595,1596,5,109,0,0,1596,1597,5,80,0,0,1597, - 1598,5,114,0,0,1598,1599,5,111,0,0,1599,1600,5,99,0,0,1600,1601, - 5,101,0,0,1601,1602,5,115,0,0,1602,1603,5,115,0,0,1603,1604,5,111, - 0,0,1604,1605,5,114,0,0,1605,1606,5,34,0,0,1606,170,1,0,0,0,1607, - 1608,5,34,0,0,1608,1609,5,73,0,0,1609,1610,5,116,0,0,1610,1611,5, - 101,0,0,1611,1612,5,114,0,0,1612,1613,5,97,0,0,1613,1614,5,116,0, - 0,1614,1615,5,111,0,0,1615,1616,5,114,0,0,1616,1617,5,34,0,0,1617, - 172,1,0,0,0,1618,1619,5,34,0,0,1619,1620,5,73,0,0,1620,1621,5,116, - 0,0,1621,1622,5,101,0,0,1622,1623,5,109,0,0,1623,1624,5,83,0,0,1624, - 1625,5,101,0,0,1625,1626,5,108,0,0,1626,1627,5,101,0,0,1627,1628, - 5,99,0,0,1628,1629,5,116,0,0,1629,1630,5,111,0,0,1630,1631,5,114, - 0,0,1631,1632,5,34,0,0,1632,174,1,0,0,0,1633,1634,5,34,0,0,1634, - 1635,5,77,0,0,1635,1636,5,97,0,0,1636,1637,5,120,0,0,1637,1638,5, - 67,0,0,1638,1639,5,111,0,0,1639,1640,5,110,0,0,1640,1641,5,99,0, - 0,1641,1642,5,117,0,0,1642,1643,5,114,0,0,1643,1644,5,114,0,0,1644, - 1645,5,101,0,0,1645,1646,5,110,0,0,1646,1647,5,99,0,0,1647,1648, - 5,121,0,0,1648,1649,5,80,0,0,1649,1650,5,97,0,0,1650,1651,5,116, - 0,0,1651,1652,5,104,0,0,1652,1653,5,34,0,0,1653,176,1,0,0,0,1654, - 1655,5,34,0,0,1655,1656,5,77,0,0,1656,1657,5,97,0,0,1657,1658,5, - 120,0,0,1658,1659,5,67,0,0,1659,1660,5,111,0,0,1660,1661,5,110,0, - 0,1661,1662,5,99,0,0,1662,1663,5,117,0,0,1663,1664,5,114,0,0,1664, - 1665,5,114,0,0,1665,1666,5,101,0,0,1666,1667,5,110,0,0,1667,1668, - 5,99,0,0,1668,1669,5,121,0,0,1669,1670,5,34,0,0,1670,178,1,0,0,0, - 1671,1672,5,34,0,0,1672,1673,5,82,0,0,1673,1674,5,101,0,0,1674,1675, - 5,115,0,0,1675,1676,5,111,0,0,1676,1677,5,117,0,0,1677,1678,5,114, - 0,0,1678,1679,5,99,0,0,1679,1680,5,101,0,0,1680,1681,5,34,0,0,1681, - 180,1,0,0,0,1682,1683,5,34,0,0,1683,1684,5,73,0,0,1684,1685,5,110, - 0,0,1685,1686,5,112,0,0,1686,1687,5,117,0,0,1687,1688,5,116,0,0, - 1688,1689,5,80,0,0,1689,1690,5,97,0,0,1690,1691,5,116,0,0,1691,1692, - 5,104,0,0,1692,1693,5,34,0,0,1693,182,1,0,0,0,1694,1695,5,34,0,0, - 1695,1696,5,79,0,0,1696,1697,5,117,0,0,1697,1698,5,116,0,0,1698, - 1699,5,112,0,0,1699,1700,5,117,0,0,1700,1701,5,116,0,0,1701,1702, - 5,80,0,0,1702,1703,5,97,0,0,1703,1704,5,116,0,0,1704,1705,5,104, - 0,0,1705,1706,5,34,0,0,1706,184,1,0,0,0,1707,1708,5,34,0,0,1708, - 1709,5,73,0,0,1709,1710,5,116,0,0,1710,1711,5,101,0,0,1711,1712, - 5,109,0,0,1712,1713,5,115,0,0,1713,1714,5,34,0,0,1714,186,1,0,0, - 0,1715,1716,5,34,0,0,1716,1717,5,73,0,0,1717,1718,5,116,0,0,1718, - 1719,5,101,0,0,1719,1720,5,109,0,0,1720,1721,5,115,0,0,1721,1722, - 5,80,0,0,1722,1723,5,97,0,0,1723,1724,5,116,0,0,1724,1725,5,104, - 0,0,1725,1726,5,34,0,0,1726,188,1,0,0,0,1727,1728,5,34,0,0,1728, - 1729,5,82,0,0,1729,1730,5,101,0,0,1730,1731,5,115,0,0,1731,1732, - 5,117,0,0,1732,1733,5,108,0,0,1733,1734,5,116,0,0,1734,1735,5,80, - 0,0,1735,1736,5,97,0,0,1736,1737,5,116,0,0,1737,1738,5,104,0,0,1738, - 1739,5,34,0,0,1739,190,1,0,0,0,1740,1741,5,34,0,0,1741,1742,5,82, - 0,0,1742,1743,5,101,0,0,1743,1744,5,115,0,0,1744,1745,5,117,0,0, - 1745,1746,5,108,0,0,1746,1747,5,116,0,0,1747,1748,5,34,0,0,1748, - 192,1,0,0,0,1749,1750,5,34,0,0,1750,1751,5,80,0,0,1751,1752,5,97, - 0,0,1752,1753,5,114,0,0,1753,1754,5,97,0,0,1754,1755,5,109,0,0,1755, - 1756,5,101,0,0,1756,1757,5,116,0,0,1757,1758,5,101,0,0,1758,1759, - 5,114,0,0,1759,1760,5,115,0,0,1760,1761,5,34,0,0,1761,194,1,0,0, - 0,1762,1763,5,34,0,0,1763,1764,5,67,0,0,1764,1765,5,114,0,0,1765, - 1766,5,101,0,0,1766,1767,5,100,0,0,1767,1768,5,101,0,0,1768,1769, - 5,110,0,0,1769,1770,5,116,0,0,1770,1771,5,105,0,0,1771,1772,5,97, - 0,0,1772,1773,5,108,0,0,1773,1774,5,115,0,0,1774,1775,5,34,0,0,1775, - 196,1,0,0,0,1776,1777,5,34,0,0,1777,1778,5,82,0,0,1778,1779,5,101, - 0,0,1779,1780,5,115,0,0,1780,1781,5,117,0,0,1781,1782,5,108,0,0, - 1782,1783,5,116,0,0,1783,1784,5,83,0,0,1784,1785,5,101,0,0,1785, - 1786,5,108,0,0,1786,1787,5,101,0,0,1787,1788,5,99,0,0,1788,1789, - 5,116,0,0,1789,1790,5,111,0,0,1790,1791,5,114,0,0,1791,1792,5,34, - 0,0,1792,198,1,0,0,0,1793,1794,5,34,0,0,1794,1795,5,73,0,0,1795, - 1796,5,116,0,0,1796,1797,5,101,0,0,1797,1798,5,109,0,0,1798,1799, - 5,82,0,0,1799,1800,5,101,0,0,1800,1801,5,97,0,0,1801,1802,5,100, - 0,0,1802,1803,5,101,0,0,1803,1804,5,114,0,0,1804,1805,5,34,0,0,1805, - 200,1,0,0,0,1806,1807,5,34,0,0,1807,1808,5,82,0,0,1808,1809,5,101, - 0,0,1809,1810,5,97,0,0,1810,1811,5,100,0,0,1811,1812,5,101,0,0,1812, - 1813,5,114,0,0,1813,1814,5,67,0,0,1814,1815,5,111,0,0,1815,1816, - 5,110,0,0,1816,1817,5,102,0,0,1817,1818,5,105,0,0,1818,1819,5,103, - 0,0,1819,1820,5,34,0,0,1820,202,1,0,0,0,1821,1822,5,34,0,0,1822, - 1823,5,73,0,0,1823,1824,5,110,0,0,1824,1825,5,112,0,0,1825,1826, - 5,117,0,0,1826,1827,5,116,0,0,1827,1828,5,84,0,0,1828,1829,5,121, - 0,0,1829,1830,5,112,0,0,1830,1831,5,101,0,0,1831,1832,5,34,0,0,1832, - 204,1,0,0,0,1833,1834,5,34,0,0,1834,1835,5,67,0,0,1835,1836,5,83, - 0,0,1836,1837,5,86,0,0,1837,1838,5,72,0,0,1838,1839,5,101,0,0,1839, - 1840,5,97,0,0,1840,1841,5,100,0,0,1841,1842,5,101,0,0,1842,1843, - 5,114,0,0,1843,1844,5,76,0,0,1844,1845,5,111,0,0,1845,1846,5,99, - 0,0,1846,1847,5,97,0,0,1847,1848,5,116,0,0,1848,1849,5,105,0,0,1849, - 1850,5,111,0,0,1850,1851,5,110,0,0,1851,1852,5,34,0,0,1852,206,1, - 0,0,0,1853,1854,5,34,0,0,1854,1855,5,67,0,0,1855,1856,5,83,0,0,1856, - 1857,5,86,0,0,1857,1858,5,72,0,0,1858,1859,5,101,0,0,1859,1860,5, - 97,0,0,1860,1861,5,100,0,0,1861,1862,5,101,0,0,1862,1863,5,114,0, - 0,1863,1864,5,115,0,0,1864,1865,5,34,0,0,1865,208,1,0,0,0,1866,1867, - 5,34,0,0,1867,1868,5,77,0,0,1868,1869,5,97,0,0,1869,1870,5,120,0, - 0,1870,1871,5,73,0,0,1871,1872,5,116,0,0,1872,1873,5,101,0,0,1873, - 1874,5,109,0,0,1874,1875,5,115,0,0,1875,1876,5,34,0,0,1876,210,1, - 0,0,0,1877,1878,5,34,0,0,1878,1879,5,77,0,0,1879,1880,5,97,0,0,1880, - 1881,5,120,0,0,1881,1882,5,73,0,0,1882,1883,5,116,0,0,1883,1884, - 5,101,0,0,1884,1885,5,109,0,0,1885,1886,5,115,0,0,1886,1887,5,80, - 0,0,1887,1888,5,97,0,0,1888,1889,5,116,0,0,1889,1890,5,104,0,0,1890, - 1891,5,34,0,0,1891,212,1,0,0,0,1892,1893,5,34,0,0,1893,1894,5,84, - 0,0,1894,1895,5,111,0,0,1895,1896,5,108,0,0,1896,1897,5,101,0,0, - 1897,1898,5,114,0,0,1898,1899,5,97,0,0,1899,1900,5,116,0,0,1900, - 1901,5,101,0,0,1901,1902,5,100,0,0,1902,1903,5,70,0,0,1903,1904, - 5,97,0,0,1904,1905,5,105,0,0,1905,1906,5,108,0,0,1906,1907,5,117, - 0,0,1907,1908,5,114,0,0,1908,1909,5,101,0,0,1909,1910,5,67,0,0,1910, - 1911,5,111,0,0,1911,1912,5,117,0,0,1912,1913,5,110,0,0,1913,1914, - 5,116,0,0,1914,1915,5,34,0,0,1915,214,1,0,0,0,1916,1917,5,34,0,0, - 1917,1918,5,84,0,0,1918,1919,5,111,0,0,1919,1920,5,108,0,0,1920, - 1921,5,101,0,0,1921,1922,5,114,0,0,1922,1923,5,97,0,0,1923,1924, - 5,116,0,0,1924,1925,5,101,0,0,1925,1926,5,100,0,0,1926,1927,5,70, - 0,0,1927,1928,5,97,0,0,1928,1929,5,105,0,0,1929,1930,5,108,0,0,1930, - 1931,5,117,0,0,1931,1932,5,114,0,0,1932,1933,5,101,0,0,1933,1934, - 5,67,0,0,1934,1935,5,111,0,0,1935,1936,5,117,0,0,1936,1937,5,110, - 0,0,1937,1938,5,116,0,0,1938,1939,5,80,0,0,1939,1940,5,97,0,0,1940, - 1941,5,116,0,0,1941,1942,5,104,0,0,1942,1943,5,34,0,0,1943,216,1, - 0,0,0,1944,1945,5,34,0,0,1945,1946,5,84,0,0,1946,1947,5,111,0,0, - 1947,1948,5,108,0,0,1948,1949,5,101,0,0,1949,1950,5,114,0,0,1950, - 1951,5,97,0,0,1951,1952,5,116,0,0,1952,1953,5,101,0,0,1953,1954, - 5,100,0,0,1954,1955,5,70,0,0,1955,1956,5,97,0,0,1956,1957,5,105, - 0,0,1957,1958,5,108,0,0,1958,1959,5,117,0,0,1959,1960,5,114,0,0, - 1960,1961,5,101,0,0,1961,1962,5,80,0,0,1962,1963,5,101,0,0,1963, - 1964,5,114,0,0,1964,1965,5,99,0,0,1965,1966,5,101,0,0,1966,1967, - 5,110,0,0,1967,1968,5,116,0,0,1968,1969,5,97,0,0,1969,1970,5,103, - 0,0,1970,1971,5,101,0,0,1971,1972,5,34,0,0,1972,218,1,0,0,0,1973, - 1974,5,34,0,0,1974,1975,5,84,0,0,1975,1976,5,111,0,0,1976,1977,5, - 108,0,0,1977,1978,5,101,0,0,1978,1979,5,114,0,0,1979,1980,5,97,0, - 0,1980,1981,5,116,0,0,1981,1982,5,101,0,0,1982,1983,5,100,0,0,1983, - 1984,5,70,0,0,1984,1985,5,97,0,0,1985,1986,5,105,0,0,1986,1987,5, - 108,0,0,1987,1988,5,117,0,0,1988,1989,5,114,0,0,1989,1990,5,101, - 0,0,1990,1991,5,80,0,0,1991,1992,5,101,0,0,1992,1993,5,114,0,0,1993, - 1994,5,99,0,0,1994,1995,5,101,0,0,1995,1996,5,110,0,0,1996,1997, - 5,116,0,0,1997,1998,5,97,0,0,1998,1999,5,103,0,0,1999,2000,5,101, - 0,0,2000,2001,5,80,0,0,2001,2002,5,97,0,0,2002,2003,5,116,0,0,2003, - 2004,5,104,0,0,2004,2005,5,34,0,0,2005,220,1,0,0,0,2006,2007,5,34, - 0,0,2007,2008,5,76,0,0,2008,2009,5,97,0,0,2009,2010,5,98,0,0,2010, - 2011,5,101,0,0,2011,2012,5,108,0,0,2012,2013,5,34,0,0,2013,222,1, - 0,0,0,2014,2015,5,34,0,0,2015,2016,5,82,0,0,2016,2017,5,101,0,0, - 2017,2018,5,115,0,0,2018,2019,5,117,0,0,2019,2020,5,108,0,0,2020, - 2021,5,116,0,0,2021,2022,5,87,0,0,2022,2023,5,114,0,0,2023,2024, - 5,105,0,0,2024,2025,5,116,0,0,2025,2026,5,101,0,0,2026,2027,5,114, - 0,0,2027,2028,5,34,0,0,2028,224,1,0,0,0,2029,2030,5,34,0,0,2030, - 2031,5,78,0,0,2031,2032,5,101,0,0,2032,2033,5,120,0,0,2033,2034, - 5,116,0,0,2034,2035,5,34,0,0,2035,226,1,0,0,0,2036,2037,5,34,0,0, - 2037,2038,5,69,0,0,2038,2039,5,110,0,0,2039,2040,5,100,0,0,2040, - 2041,5,34,0,0,2041,228,1,0,0,0,2042,2043,5,34,0,0,2043,2044,5,67, - 0,0,2044,2045,5,97,0,0,2045,2046,5,117,0,0,2046,2047,5,115,0,0,2047, - 2048,5,101,0,0,2048,2049,5,34,0,0,2049,230,1,0,0,0,2050,2051,5,34, - 0,0,2051,2052,5,67,0,0,2052,2053,5,97,0,0,2053,2054,5,117,0,0,2054, - 2055,5,115,0,0,2055,2056,5,101,0,0,2056,2057,5,80,0,0,2057,2058, - 5,97,0,0,2058,2059,5,116,0,0,2059,2060,5,104,0,0,2060,2061,5,34, - 0,0,2061,232,1,0,0,0,2062,2063,5,34,0,0,2063,2064,5,69,0,0,2064, - 2065,5,114,0,0,2065,2066,5,114,0,0,2066,2067,5,111,0,0,2067,2068, - 5,114,0,0,2068,2069,5,34,0,0,2069,234,1,0,0,0,2070,2071,5,34,0,0, - 2071,2072,5,69,0,0,2072,2073,5,114,0,0,2073,2074,5,114,0,0,2074, - 2075,5,111,0,0,2075,2076,5,114,0,0,2076,2077,5,80,0,0,2077,2078, - 5,97,0,0,2078,2079,5,116,0,0,2079,2080,5,104,0,0,2080,2081,5,34, - 0,0,2081,236,1,0,0,0,2082,2083,5,34,0,0,2083,2084,5,82,0,0,2084, - 2085,5,101,0,0,2085,2086,5,116,0,0,2086,2087,5,114,0,0,2087,2088, - 5,121,0,0,2088,2089,5,34,0,0,2089,238,1,0,0,0,2090,2091,5,34,0,0, - 2091,2092,5,69,0,0,2092,2093,5,114,0,0,2093,2094,5,114,0,0,2094, - 2095,5,111,0,0,2095,2096,5,114,0,0,2096,2097,5,69,0,0,2097,2098, - 5,113,0,0,2098,2099,5,117,0,0,2099,2100,5,97,0,0,2100,2101,5,108, - 0,0,2101,2102,5,115,0,0,2102,2103,5,34,0,0,2103,240,1,0,0,0,2104, - 2105,5,34,0,0,2105,2106,5,73,0,0,2106,2107,5,110,0,0,2107,2108,5, - 116,0,0,2108,2109,5,101,0,0,2109,2110,5,114,0,0,2110,2111,5,118, - 0,0,2111,2112,5,97,0,0,2112,2113,5,108,0,0,2113,2114,5,83,0,0,2114, - 2115,5,101,0,0,2115,2116,5,99,0,0,2116,2117,5,111,0,0,2117,2118, - 5,110,0,0,2118,2119,5,100,0,0,2119,2120,5,115,0,0,2120,2121,5,34, - 0,0,2121,242,1,0,0,0,2122,2123,5,34,0,0,2123,2124,5,77,0,0,2124, - 2125,5,97,0,0,2125,2126,5,120,0,0,2126,2127,5,65,0,0,2127,2128,5, - 116,0,0,2128,2129,5,116,0,0,2129,2130,5,101,0,0,2130,2131,5,109, - 0,0,2131,2132,5,112,0,0,2132,2133,5,116,0,0,2133,2134,5,115,0,0, - 2134,2135,5,34,0,0,2135,244,1,0,0,0,2136,2137,5,34,0,0,2137,2138, - 5,66,0,0,2138,2139,5,97,0,0,2139,2140,5,99,0,0,2140,2141,5,107,0, - 0,2141,2142,5,111,0,0,2142,2143,5,102,0,0,2143,2144,5,102,0,0,2144, - 2145,5,82,0,0,2145,2146,5,97,0,0,2146,2147,5,116,0,0,2147,2148,5, - 101,0,0,2148,2149,5,34,0,0,2149,246,1,0,0,0,2150,2151,5,34,0,0,2151, - 2152,5,77,0,0,2152,2153,5,97,0,0,2153,2154,5,120,0,0,2154,2155,5, - 68,0,0,2155,2156,5,101,0,0,2156,2157,5,108,0,0,2157,2158,5,97,0, - 0,2158,2159,5,121,0,0,2159,2160,5,83,0,0,2160,2161,5,101,0,0,2161, - 2162,5,99,0,0,2162,2163,5,111,0,0,2163,2164,5,110,0,0,2164,2165, - 5,100,0,0,2165,2166,5,115,0,0,2166,2167,5,34,0,0,2167,248,1,0,0, - 0,2168,2169,5,34,0,0,2169,2170,5,74,0,0,2170,2171,5,105,0,0,2171, - 2172,5,116,0,0,2172,2173,5,116,0,0,2173,2174,5,101,0,0,2174,2175, - 5,114,0,0,2175,2176,5,83,0,0,2176,2177,5,116,0,0,2177,2178,5,114, - 0,0,2178,2179,5,97,0,0,2179,2180,5,116,0,0,2180,2181,5,101,0,0,2181, - 2182,5,103,0,0,2182,2183,5,121,0,0,2183,2184,5,34,0,0,2184,250,1, - 0,0,0,2185,2186,5,34,0,0,2186,2187,5,70,0,0,2187,2188,5,85,0,0,2188, - 2189,5,76,0,0,2189,2190,5,76,0,0,2190,2191,5,34,0,0,2191,252,1,0, - 0,0,2192,2193,5,34,0,0,2193,2194,5,78,0,0,2194,2195,5,79,0,0,2195, - 2196,5,78,0,0,2196,2197,5,69,0,0,2197,2198,5,34,0,0,2198,254,1,0, - 0,0,2199,2200,5,34,0,0,2200,2201,5,67,0,0,2201,2202,5,97,0,0,2202, - 2203,5,116,0,0,2203,2204,5,99,0,0,2204,2205,5,104,0,0,2205,2206, - 5,34,0,0,2206,256,1,0,0,0,2207,2208,5,34,0,0,2208,2209,5,81,0,0, - 2209,2210,5,117,0,0,2210,2211,5,101,0,0,2211,2212,5,114,0,0,2212, - 2213,5,121,0,0,2213,2214,5,76,0,0,2214,2215,5,97,0,0,2215,2216,5, - 110,0,0,2216,2217,5,103,0,0,2217,2218,5,117,0,0,2218,2219,5,97,0, - 0,2219,2220,5,103,0,0,2220,2221,5,101,0,0,2221,2222,5,34,0,0,2222, - 258,1,0,0,0,2223,2224,5,34,0,0,2224,2225,5,74,0,0,2225,2226,5,83, - 0,0,2226,2227,5,79,0,0,2227,2228,5,78,0,0,2228,2229,5,80,0,0,2229, - 2230,5,97,0,0,2230,2231,5,116,0,0,2231,2232,5,104,0,0,2232,2233, - 5,34,0,0,2233,260,1,0,0,0,2234,2235,5,34,0,0,2235,2236,5,74,0,0, - 2236,2237,5,83,0,0,2237,2238,5,79,0,0,2238,2239,5,78,0,0,2239,2240, - 5,97,0,0,2240,2241,5,116,0,0,2241,2242,5,97,0,0,2242,2243,5,34,0, - 0,2243,262,1,0,0,0,2244,2245,5,34,0,0,2245,2246,5,65,0,0,2246,2247, - 5,115,0,0,2247,2248,5,115,0,0,2248,2249,5,105,0,0,2249,2250,5,103, - 0,0,2250,2251,5,110,0,0,2251,2252,5,34,0,0,2252,264,1,0,0,0,2253, - 2254,5,34,0,0,2254,2255,5,79,0,0,2255,2256,5,117,0,0,2256,2257,5, - 116,0,0,2257,2258,5,112,0,0,2258,2259,5,117,0,0,2259,2260,5,116, - 0,0,2260,2261,5,34,0,0,2261,266,1,0,0,0,2262,2263,5,34,0,0,2263, - 2264,5,65,0,0,2264,2265,5,114,0,0,2265,2266,5,103,0,0,2266,2267, - 5,117,0,0,2267,2268,5,109,0,0,2268,2269,5,101,0,0,2269,2270,5,110, - 0,0,2270,2271,5,116,0,0,2271,2272,5,115,0,0,2272,2273,5,34,0,0,2273, - 268,1,0,0,0,2274,2275,5,34,0,0,2275,2276,5,83,0,0,2276,2277,5,116, - 0,0,2277,2278,5,97,0,0,2278,2279,5,116,0,0,2279,2280,5,101,0,0,2280, - 2281,5,115,0,0,2281,2282,5,46,0,0,2282,2283,5,65,0,0,2283,2284,5, - 76,0,0,2284,2285,5,76,0,0,2285,2286,5,34,0,0,2286,270,1,0,0,0,2287, - 2288,5,34,0,0,2288,2289,5,83,0,0,2289,2290,5,116,0,0,2290,2291,5, - 97,0,0,2291,2292,5,116,0,0,2292,2293,5,101,0,0,2293,2294,5,115,0, - 0,2294,2295,5,46,0,0,2295,2296,5,68,0,0,2296,2297,5,97,0,0,2297, - 2298,5,116,0,0,2298,2299,5,97,0,0,2299,2300,5,76,0,0,2300,2301,5, - 105,0,0,2301,2302,5,109,0,0,2302,2303,5,105,0,0,2303,2304,5,116, - 0,0,2304,2305,5,69,0,0,2305,2306,5,120,0,0,2306,2307,5,99,0,0,2307, - 2308,5,101,0,0,2308,2309,5,101,0,0,2309,2310,5,100,0,0,2310,2311, - 5,101,0,0,2311,2312,5,100,0,0,2312,2313,5,34,0,0,2313,272,1,0,0, - 0,2314,2315,5,34,0,0,2315,2316,5,83,0,0,2316,2317,5,116,0,0,2317, - 2318,5,97,0,0,2318,2319,5,116,0,0,2319,2320,5,101,0,0,2320,2321, - 5,115,0,0,2321,2322,5,46,0,0,2322,2323,5,72,0,0,2323,2324,5,101, - 0,0,2324,2325,5,97,0,0,2325,2326,5,114,0,0,2326,2327,5,116,0,0,2327, - 2328,5,98,0,0,2328,2329,5,101,0,0,2329,2330,5,97,0,0,2330,2331,5, - 116,0,0,2331,2332,5,84,0,0,2332,2333,5,105,0,0,2333,2334,5,109,0, - 0,2334,2335,5,101,0,0,2335,2336,5,111,0,0,2336,2337,5,117,0,0,2337, - 2338,5,116,0,0,2338,2339,5,34,0,0,2339,274,1,0,0,0,2340,2341,5,34, - 0,0,2341,2342,5,83,0,0,2342,2343,5,116,0,0,2343,2344,5,97,0,0,2344, - 2345,5,116,0,0,2345,2346,5,101,0,0,2346,2347,5,115,0,0,2347,2348, - 5,46,0,0,2348,2349,5,84,0,0,2349,2350,5,105,0,0,2350,2351,5,109, - 0,0,2351,2352,5,101,0,0,2352,2353,5,111,0,0,2353,2354,5,117,0,0, - 2354,2355,5,116,0,0,2355,2356,5,34,0,0,2356,276,1,0,0,0,2357,2358, - 5,34,0,0,2358,2359,5,83,0,0,2359,2360,5,116,0,0,2360,2361,5,97,0, - 0,2361,2362,5,116,0,0,2362,2363,5,101,0,0,2363,2364,5,115,0,0,2364, - 2365,5,46,0,0,2365,2366,5,84,0,0,2366,2367,5,97,0,0,2367,2368,5, - 115,0,0,2368,2369,5,107,0,0,2369,2370,5,70,0,0,2370,2371,5,97,0, - 0,2371,2372,5,105,0,0,2372,2373,5,108,0,0,2373,2374,5,101,0,0,2374, - 2375,5,100,0,0,2375,2376,5,34,0,0,2376,278,1,0,0,0,2377,2378,5,34, - 0,0,2378,2379,5,83,0,0,2379,2380,5,116,0,0,2380,2381,5,97,0,0,2381, - 2382,5,116,0,0,2382,2383,5,101,0,0,2383,2384,5,115,0,0,2384,2385, - 5,46,0,0,2385,2386,5,80,0,0,2386,2387,5,101,0,0,2387,2388,5,114, - 0,0,2388,2389,5,109,0,0,2389,2390,5,105,0,0,2390,2391,5,115,0,0, - 2391,2392,5,115,0,0,2392,2393,5,105,0,0,2393,2394,5,111,0,0,2394, - 2395,5,110,0,0,2395,2396,5,115,0,0,2396,2397,5,34,0,0,2397,280,1, - 0,0,0,2398,2399,5,34,0,0,2399,2400,5,83,0,0,2400,2401,5,116,0,0, - 2401,2402,5,97,0,0,2402,2403,5,116,0,0,2403,2404,5,101,0,0,2404, - 2405,5,115,0,0,2405,2406,5,46,0,0,2406,2407,5,82,0,0,2407,2408,5, - 101,0,0,2408,2409,5,115,0,0,2409,2410,5,117,0,0,2410,2411,5,108, - 0,0,2411,2412,5,116,0,0,2412,2413,5,80,0,0,2413,2414,5,97,0,0,2414, - 2415,5,116,0,0,2415,2416,5,104,0,0,2416,2417,5,77,0,0,2417,2418, - 5,97,0,0,2418,2419,5,116,0,0,2419,2420,5,99,0,0,2420,2421,5,104, - 0,0,2421,2422,5,70,0,0,2422,2423,5,97,0,0,2423,2424,5,105,0,0,2424, - 2425,5,108,0,0,2425,2426,5,117,0,0,2426,2427,5,114,0,0,2427,2428, - 5,101,0,0,2428,2429,5,34,0,0,2429,282,1,0,0,0,2430,2431,5,34,0,0, - 2431,2432,5,83,0,0,2432,2433,5,116,0,0,2433,2434,5,97,0,0,2434,2435, - 5,116,0,0,2435,2436,5,101,0,0,2436,2437,5,115,0,0,2437,2438,5,46, - 0,0,2438,2439,5,80,0,0,2439,2440,5,97,0,0,2440,2441,5,114,0,0,2441, - 2442,5,97,0,0,2442,2443,5,109,0,0,2443,2444,5,101,0,0,2444,2445, - 5,116,0,0,2445,2446,5,101,0,0,2446,2447,5,114,0,0,2447,2448,5,80, - 0,0,2448,2449,5,97,0,0,2449,2450,5,116,0,0,2450,2451,5,104,0,0,2451, - 2452,5,70,0,0,2452,2453,5,97,0,0,2453,2454,5,105,0,0,2454,2455,5, - 108,0,0,2455,2456,5,117,0,0,2456,2457,5,114,0,0,2457,2458,5,101, - 0,0,2458,2459,5,34,0,0,2459,284,1,0,0,0,2460,2461,5,34,0,0,2461, - 2462,5,83,0,0,2462,2463,5,116,0,0,2463,2464,5,97,0,0,2464,2465,5, - 116,0,0,2465,2466,5,101,0,0,2466,2467,5,115,0,0,2467,2468,5,46,0, - 0,2468,2469,5,66,0,0,2469,2470,5,114,0,0,2470,2471,5,97,0,0,2471, - 2472,5,110,0,0,2472,2473,5,99,0,0,2473,2474,5,104,0,0,2474,2475, - 5,70,0,0,2475,2476,5,97,0,0,2476,2477,5,105,0,0,2477,2478,5,108, - 0,0,2478,2479,5,101,0,0,2479,2480,5,100,0,0,2480,2481,5,34,0,0,2481, - 286,1,0,0,0,2482,2483,5,34,0,0,2483,2484,5,83,0,0,2484,2485,5,116, - 0,0,2485,2486,5,97,0,0,2486,2487,5,116,0,0,2487,2488,5,101,0,0,2488, - 2489,5,115,0,0,2489,2490,5,46,0,0,2490,2491,5,78,0,0,2491,2492,5, - 111,0,0,2492,2493,5,67,0,0,2493,2494,5,104,0,0,2494,2495,5,111,0, - 0,2495,2496,5,105,0,0,2496,2497,5,99,0,0,2497,2498,5,101,0,0,2498, - 2499,5,77,0,0,2499,2500,5,97,0,0,2500,2501,5,116,0,0,2501,2502,5, - 99,0,0,2502,2503,5,104,0,0,2503,2504,5,101,0,0,2504,2505,5,100,0, - 0,2505,2506,5,34,0,0,2506,288,1,0,0,0,2507,2508,5,34,0,0,2508,2509, - 5,83,0,0,2509,2510,5,116,0,0,2510,2511,5,97,0,0,2511,2512,5,116, - 0,0,2512,2513,5,101,0,0,2513,2514,5,115,0,0,2514,2515,5,46,0,0,2515, - 2516,5,73,0,0,2516,2517,5,110,0,0,2517,2518,5,116,0,0,2518,2519, - 5,114,0,0,2519,2520,5,105,0,0,2520,2521,5,110,0,0,2521,2522,5,115, - 0,0,2522,2523,5,105,0,0,2523,2524,5,99,0,0,2524,2525,5,70,0,0,2525, - 2526,5,97,0,0,2526,2527,5,105,0,0,2527,2528,5,108,0,0,2528,2529, - 5,117,0,0,2529,2530,5,114,0,0,2530,2531,5,101,0,0,2531,2532,5,34, - 0,0,2532,290,1,0,0,0,2533,2534,5,34,0,0,2534,2535,5,83,0,0,2535, - 2536,5,116,0,0,2536,2537,5,97,0,0,2537,2538,5,116,0,0,2538,2539, - 5,101,0,0,2539,2540,5,115,0,0,2540,2541,5,46,0,0,2541,2542,5,69, - 0,0,2542,2543,5,120,0,0,2543,2544,5,99,0,0,2544,2545,5,101,0,0,2545, - 2546,5,101,0,0,2546,2547,5,100,0,0,2547,2548,5,84,0,0,2548,2549, - 5,111,0,0,2549,2550,5,108,0,0,2550,2551,5,101,0,0,2551,2552,5,114, - 0,0,2552,2553,5,97,0,0,2553,2554,5,116,0,0,2554,2555,5,101,0,0,2555, - 2556,5,100,0,0,2556,2557,5,70,0,0,2557,2558,5,97,0,0,2558,2559,5, - 105,0,0,2559,2560,5,108,0,0,2560,2561,5,117,0,0,2561,2562,5,114, - 0,0,2562,2563,5,101,0,0,2563,2564,5,84,0,0,2564,2565,5,104,0,0,2565, - 2566,5,114,0,0,2566,2567,5,101,0,0,2567,2568,5,115,0,0,2568,2569, - 5,104,0,0,2569,2570,5,111,0,0,2570,2571,5,108,0,0,2571,2572,5,100, - 0,0,2572,2573,5,34,0,0,2573,292,1,0,0,0,2574,2575,5,34,0,0,2575, - 2576,5,83,0,0,2576,2577,5,116,0,0,2577,2578,5,97,0,0,2578,2579,5, - 116,0,0,2579,2580,5,101,0,0,2580,2581,5,115,0,0,2581,2582,5,46,0, - 0,2582,2583,5,73,0,0,2583,2584,5,116,0,0,2584,2585,5,101,0,0,2585, - 2586,5,109,0,0,2586,2587,5,82,0,0,2587,2588,5,101,0,0,2588,2589, - 5,97,0,0,2589,2590,5,100,0,0,2590,2591,5,101,0,0,2591,2592,5,114, - 0,0,2592,2593,5,70,0,0,2593,2594,5,97,0,0,2594,2595,5,105,0,0,2595, - 2596,5,108,0,0,2596,2597,5,101,0,0,2597,2598,5,100,0,0,2598,2599, - 5,34,0,0,2599,294,1,0,0,0,2600,2601,5,34,0,0,2601,2602,5,83,0,0, - 2602,2603,5,116,0,0,2603,2604,5,97,0,0,2604,2605,5,116,0,0,2605, - 2606,5,101,0,0,2606,2607,5,115,0,0,2607,2608,5,46,0,0,2608,2609, - 5,82,0,0,2609,2610,5,101,0,0,2610,2611,5,115,0,0,2611,2612,5,117, - 0,0,2612,2613,5,108,0,0,2613,2614,5,116,0,0,2614,2615,5,87,0,0,2615, - 2616,5,114,0,0,2616,2617,5,105,0,0,2617,2618,5,116,0,0,2618,2619, - 5,101,0,0,2619,2620,5,114,0,0,2620,2621,5,70,0,0,2621,2622,5,97, - 0,0,2622,2623,5,105,0,0,2623,2624,5,108,0,0,2624,2625,5,101,0,0, - 2625,2626,5,100,0,0,2626,2627,5,34,0,0,2627,296,1,0,0,0,2628,2629, - 5,34,0,0,2629,2630,5,83,0,0,2630,2631,5,116,0,0,2631,2632,5,97,0, - 0,2632,2633,5,116,0,0,2633,2634,5,101,0,0,2634,2635,5,115,0,0,2635, - 2636,5,46,0,0,2636,2637,5,81,0,0,2637,2638,5,117,0,0,2638,2639,5, - 101,0,0,2639,2640,5,114,0,0,2640,2641,5,121,0,0,2641,2642,5,69,0, - 0,2642,2643,5,118,0,0,2643,2644,5,97,0,0,2644,2645,5,108,0,0,2645, - 2646,5,117,0,0,2646,2647,5,97,0,0,2647,2648,5,116,0,0,2648,2649, - 5,105,0,0,2649,2650,5,111,0,0,2650,2651,5,110,0,0,2651,2652,5,69, - 0,0,2652,2653,5,114,0,0,2653,2654,5,114,0,0,2654,2655,5,111,0,0, - 2655,2656,5,114,0,0,2656,2657,5,34,0,0,2657,298,1,0,0,0,2658,2659, - 5,34,0,0,2659,2660,5,83,0,0,2660,2661,5,116,0,0,2661,2662,5,97,0, - 0,2662,2663,5,116,0,0,2663,2664,5,101,0,0,2664,2665,5,115,0,0,2665, - 2666,5,46,0,0,2666,2667,5,82,0,0,2667,2668,5,117,0,0,2668,2669,5, - 110,0,0,2669,2670,5,116,0,0,2670,2671,5,105,0,0,2671,2672,5,109, - 0,0,2672,2673,5,101,0,0,2673,2674,5,34,0,0,2674,300,1,0,0,0,2675, - 2680,5,34,0,0,2676,2679,3,315,157,0,2677,2679,3,321,160,0,2678,2676, - 1,0,0,0,2678,2677,1,0,0,0,2679,2682,1,0,0,0,2680,2678,1,0,0,0,2680, - 2681,1,0,0,0,2681,2683,1,0,0,0,2682,2680,1,0,0,0,2683,2684,5,46, - 0,0,2684,2685,5,36,0,0,2685,2686,5,34,0,0,2686,302,1,0,0,0,2687, - 2688,5,34,0,0,2688,2689,5,36,0,0,2689,2690,5,36,0,0,2690,2695,1, - 0,0,0,2691,2694,3,315,157,0,2692,2694,3,321,160,0,2693,2691,1,0, - 0,0,2693,2692,1,0,0,0,2694,2697,1,0,0,0,2695,2693,1,0,0,0,2695,2696, - 1,0,0,0,2696,2698,1,0,0,0,2697,2695,1,0,0,0,2698,2699,5,34,0,0,2699, - 304,1,0,0,0,2700,2701,5,34,0,0,2701,2702,5,36,0,0,2702,2716,5,34, - 0,0,2703,2704,5,34,0,0,2704,2705,5,36,0,0,2705,2706,1,0,0,0,2706, - 2711,7,0,0,0,2707,2710,3,315,157,0,2708,2710,3,321,160,0,2709,2707, - 1,0,0,0,2709,2708,1,0,0,0,2710,2713,1,0,0,0,2711,2709,1,0,0,0,2711, - 2712,1,0,0,0,2712,2714,1,0,0,0,2713,2711,1,0,0,0,2714,2716,5,34, - 0,0,2715,2700,1,0,0,0,2715,2703,1,0,0,0,2716,306,1,0,0,0,2717,2718, - 5,34,0,0,2718,2719,5,36,0,0,2719,2720,1,0,0,0,2720,2725,7,1,0,0, - 2721,2724,3,315,157,0,2722,2724,3,321,160,0,2723,2721,1,0,0,0,2723, - 2722,1,0,0,0,2724,2727,1,0,0,0,2725,2723,1,0,0,0,2725,2726,1,0,0, - 0,2726,2728,1,0,0,0,2727,2725,1,0,0,0,2728,2729,5,34,0,0,2729,308, - 1,0,0,0,2730,2731,5,34,0,0,2731,2732,5,83,0,0,2732,2733,5,116,0, - 0,2733,2734,5,97,0,0,2734,2735,5,116,0,0,2735,2736,5,101,0,0,2736, - 2737,5,115,0,0,2737,2738,5,46,0,0,2738,2741,1,0,0,0,2739,2742,3, - 315,157,0,2740,2742,3,321,160,0,2741,2739,1,0,0,0,2741,2740,1,0, - 0,0,2742,2743,1,0,0,0,2743,2741,1,0,0,0,2743,2744,1,0,0,0,2744,2745, - 1,0,0,0,2745,2750,5,40,0,0,2746,2749,3,315,157,0,2747,2749,3,321, - 160,0,2748,2746,1,0,0,0,2748,2747,1,0,0,0,2749,2752,1,0,0,0,2750, - 2748,1,0,0,0,2750,2751,1,0,0,0,2751,2753,1,0,0,0,2752,2750,1,0,0, - 0,2753,2754,5,41,0,0,2754,2755,5,34,0,0,2755,310,1,0,0,0,2756,2761, - 3,323,161,0,2757,2760,3,315,157,0,2758,2760,3,321,160,0,2759,2757, - 1,0,0,0,2759,2758,1,0,0,0,2760,2763,1,0,0,0,2761,2759,1,0,0,0,2761, - 2762,1,0,0,0,2762,2764,1,0,0,0,2763,2761,1,0,0,0,2764,2765,3,325, - 162,0,2765,312,1,0,0,0,2766,2771,5,34,0,0,2767,2770,3,315,157,0, - 2768,2770,3,321,160,0,2769,2767,1,0,0,0,2769,2768,1,0,0,0,2770,2773, - 1,0,0,0,2771,2769,1,0,0,0,2771,2772,1,0,0,0,2772,2774,1,0,0,0,2773, - 2771,1,0,0,0,2774,2775,5,34,0,0,2775,314,1,0,0,0,2776,2779,5,92, - 0,0,2777,2780,7,2,0,0,2778,2780,3,317,158,0,2779,2777,1,0,0,0,2779, - 2778,1,0,0,0,2780,316,1,0,0,0,2781,2782,5,117,0,0,2782,2783,3,319, - 159,0,2783,2784,3,319,159,0,2784,2785,3,319,159,0,2785,2786,3,319, - 159,0,2786,318,1,0,0,0,2787,2788,7,3,0,0,2788,320,1,0,0,0,2789,2790, - 8,4,0,0,2790,322,1,0,0,0,2791,2792,5,34,0,0,2792,2793,5,123,0,0, - 2793,2794,5,37,0,0,2794,324,1,0,0,0,2795,2796,5,37,0,0,2796,2797, - 5,125,0,0,2797,2798,5,34,0,0,2798,326,1,0,0,0,2799,2808,5,48,0,0, - 2800,2804,7,5,0,0,2801,2803,7,6,0,0,2802,2801,1,0,0,0,2803,2806, - 1,0,0,0,2804,2802,1,0,0,0,2804,2805,1,0,0,0,2805,2808,1,0,0,0,2806, - 2804,1,0,0,0,2807,2799,1,0,0,0,2807,2800,1,0,0,0,2808,328,1,0,0, - 0,2809,2811,5,45,0,0,2810,2809,1,0,0,0,2810,2811,1,0,0,0,2811,2812, - 1,0,0,0,2812,2819,3,327,163,0,2813,2815,5,46,0,0,2814,2816,7,6,0, - 0,2815,2814,1,0,0,0,2816,2817,1,0,0,0,2817,2815,1,0,0,0,2817,2818, - 1,0,0,0,2818,2820,1,0,0,0,2819,2813,1,0,0,0,2819,2820,1,0,0,0,2820, - 2822,1,0,0,0,2821,2823,3,331,165,0,2822,2821,1,0,0,0,2822,2823,1, - 0,0,0,2823,330,1,0,0,0,2824,2826,7,7,0,0,2825,2827,7,8,0,0,2826, - 2825,1,0,0,0,2826,2827,1,0,0,0,2827,2828,1,0,0,0,2828,2829,3,327, - 163,0,2829,332,1,0,0,0,2830,2832,7,9,0,0,2831,2830,1,0,0,0,2832, - 2833,1,0,0,0,2833,2831,1,0,0,0,2833,2834,1,0,0,0,2834,2835,1,0,0, - 0,2835,2836,6,166,0,0,2836,334,1,0,0,0,27,0,2678,2680,2693,2695, - 2709,2711,2715,2723,2725,2741,2743,2748,2750,2759,2761,2769,2771, - 2779,2804,2807,2810,2817,2819,2822,2826,2833,1,6,0,0 + 1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150,1,150,1,150,1,150, + 1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150, + 1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150, + 1,150,1,151,1,151,1,151,1,151,1,151,1,151,1,151,1,151,1,151,1,151, + 1,151,1,151,1,151,1,151,1,151,1,151,1,151,1,152,1,152,1,152,5,152, + 2705,8,152,10,152,12,152,2708,9,152,1,152,1,152,1,152,1,152,1,153, + 1,153,1,153,1,153,1,153,1,153,5,153,2720,8,153,10,153,12,153,2723, + 9,153,1,153,1,153,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154, + 1,154,5,154,2736,8,154,10,154,12,154,2739,9,154,1,154,3,154,2742, + 8,154,1,155,1,155,1,155,1,155,1,155,1,155,5,155,2750,8,155,10,155, + 12,155,2753,9,155,1,155,1,155,1,156,1,156,1,156,1,156,1,156,1,156, + 1,156,1,156,1,156,1,156,1,156,4,156,2768,8,156,11,156,12,156,2769, + 1,156,1,156,1,156,5,156,2775,8,156,10,156,12,156,2778,9,156,1,156, + 1,156,1,156,1,157,1,157,1,157,5,157,2786,8,157,10,157,12,157,2789, + 9,157,1,157,1,157,1,158,1,158,1,158,5,158,2796,8,158,10,158,12,158, + 2799,9,158,1,158,1,158,1,159,1,159,1,159,3,159,2806,8,159,1,160, + 1,160,1,160,1,160,1,160,1,160,1,161,1,161,1,162,1,162,1,163,1,163, + 1,163,1,163,1,164,1,164,1,164,1,164,1,165,1,165,1,165,5,165,2829, + 8,165,10,165,12,165,2832,9,165,3,165,2834,8,165,1,166,3,166,2837, + 8,166,1,166,1,166,1,166,4,166,2842,8,166,11,166,12,166,2843,3,166, + 2846,8,166,1,166,3,166,2849,8,166,1,167,1,167,3,167,2853,8,167,1, + 167,1,167,1,168,4,168,2858,8,168,11,168,12,168,2859,1,168,1,168, + 0,0,169,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, + 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, + 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34, + 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45, + 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, + 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129, + 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74, + 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167, + 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93, + 187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102, + 205,103,207,104,209,105,211,106,213,107,215,108,217,109,219,110, + 221,111,223,112,225,113,227,114,229,115,231,116,233,117,235,118, + 237,119,239,120,241,121,243,122,245,123,247,124,249,125,251,126, + 253,127,255,128,257,129,259,130,261,131,263,132,265,133,267,134, + 269,135,271,136,273,137,275,138,277,139,279,140,281,141,283,142, + 285,143,287,144,289,145,291,146,293,147,295,148,297,149,299,150, + 301,151,303,152,305,153,307,154,309,155,311,156,313,157,315,158, + 317,159,319,0,321,0,323,0,325,0,327,0,329,0,331,160,333,161,335, + 0,337,162,1,0,10,2,0,46,46,91,91,3,0,65,90,95,95,97,122,8,0,34,34, + 47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65,70, + 97,102,3,0,0,31,34,34,92,92,1,0,49,57,1,0,48,57,2,0,69,69,101,101, + 2,0,43,43,45,45,3,0,9,10,13,13,32,32,2881,0,1,1,0,0,0,0,3,1,0,0, + 0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0, + 0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0, + 0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0, + 0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0, + 0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0, + 0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0, + 0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0, + 0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0, + 0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0, + 0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0, + 0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113, + 1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0, + 0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1, + 0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0, + 141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0, + 0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159, + 1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0, + 0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1, + 0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0, + 187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0, + 0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205, + 1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0, + 0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1, + 0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,0,0,231,1,0,0,0,0, + 233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0, + 0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251, + 1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0, + 0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1, + 0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0, + 279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285,1,0,0,0,0,287,1,0, + 0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0,297, + 1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1,0,0,0, + 0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0,315,1, + 0,0,0,0,317,1,0,0,0,0,331,1,0,0,0,0,333,1,0,0,0,0,337,1,0,0,0,1, + 339,1,0,0,0,3,341,1,0,0,0,5,343,1,0,0,0,7,345,1,0,0,0,9,347,1,0, + 0,0,11,349,1,0,0,0,13,351,1,0,0,0,15,356,1,0,0,0,17,362,1,0,0,0, + 19,367,1,0,0,0,21,377,1,0,0,0,23,386,1,0,0,0,25,396,1,0,0,0,27,408, + 1,0,0,0,29,418,1,0,0,0,31,425,1,0,0,0,33,432,1,0,0,0,35,441,1,0, + 0,0,37,448,1,0,0,0,39,458,1,0,0,0,41,465,1,0,0,0,43,472,1,0,0,0, + 45,483,1,0,0,0,47,489,1,0,0,0,49,499,1,0,0,0,51,511,1,0,0,0,53,522, + 1,0,0,0,55,532,1,0,0,0,57,543,1,0,0,0,59,549,1,0,0,0,61,565,1,0, + 0,0,63,585,1,0,0,0,65,597,1,0,0,0,67,606,1,0,0,0,69,618,1,0,0,0, + 71,630,1,0,0,0,73,641,1,0,0,0,75,655,1,0,0,0,77,661,1,0,0,0,79,677, + 1,0,0,0,81,697,1,0,0,0,83,718,1,0,0,0,85,743,1,0,0,0,87,770,1,0, + 0,0,89,801,1,0,0,0,91,819,1,0,0,0,93,841,1,0,0,0,95,865,1,0,0,0, + 97,893,1,0,0,0,99,898,1,0,0,0,101,913,1,0,0,0,103,932,1,0,0,0,105, + 952,1,0,0,0,107,976,1,0,0,0,109,1002,1,0,0,0,111,1032,1,0,0,0,113, + 1049,1,0,0,0,115,1070,1,0,0,0,117,1093,1,0,0,0,119,1120,1,0,0,0, + 121,1136,1,0,0,0,123,1154,1,0,0,0,125,1176,1,0,0,0,127,1199,1,0, + 0,0,129,1226,1,0,0,0,131,1255,1,0,0,0,133,1288,1,0,0,0,135,1308, + 1,0,0,0,137,1332,1,0,0,0,139,1358,1,0,0,0,141,1388,1,0,0,0,143,1402, + 1,0,0,0,145,1412,1,0,0,0,147,1428,1,0,0,0,149,1440,1,0,0,0,151,1457, + 1,0,0,0,153,1478,1,0,0,0,155,1497,1,0,0,0,157,1520,1,0,0,0,159,1538, + 1,0,0,0,161,1545,1,0,0,0,163,1554,1,0,0,0,165,1568,1,0,0,0,167,1584, + 1,0,0,0,169,1595,1,0,0,0,171,1611,1,0,0,0,173,1622,1,0,0,0,175,1637, + 1,0,0,0,177,1658,1,0,0,0,179,1675,1,0,0,0,181,1686,1,0,0,0,183,1698, + 1,0,0,0,185,1711,1,0,0,0,187,1719,1,0,0,0,189,1731,1,0,0,0,191,1744, + 1,0,0,0,193,1753,1,0,0,0,195,1766,1,0,0,0,197,1780,1,0,0,0,199,1790, + 1,0,0,0,201,1802,1,0,0,0,203,1819,1,0,0,0,205,1832,1,0,0,0,207,1847, + 1,0,0,0,209,1859,1,0,0,0,211,1879,1,0,0,0,213,1892,1,0,0,0,215,1903, + 1,0,0,0,217,1918,1,0,0,0,219,1942,1,0,0,0,221,1970,1,0,0,0,223,1999, + 1,0,0,0,225,2032,1,0,0,0,227,2040,1,0,0,0,229,2055,1,0,0,0,231,2062, + 1,0,0,0,233,2068,1,0,0,0,235,2076,1,0,0,0,237,2088,1,0,0,0,239,2096, + 1,0,0,0,241,2108,1,0,0,0,243,2116,1,0,0,0,245,2130,1,0,0,0,247,2148, + 1,0,0,0,249,2162,1,0,0,0,251,2176,1,0,0,0,253,2194,1,0,0,0,255,2211, + 1,0,0,0,257,2218,1,0,0,0,259,2225,1,0,0,0,261,2233,1,0,0,0,263,2249, + 1,0,0,0,265,2260,1,0,0,0,267,2270,1,0,0,0,269,2279,1,0,0,0,271,2288, + 1,0,0,0,273,2300,1,0,0,0,275,2313,1,0,0,0,277,2340,1,0,0,0,279,2366, + 1,0,0,0,281,2383,1,0,0,0,283,2403,1,0,0,0,285,2424,1,0,0,0,287,2456, + 1,0,0,0,289,2486,1,0,0,0,291,2508,1,0,0,0,293,2533,1,0,0,0,295,2559, + 1,0,0,0,297,2600,1,0,0,0,299,2626,1,0,0,0,301,2654,1,0,0,0,303,2684, + 1,0,0,0,305,2701,1,0,0,0,307,2713,1,0,0,0,309,2741,1,0,0,0,311,2743, + 1,0,0,0,313,2756,1,0,0,0,315,2782,1,0,0,0,317,2792,1,0,0,0,319,2802, + 1,0,0,0,321,2807,1,0,0,0,323,2813,1,0,0,0,325,2815,1,0,0,0,327,2817, + 1,0,0,0,329,2821,1,0,0,0,331,2833,1,0,0,0,333,2836,1,0,0,0,335,2850, + 1,0,0,0,337,2857,1,0,0,0,339,340,5,44,0,0,340,2,1,0,0,0,341,342, + 5,58,0,0,342,4,1,0,0,0,343,344,5,91,0,0,344,6,1,0,0,0,345,346,5, + 93,0,0,346,8,1,0,0,0,347,348,5,123,0,0,348,10,1,0,0,0,349,350,5, + 125,0,0,350,12,1,0,0,0,351,352,5,116,0,0,352,353,5,114,0,0,353,354, + 5,117,0,0,354,355,5,101,0,0,355,14,1,0,0,0,356,357,5,102,0,0,357, + 358,5,97,0,0,358,359,5,108,0,0,359,360,5,115,0,0,360,361,5,101,0, + 0,361,16,1,0,0,0,362,363,5,110,0,0,363,364,5,117,0,0,364,365,5,108, + 0,0,365,366,5,108,0,0,366,18,1,0,0,0,367,368,5,34,0,0,368,369,5, + 67,0,0,369,370,5,111,0,0,370,371,5,109,0,0,371,372,5,109,0,0,372, + 373,5,101,0,0,373,374,5,110,0,0,374,375,5,116,0,0,375,376,5,34,0, + 0,376,20,1,0,0,0,377,378,5,34,0,0,378,379,5,83,0,0,379,380,5,116, + 0,0,380,381,5,97,0,0,381,382,5,116,0,0,382,383,5,101,0,0,383,384, + 5,115,0,0,384,385,5,34,0,0,385,22,1,0,0,0,386,387,5,34,0,0,387,388, + 5,83,0,0,388,389,5,116,0,0,389,390,5,97,0,0,390,391,5,114,0,0,391, + 392,5,116,0,0,392,393,5,65,0,0,393,394,5,116,0,0,394,395,5,34,0, + 0,395,24,1,0,0,0,396,397,5,34,0,0,397,398,5,78,0,0,398,399,5,101, + 0,0,399,400,5,120,0,0,400,401,5,116,0,0,401,402,5,83,0,0,402,403, + 5,116,0,0,403,404,5,97,0,0,404,405,5,116,0,0,405,406,5,101,0,0,406, + 407,5,34,0,0,407,26,1,0,0,0,408,409,5,34,0,0,409,410,5,86,0,0,410, + 411,5,101,0,0,411,412,5,114,0,0,412,413,5,115,0,0,413,414,5,105, + 0,0,414,415,5,111,0,0,415,416,5,110,0,0,416,417,5,34,0,0,417,28, + 1,0,0,0,418,419,5,34,0,0,419,420,5,84,0,0,420,421,5,121,0,0,421, + 422,5,112,0,0,422,423,5,101,0,0,423,424,5,34,0,0,424,30,1,0,0,0, + 425,426,5,34,0,0,426,427,5,84,0,0,427,428,5,97,0,0,428,429,5,115, + 0,0,429,430,5,107,0,0,430,431,5,34,0,0,431,32,1,0,0,0,432,433,5, + 34,0,0,433,434,5,67,0,0,434,435,5,104,0,0,435,436,5,111,0,0,436, + 437,5,105,0,0,437,438,5,99,0,0,438,439,5,101,0,0,439,440,5,34,0, + 0,440,34,1,0,0,0,441,442,5,34,0,0,442,443,5,70,0,0,443,444,5,97, + 0,0,444,445,5,105,0,0,445,446,5,108,0,0,446,447,5,34,0,0,447,36, + 1,0,0,0,448,449,5,34,0,0,449,450,5,83,0,0,450,451,5,117,0,0,451, + 452,5,99,0,0,452,453,5,99,0,0,453,454,5,101,0,0,454,455,5,101,0, + 0,455,456,5,100,0,0,456,457,5,34,0,0,457,38,1,0,0,0,458,459,5,34, + 0,0,459,460,5,80,0,0,460,461,5,97,0,0,461,462,5,115,0,0,462,463, + 5,115,0,0,463,464,5,34,0,0,464,40,1,0,0,0,465,466,5,34,0,0,466,467, + 5,87,0,0,467,468,5,97,0,0,468,469,5,105,0,0,469,470,5,116,0,0,470, + 471,5,34,0,0,471,42,1,0,0,0,472,473,5,34,0,0,473,474,5,80,0,0,474, + 475,5,97,0,0,475,476,5,114,0,0,476,477,5,97,0,0,477,478,5,108,0, + 0,478,479,5,108,0,0,479,480,5,101,0,0,480,481,5,108,0,0,481,482, + 5,34,0,0,482,44,1,0,0,0,483,484,5,34,0,0,484,485,5,77,0,0,485,486, + 5,97,0,0,486,487,5,112,0,0,487,488,5,34,0,0,488,46,1,0,0,0,489,490, + 5,34,0,0,490,491,5,67,0,0,491,492,5,104,0,0,492,493,5,111,0,0,493, + 494,5,105,0,0,494,495,5,99,0,0,495,496,5,101,0,0,496,497,5,115,0, + 0,497,498,5,34,0,0,498,48,1,0,0,0,499,500,5,34,0,0,500,501,5,67, + 0,0,501,502,5,111,0,0,502,503,5,110,0,0,503,504,5,100,0,0,504,505, + 5,105,0,0,505,506,5,116,0,0,506,507,5,105,0,0,507,508,5,111,0,0, + 508,509,5,110,0,0,509,510,5,34,0,0,510,50,1,0,0,0,511,512,5,34,0, + 0,512,513,5,86,0,0,513,514,5,97,0,0,514,515,5,114,0,0,515,516,5, + 105,0,0,516,517,5,97,0,0,517,518,5,98,0,0,518,519,5,108,0,0,519, + 520,5,101,0,0,520,521,5,34,0,0,521,52,1,0,0,0,522,523,5,34,0,0,523, + 524,5,68,0,0,524,525,5,101,0,0,525,526,5,102,0,0,526,527,5,97,0, + 0,527,528,5,117,0,0,528,529,5,108,0,0,529,530,5,116,0,0,530,531, + 5,34,0,0,531,54,1,0,0,0,532,533,5,34,0,0,533,534,5,66,0,0,534,535, + 5,114,0,0,535,536,5,97,0,0,536,537,5,110,0,0,537,538,5,99,0,0,538, + 539,5,104,0,0,539,540,5,101,0,0,540,541,5,115,0,0,541,542,5,34,0, + 0,542,56,1,0,0,0,543,544,5,34,0,0,544,545,5,65,0,0,545,546,5,110, + 0,0,546,547,5,100,0,0,547,548,5,34,0,0,548,58,1,0,0,0,549,550,5, + 34,0,0,550,551,5,66,0,0,551,552,5,111,0,0,552,553,5,111,0,0,553, + 554,5,108,0,0,554,555,5,101,0,0,555,556,5,97,0,0,556,557,5,110,0, + 0,557,558,5,69,0,0,558,559,5,113,0,0,559,560,5,117,0,0,560,561,5, + 97,0,0,561,562,5,108,0,0,562,563,5,115,0,0,563,564,5,34,0,0,564, + 60,1,0,0,0,565,566,5,34,0,0,566,567,5,66,0,0,567,568,5,111,0,0,568, + 569,5,111,0,0,569,570,5,108,0,0,570,571,5,101,0,0,571,572,5,97,0, + 0,572,573,5,110,0,0,573,574,5,69,0,0,574,575,5,113,0,0,575,576,5, + 117,0,0,576,577,5,97,0,0,577,578,5,108,0,0,578,579,5,115,0,0,579, + 580,5,80,0,0,580,581,5,97,0,0,581,582,5,116,0,0,582,583,5,104,0, + 0,583,584,5,34,0,0,584,62,1,0,0,0,585,586,5,34,0,0,586,587,5,73, + 0,0,587,588,5,115,0,0,588,589,5,66,0,0,589,590,5,111,0,0,590,591, + 5,111,0,0,591,592,5,108,0,0,592,593,5,101,0,0,593,594,5,97,0,0,594, + 595,5,110,0,0,595,596,5,34,0,0,596,64,1,0,0,0,597,598,5,34,0,0,598, + 599,5,73,0,0,599,600,5,115,0,0,600,601,5,78,0,0,601,602,5,117,0, + 0,602,603,5,108,0,0,603,604,5,108,0,0,604,605,5,34,0,0,605,66,1, + 0,0,0,606,607,5,34,0,0,607,608,5,73,0,0,608,609,5,115,0,0,609,610, + 5,78,0,0,610,611,5,117,0,0,611,612,5,109,0,0,612,613,5,101,0,0,613, + 614,5,114,0,0,614,615,5,105,0,0,615,616,5,99,0,0,616,617,5,34,0, + 0,617,68,1,0,0,0,618,619,5,34,0,0,619,620,5,73,0,0,620,621,5,115, + 0,0,621,622,5,80,0,0,622,623,5,114,0,0,623,624,5,101,0,0,624,625, + 5,115,0,0,625,626,5,101,0,0,626,627,5,110,0,0,627,628,5,116,0,0, + 628,629,5,34,0,0,629,70,1,0,0,0,630,631,5,34,0,0,631,632,5,73,0, + 0,632,633,5,115,0,0,633,634,5,83,0,0,634,635,5,116,0,0,635,636,5, + 114,0,0,636,637,5,105,0,0,637,638,5,110,0,0,638,639,5,103,0,0,639, + 640,5,34,0,0,640,72,1,0,0,0,641,642,5,34,0,0,642,643,5,73,0,0,643, + 644,5,115,0,0,644,645,5,84,0,0,645,646,5,105,0,0,646,647,5,109,0, + 0,647,648,5,101,0,0,648,649,5,115,0,0,649,650,5,116,0,0,650,651, + 5,97,0,0,651,652,5,109,0,0,652,653,5,112,0,0,653,654,5,34,0,0,654, + 74,1,0,0,0,655,656,5,34,0,0,656,657,5,78,0,0,657,658,5,111,0,0,658, + 659,5,116,0,0,659,660,5,34,0,0,660,76,1,0,0,0,661,662,5,34,0,0,662, + 663,5,78,0,0,663,664,5,117,0,0,664,665,5,109,0,0,665,666,5,101,0, + 0,666,667,5,114,0,0,667,668,5,105,0,0,668,669,5,99,0,0,669,670,5, + 69,0,0,670,671,5,113,0,0,671,672,5,117,0,0,672,673,5,97,0,0,673, + 674,5,108,0,0,674,675,5,115,0,0,675,676,5,34,0,0,676,78,1,0,0,0, + 677,678,5,34,0,0,678,679,5,78,0,0,679,680,5,117,0,0,680,681,5,109, + 0,0,681,682,5,101,0,0,682,683,5,114,0,0,683,684,5,105,0,0,684,685, + 5,99,0,0,685,686,5,69,0,0,686,687,5,113,0,0,687,688,5,117,0,0,688, + 689,5,97,0,0,689,690,5,108,0,0,690,691,5,115,0,0,691,692,5,80,0, + 0,692,693,5,97,0,0,693,694,5,116,0,0,694,695,5,104,0,0,695,696,5, + 34,0,0,696,80,1,0,0,0,697,698,5,34,0,0,698,699,5,78,0,0,699,700, + 5,117,0,0,700,701,5,109,0,0,701,702,5,101,0,0,702,703,5,114,0,0, + 703,704,5,105,0,0,704,705,5,99,0,0,705,706,5,71,0,0,706,707,5,114, + 0,0,707,708,5,101,0,0,708,709,5,97,0,0,709,710,5,116,0,0,710,711, + 5,101,0,0,711,712,5,114,0,0,712,713,5,84,0,0,713,714,5,104,0,0,714, + 715,5,97,0,0,715,716,5,110,0,0,716,717,5,34,0,0,717,82,1,0,0,0,718, + 719,5,34,0,0,719,720,5,78,0,0,720,721,5,117,0,0,721,722,5,109,0, + 0,722,723,5,101,0,0,723,724,5,114,0,0,724,725,5,105,0,0,725,726, + 5,99,0,0,726,727,5,71,0,0,727,728,5,114,0,0,728,729,5,101,0,0,729, + 730,5,97,0,0,730,731,5,116,0,0,731,732,5,101,0,0,732,733,5,114,0, + 0,733,734,5,84,0,0,734,735,5,104,0,0,735,736,5,97,0,0,736,737,5, + 110,0,0,737,738,5,80,0,0,738,739,5,97,0,0,739,740,5,116,0,0,740, + 741,5,104,0,0,741,742,5,34,0,0,742,84,1,0,0,0,743,744,5,34,0,0,744, + 745,5,78,0,0,745,746,5,117,0,0,746,747,5,109,0,0,747,748,5,101,0, + 0,748,749,5,114,0,0,749,750,5,105,0,0,750,751,5,99,0,0,751,752,5, + 71,0,0,752,753,5,114,0,0,753,754,5,101,0,0,754,755,5,97,0,0,755, + 756,5,116,0,0,756,757,5,101,0,0,757,758,5,114,0,0,758,759,5,84,0, + 0,759,760,5,104,0,0,760,761,5,97,0,0,761,762,5,110,0,0,762,763,5, + 69,0,0,763,764,5,113,0,0,764,765,5,117,0,0,765,766,5,97,0,0,766, + 767,5,108,0,0,767,768,5,115,0,0,768,769,5,34,0,0,769,86,1,0,0,0, + 770,771,5,34,0,0,771,772,5,78,0,0,772,773,5,117,0,0,773,774,5,109, + 0,0,774,775,5,101,0,0,775,776,5,114,0,0,776,777,5,105,0,0,777,778, + 5,99,0,0,778,779,5,71,0,0,779,780,5,114,0,0,780,781,5,101,0,0,781, + 782,5,97,0,0,782,783,5,116,0,0,783,784,5,101,0,0,784,785,5,114,0, + 0,785,786,5,84,0,0,786,787,5,104,0,0,787,788,5,97,0,0,788,789,5, + 110,0,0,789,790,5,69,0,0,790,791,5,113,0,0,791,792,5,117,0,0,792, + 793,5,97,0,0,793,794,5,108,0,0,794,795,5,115,0,0,795,796,5,80,0, + 0,796,797,5,97,0,0,797,798,5,116,0,0,798,799,5,104,0,0,799,800,5, + 34,0,0,800,88,1,0,0,0,801,802,5,34,0,0,802,803,5,78,0,0,803,804, + 5,117,0,0,804,805,5,109,0,0,805,806,5,101,0,0,806,807,5,114,0,0, + 807,808,5,105,0,0,808,809,5,99,0,0,809,810,5,76,0,0,810,811,5,101, + 0,0,811,812,5,115,0,0,812,813,5,115,0,0,813,814,5,84,0,0,814,815, + 5,104,0,0,815,816,5,97,0,0,816,817,5,110,0,0,817,818,5,34,0,0,818, + 90,1,0,0,0,819,820,5,34,0,0,820,821,5,78,0,0,821,822,5,117,0,0,822, + 823,5,109,0,0,823,824,5,101,0,0,824,825,5,114,0,0,825,826,5,105, + 0,0,826,827,5,99,0,0,827,828,5,76,0,0,828,829,5,101,0,0,829,830, + 5,115,0,0,830,831,5,115,0,0,831,832,5,84,0,0,832,833,5,104,0,0,833, + 834,5,97,0,0,834,835,5,110,0,0,835,836,5,80,0,0,836,837,5,97,0,0, + 837,838,5,116,0,0,838,839,5,104,0,0,839,840,5,34,0,0,840,92,1,0, + 0,0,841,842,5,34,0,0,842,843,5,78,0,0,843,844,5,117,0,0,844,845, + 5,109,0,0,845,846,5,101,0,0,846,847,5,114,0,0,847,848,5,105,0,0, + 848,849,5,99,0,0,849,850,5,76,0,0,850,851,5,101,0,0,851,852,5,115, + 0,0,852,853,5,115,0,0,853,854,5,84,0,0,854,855,5,104,0,0,855,856, + 5,97,0,0,856,857,5,110,0,0,857,858,5,69,0,0,858,859,5,113,0,0,859, + 860,5,117,0,0,860,861,5,97,0,0,861,862,5,108,0,0,862,863,5,115,0, + 0,863,864,5,34,0,0,864,94,1,0,0,0,865,866,5,34,0,0,866,867,5,78, + 0,0,867,868,5,117,0,0,868,869,5,109,0,0,869,870,5,101,0,0,870,871, + 5,114,0,0,871,872,5,105,0,0,872,873,5,99,0,0,873,874,5,76,0,0,874, + 875,5,101,0,0,875,876,5,115,0,0,876,877,5,115,0,0,877,878,5,84,0, + 0,878,879,5,104,0,0,879,880,5,97,0,0,880,881,5,110,0,0,881,882,5, + 69,0,0,882,883,5,113,0,0,883,884,5,117,0,0,884,885,5,97,0,0,885, + 886,5,108,0,0,886,887,5,115,0,0,887,888,5,80,0,0,888,889,5,97,0, + 0,889,890,5,116,0,0,890,891,5,104,0,0,891,892,5,34,0,0,892,96,1, + 0,0,0,893,894,5,34,0,0,894,895,5,79,0,0,895,896,5,114,0,0,896,897, + 5,34,0,0,897,98,1,0,0,0,898,899,5,34,0,0,899,900,5,83,0,0,900,901, + 5,116,0,0,901,902,5,114,0,0,902,903,5,105,0,0,903,904,5,110,0,0, + 904,905,5,103,0,0,905,906,5,69,0,0,906,907,5,113,0,0,907,908,5,117, + 0,0,908,909,5,97,0,0,909,910,5,108,0,0,910,911,5,115,0,0,911,912, + 5,34,0,0,912,100,1,0,0,0,913,914,5,34,0,0,914,915,5,83,0,0,915,916, + 5,116,0,0,916,917,5,114,0,0,917,918,5,105,0,0,918,919,5,110,0,0, + 919,920,5,103,0,0,920,921,5,69,0,0,921,922,5,113,0,0,922,923,5,117, + 0,0,923,924,5,97,0,0,924,925,5,108,0,0,925,926,5,115,0,0,926,927, + 5,80,0,0,927,928,5,97,0,0,928,929,5,116,0,0,929,930,5,104,0,0,930, + 931,5,34,0,0,931,102,1,0,0,0,932,933,5,34,0,0,933,934,5,83,0,0,934, + 935,5,116,0,0,935,936,5,114,0,0,936,937,5,105,0,0,937,938,5,110, + 0,0,938,939,5,103,0,0,939,940,5,71,0,0,940,941,5,114,0,0,941,942, + 5,101,0,0,942,943,5,97,0,0,943,944,5,116,0,0,944,945,5,101,0,0,945, + 946,5,114,0,0,946,947,5,84,0,0,947,948,5,104,0,0,948,949,5,97,0, + 0,949,950,5,110,0,0,950,951,5,34,0,0,951,104,1,0,0,0,952,953,5,34, + 0,0,953,954,5,83,0,0,954,955,5,116,0,0,955,956,5,114,0,0,956,957, + 5,105,0,0,957,958,5,110,0,0,958,959,5,103,0,0,959,960,5,71,0,0,960, + 961,5,114,0,0,961,962,5,101,0,0,962,963,5,97,0,0,963,964,5,116,0, + 0,964,965,5,101,0,0,965,966,5,114,0,0,966,967,5,84,0,0,967,968,5, + 104,0,0,968,969,5,97,0,0,969,970,5,110,0,0,970,971,5,80,0,0,971, + 972,5,97,0,0,972,973,5,116,0,0,973,974,5,104,0,0,974,975,5,34,0, + 0,975,106,1,0,0,0,976,977,5,34,0,0,977,978,5,83,0,0,978,979,5,116, + 0,0,979,980,5,114,0,0,980,981,5,105,0,0,981,982,5,110,0,0,982,983, + 5,103,0,0,983,984,5,71,0,0,984,985,5,114,0,0,985,986,5,101,0,0,986, + 987,5,97,0,0,987,988,5,116,0,0,988,989,5,101,0,0,989,990,5,114,0, + 0,990,991,5,84,0,0,991,992,5,104,0,0,992,993,5,97,0,0,993,994,5, + 110,0,0,994,995,5,69,0,0,995,996,5,113,0,0,996,997,5,117,0,0,997, + 998,5,97,0,0,998,999,5,108,0,0,999,1000,5,115,0,0,1000,1001,5,34, + 0,0,1001,108,1,0,0,0,1002,1003,5,34,0,0,1003,1004,5,83,0,0,1004, + 1005,5,116,0,0,1005,1006,5,114,0,0,1006,1007,5,105,0,0,1007,1008, + 5,110,0,0,1008,1009,5,103,0,0,1009,1010,5,71,0,0,1010,1011,5,114, + 0,0,1011,1012,5,101,0,0,1012,1013,5,97,0,0,1013,1014,5,116,0,0,1014, + 1015,5,101,0,0,1015,1016,5,114,0,0,1016,1017,5,84,0,0,1017,1018, + 5,104,0,0,1018,1019,5,97,0,0,1019,1020,5,110,0,0,1020,1021,5,69, + 0,0,1021,1022,5,113,0,0,1022,1023,5,117,0,0,1023,1024,5,97,0,0,1024, + 1025,5,108,0,0,1025,1026,5,115,0,0,1026,1027,5,80,0,0,1027,1028, + 5,97,0,0,1028,1029,5,116,0,0,1029,1030,5,104,0,0,1030,1031,5,34, + 0,0,1031,110,1,0,0,0,1032,1033,5,34,0,0,1033,1034,5,83,0,0,1034, + 1035,5,116,0,0,1035,1036,5,114,0,0,1036,1037,5,105,0,0,1037,1038, + 5,110,0,0,1038,1039,5,103,0,0,1039,1040,5,76,0,0,1040,1041,5,101, + 0,0,1041,1042,5,115,0,0,1042,1043,5,115,0,0,1043,1044,5,84,0,0,1044, + 1045,5,104,0,0,1045,1046,5,97,0,0,1046,1047,5,110,0,0,1047,1048, + 5,34,0,0,1048,112,1,0,0,0,1049,1050,5,34,0,0,1050,1051,5,83,0,0, + 1051,1052,5,116,0,0,1052,1053,5,114,0,0,1053,1054,5,105,0,0,1054, + 1055,5,110,0,0,1055,1056,5,103,0,0,1056,1057,5,76,0,0,1057,1058, + 5,101,0,0,1058,1059,5,115,0,0,1059,1060,5,115,0,0,1060,1061,5,84, + 0,0,1061,1062,5,104,0,0,1062,1063,5,97,0,0,1063,1064,5,110,0,0,1064, + 1065,5,80,0,0,1065,1066,5,97,0,0,1066,1067,5,116,0,0,1067,1068,5, + 104,0,0,1068,1069,5,34,0,0,1069,114,1,0,0,0,1070,1071,5,34,0,0,1071, + 1072,5,83,0,0,1072,1073,5,116,0,0,1073,1074,5,114,0,0,1074,1075, + 5,105,0,0,1075,1076,5,110,0,0,1076,1077,5,103,0,0,1077,1078,5,76, + 0,0,1078,1079,5,101,0,0,1079,1080,5,115,0,0,1080,1081,5,115,0,0, + 1081,1082,5,84,0,0,1082,1083,5,104,0,0,1083,1084,5,97,0,0,1084,1085, + 5,110,0,0,1085,1086,5,69,0,0,1086,1087,5,113,0,0,1087,1088,5,117, + 0,0,1088,1089,5,97,0,0,1089,1090,5,108,0,0,1090,1091,5,115,0,0,1091, + 1092,5,34,0,0,1092,116,1,0,0,0,1093,1094,5,34,0,0,1094,1095,5,83, + 0,0,1095,1096,5,116,0,0,1096,1097,5,114,0,0,1097,1098,5,105,0,0, + 1098,1099,5,110,0,0,1099,1100,5,103,0,0,1100,1101,5,76,0,0,1101, + 1102,5,101,0,0,1102,1103,5,115,0,0,1103,1104,5,115,0,0,1104,1105, + 5,84,0,0,1105,1106,5,104,0,0,1106,1107,5,97,0,0,1107,1108,5,110, + 0,0,1108,1109,5,69,0,0,1109,1110,5,113,0,0,1110,1111,5,117,0,0,1111, + 1112,5,97,0,0,1112,1113,5,108,0,0,1113,1114,5,115,0,0,1114,1115, + 5,80,0,0,1115,1116,5,97,0,0,1116,1117,5,116,0,0,1117,1118,5,104, + 0,0,1118,1119,5,34,0,0,1119,118,1,0,0,0,1120,1121,5,34,0,0,1121, + 1122,5,83,0,0,1122,1123,5,116,0,0,1123,1124,5,114,0,0,1124,1125, + 5,105,0,0,1125,1126,5,110,0,0,1126,1127,5,103,0,0,1127,1128,5,77, + 0,0,1128,1129,5,97,0,0,1129,1130,5,116,0,0,1130,1131,5,99,0,0,1131, + 1132,5,104,0,0,1132,1133,5,101,0,0,1133,1134,5,115,0,0,1134,1135, + 5,34,0,0,1135,120,1,0,0,0,1136,1137,5,34,0,0,1137,1138,5,84,0,0, + 1138,1139,5,105,0,0,1139,1140,5,109,0,0,1140,1141,5,101,0,0,1141, + 1142,5,115,0,0,1142,1143,5,116,0,0,1143,1144,5,97,0,0,1144,1145, + 5,109,0,0,1145,1146,5,112,0,0,1146,1147,5,69,0,0,1147,1148,5,113, + 0,0,1148,1149,5,117,0,0,1149,1150,5,97,0,0,1150,1151,5,108,0,0,1151, + 1152,5,115,0,0,1152,1153,5,34,0,0,1153,122,1,0,0,0,1154,1155,5,34, + 0,0,1155,1156,5,84,0,0,1156,1157,5,105,0,0,1157,1158,5,109,0,0,1158, + 1159,5,101,0,0,1159,1160,5,115,0,0,1160,1161,5,116,0,0,1161,1162, + 5,97,0,0,1162,1163,5,109,0,0,1163,1164,5,112,0,0,1164,1165,5,69, + 0,0,1165,1166,5,113,0,0,1166,1167,5,117,0,0,1167,1168,5,97,0,0,1168, + 1169,5,108,0,0,1169,1170,5,115,0,0,1170,1171,5,80,0,0,1171,1172, + 5,97,0,0,1172,1173,5,116,0,0,1173,1174,5,104,0,0,1174,1175,5,34, + 0,0,1175,124,1,0,0,0,1176,1177,5,34,0,0,1177,1178,5,84,0,0,1178, + 1179,5,105,0,0,1179,1180,5,109,0,0,1180,1181,5,101,0,0,1181,1182, + 5,115,0,0,1182,1183,5,116,0,0,1183,1184,5,97,0,0,1184,1185,5,109, + 0,0,1185,1186,5,112,0,0,1186,1187,5,71,0,0,1187,1188,5,114,0,0,1188, + 1189,5,101,0,0,1189,1190,5,97,0,0,1190,1191,5,116,0,0,1191,1192, + 5,101,0,0,1192,1193,5,114,0,0,1193,1194,5,84,0,0,1194,1195,5,104, + 0,0,1195,1196,5,97,0,0,1196,1197,5,110,0,0,1197,1198,5,34,0,0,1198, + 126,1,0,0,0,1199,1200,5,34,0,0,1200,1201,5,84,0,0,1201,1202,5,105, + 0,0,1202,1203,5,109,0,0,1203,1204,5,101,0,0,1204,1205,5,115,0,0, + 1205,1206,5,116,0,0,1206,1207,5,97,0,0,1207,1208,5,109,0,0,1208, + 1209,5,112,0,0,1209,1210,5,71,0,0,1210,1211,5,114,0,0,1211,1212, + 5,101,0,0,1212,1213,5,97,0,0,1213,1214,5,116,0,0,1214,1215,5,101, + 0,0,1215,1216,5,114,0,0,1216,1217,5,84,0,0,1217,1218,5,104,0,0,1218, + 1219,5,97,0,0,1219,1220,5,110,0,0,1220,1221,5,80,0,0,1221,1222,5, + 97,0,0,1222,1223,5,116,0,0,1223,1224,5,104,0,0,1224,1225,5,34,0, + 0,1225,128,1,0,0,0,1226,1227,5,34,0,0,1227,1228,5,84,0,0,1228,1229, + 5,105,0,0,1229,1230,5,109,0,0,1230,1231,5,101,0,0,1231,1232,5,115, + 0,0,1232,1233,5,116,0,0,1233,1234,5,97,0,0,1234,1235,5,109,0,0,1235, + 1236,5,112,0,0,1236,1237,5,71,0,0,1237,1238,5,114,0,0,1238,1239, + 5,101,0,0,1239,1240,5,97,0,0,1240,1241,5,116,0,0,1241,1242,5,101, + 0,0,1242,1243,5,114,0,0,1243,1244,5,84,0,0,1244,1245,5,104,0,0,1245, + 1246,5,97,0,0,1246,1247,5,110,0,0,1247,1248,5,69,0,0,1248,1249,5, + 113,0,0,1249,1250,5,117,0,0,1250,1251,5,97,0,0,1251,1252,5,108,0, + 0,1252,1253,5,115,0,0,1253,1254,5,34,0,0,1254,130,1,0,0,0,1255,1256, + 5,34,0,0,1256,1257,5,84,0,0,1257,1258,5,105,0,0,1258,1259,5,109, + 0,0,1259,1260,5,101,0,0,1260,1261,5,115,0,0,1261,1262,5,116,0,0, + 1262,1263,5,97,0,0,1263,1264,5,109,0,0,1264,1265,5,112,0,0,1265, + 1266,5,71,0,0,1266,1267,5,114,0,0,1267,1268,5,101,0,0,1268,1269, + 5,97,0,0,1269,1270,5,116,0,0,1270,1271,5,101,0,0,1271,1272,5,114, + 0,0,1272,1273,5,84,0,0,1273,1274,5,104,0,0,1274,1275,5,97,0,0,1275, + 1276,5,110,0,0,1276,1277,5,69,0,0,1277,1278,5,113,0,0,1278,1279, + 5,117,0,0,1279,1280,5,97,0,0,1280,1281,5,108,0,0,1281,1282,5,115, + 0,0,1282,1283,5,80,0,0,1283,1284,5,97,0,0,1284,1285,5,116,0,0,1285, + 1286,5,104,0,0,1286,1287,5,34,0,0,1287,132,1,0,0,0,1288,1289,5,34, + 0,0,1289,1290,5,84,0,0,1290,1291,5,105,0,0,1291,1292,5,109,0,0,1292, + 1293,5,101,0,0,1293,1294,5,115,0,0,1294,1295,5,116,0,0,1295,1296, + 5,97,0,0,1296,1297,5,109,0,0,1297,1298,5,112,0,0,1298,1299,5,76, + 0,0,1299,1300,5,101,0,0,1300,1301,5,115,0,0,1301,1302,5,115,0,0, + 1302,1303,5,84,0,0,1303,1304,5,104,0,0,1304,1305,5,97,0,0,1305,1306, + 5,110,0,0,1306,1307,5,34,0,0,1307,134,1,0,0,0,1308,1309,5,34,0,0, + 1309,1310,5,84,0,0,1310,1311,5,105,0,0,1311,1312,5,109,0,0,1312, + 1313,5,101,0,0,1313,1314,5,115,0,0,1314,1315,5,116,0,0,1315,1316, + 5,97,0,0,1316,1317,5,109,0,0,1317,1318,5,112,0,0,1318,1319,5,76, + 0,0,1319,1320,5,101,0,0,1320,1321,5,115,0,0,1321,1322,5,115,0,0, + 1322,1323,5,84,0,0,1323,1324,5,104,0,0,1324,1325,5,97,0,0,1325,1326, + 5,110,0,0,1326,1327,5,80,0,0,1327,1328,5,97,0,0,1328,1329,5,116, + 0,0,1329,1330,5,104,0,0,1330,1331,5,34,0,0,1331,136,1,0,0,0,1332, + 1333,5,34,0,0,1333,1334,5,84,0,0,1334,1335,5,105,0,0,1335,1336,5, + 109,0,0,1336,1337,5,101,0,0,1337,1338,5,115,0,0,1338,1339,5,116, + 0,0,1339,1340,5,97,0,0,1340,1341,5,109,0,0,1341,1342,5,112,0,0,1342, + 1343,5,76,0,0,1343,1344,5,101,0,0,1344,1345,5,115,0,0,1345,1346, + 5,115,0,0,1346,1347,5,84,0,0,1347,1348,5,104,0,0,1348,1349,5,97, + 0,0,1349,1350,5,110,0,0,1350,1351,5,69,0,0,1351,1352,5,113,0,0,1352, + 1353,5,117,0,0,1353,1354,5,97,0,0,1354,1355,5,108,0,0,1355,1356, + 5,115,0,0,1356,1357,5,34,0,0,1357,138,1,0,0,0,1358,1359,5,34,0,0, + 1359,1360,5,84,0,0,1360,1361,5,105,0,0,1361,1362,5,109,0,0,1362, + 1363,5,101,0,0,1363,1364,5,115,0,0,1364,1365,5,116,0,0,1365,1366, + 5,97,0,0,1366,1367,5,109,0,0,1367,1368,5,112,0,0,1368,1369,5,76, + 0,0,1369,1370,5,101,0,0,1370,1371,5,115,0,0,1371,1372,5,115,0,0, + 1372,1373,5,84,0,0,1373,1374,5,104,0,0,1374,1375,5,97,0,0,1375,1376, + 5,110,0,0,1376,1377,5,69,0,0,1377,1378,5,113,0,0,1378,1379,5,117, + 0,0,1379,1380,5,97,0,0,1380,1381,5,108,0,0,1381,1382,5,115,0,0,1382, + 1383,5,80,0,0,1383,1384,5,97,0,0,1384,1385,5,116,0,0,1385,1386,5, + 104,0,0,1386,1387,5,34,0,0,1387,140,1,0,0,0,1388,1389,5,34,0,0,1389, + 1390,5,83,0,0,1390,1391,5,101,0,0,1391,1392,5,99,0,0,1392,1393,5, + 111,0,0,1393,1394,5,110,0,0,1394,1395,5,100,0,0,1395,1396,5,115, + 0,0,1396,1397,5,80,0,0,1397,1398,5,97,0,0,1398,1399,5,116,0,0,1399, + 1400,5,104,0,0,1400,1401,5,34,0,0,1401,142,1,0,0,0,1402,1403,5,34, + 0,0,1403,1404,5,83,0,0,1404,1405,5,101,0,0,1405,1406,5,99,0,0,1406, + 1407,5,111,0,0,1407,1408,5,110,0,0,1408,1409,5,100,0,0,1409,1410, + 5,115,0,0,1410,1411,5,34,0,0,1411,144,1,0,0,0,1412,1413,5,34,0,0, + 1413,1414,5,84,0,0,1414,1415,5,105,0,0,1415,1416,5,109,0,0,1416, + 1417,5,101,0,0,1417,1418,5,115,0,0,1418,1419,5,116,0,0,1419,1420, + 5,97,0,0,1420,1421,5,109,0,0,1421,1422,5,112,0,0,1422,1423,5,80, + 0,0,1423,1424,5,97,0,0,1424,1425,5,116,0,0,1425,1426,5,104,0,0,1426, + 1427,5,34,0,0,1427,146,1,0,0,0,1428,1429,5,34,0,0,1429,1430,5,84, + 0,0,1430,1431,5,105,0,0,1431,1432,5,109,0,0,1432,1433,5,101,0,0, + 1433,1434,5,115,0,0,1434,1435,5,116,0,0,1435,1436,5,97,0,0,1436, + 1437,5,109,0,0,1437,1438,5,112,0,0,1438,1439,5,34,0,0,1439,148,1, + 0,0,0,1440,1441,5,34,0,0,1441,1442,5,84,0,0,1442,1443,5,105,0,0, + 1443,1444,5,109,0,0,1444,1445,5,101,0,0,1445,1446,5,111,0,0,1446, + 1447,5,117,0,0,1447,1448,5,116,0,0,1448,1449,5,83,0,0,1449,1450, + 5,101,0,0,1450,1451,5,99,0,0,1451,1452,5,111,0,0,1452,1453,5,110, + 0,0,1453,1454,5,100,0,0,1454,1455,5,115,0,0,1455,1456,5,34,0,0,1456, + 150,1,0,0,0,1457,1458,5,34,0,0,1458,1459,5,84,0,0,1459,1460,5,105, + 0,0,1460,1461,5,109,0,0,1461,1462,5,101,0,0,1462,1463,5,111,0,0, + 1463,1464,5,117,0,0,1464,1465,5,116,0,0,1465,1466,5,83,0,0,1466, + 1467,5,101,0,0,1467,1468,5,99,0,0,1468,1469,5,111,0,0,1469,1470, + 5,110,0,0,1470,1471,5,100,0,0,1471,1472,5,115,0,0,1472,1473,5,80, + 0,0,1473,1474,5,97,0,0,1474,1475,5,116,0,0,1475,1476,5,104,0,0,1476, + 1477,5,34,0,0,1477,152,1,0,0,0,1478,1479,5,34,0,0,1479,1480,5,72, + 0,0,1480,1481,5,101,0,0,1481,1482,5,97,0,0,1482,1483,5,114,0,0,1483, + 1484,5,116,0,0,1484,1485,5,98,0,0,1485,1486,5,101,0,0,1486,1487, + 5,97,0,0,1487,1488,5,116,0,0,1488,1489,5,83,0,0,1489,1490,5,101, + 0,0,1490,1491,5,99,0,0,1491,1492,5,111,0,0,1492,1493,5,110,0,0,1493, + 1494,5,100,0,0,1494,1495,5,115,0,0,1495,1496,5,34,0,0,1496,154,1, + 0,0,0,1497,1498,5,34,0,0,1498,1499,5,72,0,0,1499,1500,5,101,0,0, + 1500,1501,5,97,0,0,1501,1502,5,114,0,0,1502,1503,5,116,0,0,1503, + 1504,5,98,0,0,1504,1505,5,101,0,0,1505,1506,5,97,0,0,1506,1507,5, + 116,0,0,1507,1508,5,83,0,0,1508,1509,5,101,0,0,1509,1510,5,99,0, + 0,1510,1511,5,111,0,0,1511,1512,5,110,0,0,1512,1513,5,100,0,0,1513, + 1514,5,115,0,0,1514,1515,5,80,0,0,1515,1516,5,97,0,0,1516,1517,5, + 116,0,0,1517,1518,5,104,0,0,1518,1519,5,34,0,0,1519,156,1,0,0,0, + 1520,1521,5,34,0,0,1521,1522,5,80,0,0,1522,1523,5,114,0,0,1523,1524, + 5,111,0,0,1524,1525,5,99,0,0,1525,1526,5,101,0,0,1526,1527,5,115, + 0,0,1527,1528,5,115,0,0,1528,1529,5,111,0,0,1529,1530,5,114,0,0, + 1530,1531,5,67,0,0,1531,1532,5,111,0,0,1532,1533,5,110,0,0,1533, + 1534,5,102,0,0,1534,1535,5,105,0,0,1535,1536,5,103,0,0,1536,1537, + 5,34,0,0,1537,158,1,0,0,0,1538,1539,5,34,0,0,1539,1540,5,77,0,0, + 1540,1541,5,111,0,0,1541,1542,5,100,0,0,1542,1543,5,101,0,0,1543, + 1544,5,34,0,0,1544,160,1,0,0,0,1545,1546,5,34,0,0,1546,1547,5,73, + 0,0,1547,1548,5,78,0,0,1548,1549,5,76,0,0,1549,1550,5,73,0,0,1550, + 1551,5,78,0,0,1551,1552,5,69,0,0,1552,1553,5,34,0,0,1553,162,1,0, + 0,0,1554,1555,5,34,0,0,1555,1556,5,68,0,0,1556,1557,5,73,0,0,1557, + 1558,5,83,0,0,1558,1559,5,84,0,0,1559,1560,5,82,0,0,1560,1561,5, + 73,0,0,1561,1562,5,66,0,0,1562,1563,5,85,0,0,1563,1564,5,84,0,0, + 1564,1565,5,69,0,0,1565,1566,5,68,0,0,1566,1567,5,34,0,0,1567,164, + 1,0,0,0,1568,1569,5,34,0,0,1569,1570,5,69,0,0,1570,1571,5,120,0, + 0,1571,1572,5,101,0,0,1572,1573,5,99,0,0,1573,1574,5,117,0,0,1574, + 1575,5,116,0,0,1575,1576,5,105,0,0,1576,1577,5,111,0,0,1577,1578, + 5,110,0,0,1578,1579,5,84,0,0,1579,1580,5,121,0,0,1580,1581,5,112, + 0,0,1581,1582,5,101,0,0,1582,1583,5,34,0,0,1583,166,1,0,0,0,1584, + 1585,5,34,0,0,1585,1586,5,83,0,0,1586,1587,5,84,0,0,1587,1588,5, + 65,0,0,1588,1589,5,78,0,0,1589,1590,5,68,0,0,1590,1591,5,65,0,0, + 1591,1592,5,82,0,0,1592,1593,5,68,0,0,1593,1594,5,34,0,0,1594,168, + 1,0,0,0,1595,1596,5,34,0,0,1596,1597,5,73,0,0,1597,1598,5,116,0, + 0,1598,1599,5,101,0,0,1599,1600,5,109,0,0,1600,1601,5,80,0,0,1601, + 1602,5,114,0,0,1602,1603,5,111,0,0,1603,1604,5,99,0,0,1604,1605, + 5,101,0,0,1605,1606,5,115,0,0,1606,1607,5,115,0,0,1607,1608,5,111, + 0,0,1608,1609,5,114,0,0,1609,1610,5,34,0,0,1610,170,1,0,0,0,1611, + 1612,5,34,0,0,1612,1613,5,73,0,0,1613,1614,5,116,0,0,1614,1615,5, + 101,0,0,1615,1616,5,114,0,0,1616,1617,5,97,0,0,1617,1618,5,116,0, + 0,1618,1619,5,111,0,0,1619,1620,5,114,0,0,1620,1621,5,34,0,0,1621, + 172,1,0,0,0,1622,1623,5,34,0,0,1623,1624,5,73,0,0,1624,1625,5,116, + 0,0,1625,1626,5,101,0,0,1626,1627,5,109,0,0,1627,1628,5,83,0,0,1628, + 1629,5,101,0,0,1629,1630,5,108,0,0,1630,1631,5,101,0,0,1631,1632, + 5,99,0,0,1632,1633,5,116,0,0,1633,1634,5,111,0,0,1634,1635,5,114, + 0,0,1635,1636,5,34,0,0,1636,174,1,0,0,0,1637,1638,5,34,0,0,1638, + 1639,5,77,0,0,1639,1640,5,97,0,0,1640,1641,5,120,0,0,1641,1642,5, + 67,0,0,1642,1643,5,111,0,0,1643,1644,5,110,0,0,1644,1645,5,99,0, + 0,1645,1646,5,117,0,0,1646,1647,5,114,0,0,1647,1648,5,114,0,0,1648, + 1649,5,101,0,0,1649,1650,5,110,0,0,1650,1651,5,99,0,0,1651,1652, + 5,121,0,0,1652,1653,5,80,0,0,1653,1654,5,97,0,0,1654,1655,5,116, + 0,0,1655,1656,5,104,0,0,1656,1657,5,34,0,0,1657,176,1,0,0,0,1658, + 1659,5,34,0,0,1659,1660,5,77,0,0,1660,1661,5,97,0,0,1661,1662,5, + 120,0,0,1662,1663,5,67,0,0,1663,1664,5,111,0,0,1664,1665,5,110,0, + 0,1665,1666,5,99,0,0,1666,1667,5,117,0,0,1667,1668,5,114,0,0,1668, + 1669,5,114,0,0,1669,1670,5,101,0,0,1670,1671,5,110,0,0,1671,1672, + 5,99,0,0,1672,1673,5,121,0,0,1673,1674,5,34,0,0,1674,178,1,0,0,0, + 1675,1676,5,34,0,0,1676,1677,5,82,0,0,1677,1678,5,101,0,0,1678,1679, + 5,115,0,0,1679,1680,5,111,0,0,1680,1681,5,117,0,0,1681,1682,5,114, + 0,0,1682,1683,5,99,0,0,1683,1684,5,101,0,0,1684,1685,5,34,0,0,1685, + 180,1,0,0,0,1686,1687,5,34,0,0,1687,1688,5,73,0,0,1688,1689,5,110, + 0,0,1689,1690,5,112,0,0,1690,1691,5,117,0,0,1691,1692,5,116,0,0, + 1692,1693,5,80,0,0,1693,1694,5,97,0,0,1694,1695,5,116,0,0,1695,1696, + 5,104,0,0,1696,1697,5,34,0,0,1697,182,1,0,0,0,1698,1699,5,34,0,0, + 1699,1700,5,79,0,0,1700,1701,5,117,0,0,1701,1702,5,116,0,0,1702, + 1703,5,112,0,0,1703,1704,5,117,0,0,1704,1705,5,116,0,0,1705,1706, + 5,80,0,0,1706,1707,5,97,0,0,1707,1708,5,116,0,0,1708,1709,5,104, + 0,0,1709,1710,5,34,0,0,1710,184,1,0,0,0,1711,1712,5,34,0,0,1712, + 1713,5,73,0,0,1713,1714,5,116,0,0,1714,1715,5,101,0,0,1715,1716, + 5,109,0,0,1716,1717,5,115,0,0,1717,1718,5,34,0,0,1718,186,1,0,0, + 0,1719,1720,5,34,0,0,1720,1721,5,73,0,0,1721,1722,5,116,0,0,1722, + 1723,5,101,0,0,1723,1724,5,109,0,0,1724,1725,5,115,0,0,1725,1726, + 5,80,0,0,1726,1727,5,97,0,0,1727,1728,5,116,0,0,1728,1729,5,104, + 0,0,1729,1730,5,34,0,0,1730,188,1,0,0,0,1731,1732,5,34,0,0,1732, + 1733,5,82,0,0,1733,1734,5,101,0,0,1734,1735,5,115,0,0,1735,1736, + 5,117,0,0,1736,1737,5,108,0,0,1737,1738,5,116,0,0,1738,1739,5,80, + 0,0,1739,1740,5,97,0,0,1740,1741,5,116,0,0,1741,1742,5,104,0,0,1742, + 1743,5,34,0,0,1743,190,1,0,0,0,1744,1745,5,34,0,0,1745,1746,5,82, + 0,0,1746,1747,5,101,0,0,1747,1748,5,115,0,0,1748,1749,5,117,0,0, + 1749,1750,5,108,0,0,1750,1751,5,116,0,0,1751,1752,5,34,0,0,1752, + 192,1,0,0,0,1753,1754,5,34,0,0,1754,1755,5,80,0,0,1755,1756,5,97, + 0,0,1756,1757,5,114,0,0,1757,1758,5,97,0,0,1758,1759,5,109,0,0,1759, + 1760,5,101,0,0,1760,1761,5,116,0,0,1761,1762,5,101,0,0,1762,1763, + 5,114,0,0,1763,1764,5,115,0,0,1764,1765,5,34,0,0,1765,194,1,0,0, + 0,1766,1767,5,34,0,0,1767,1768,5,67,0,0,1768,1769,5,114,0,0,1769, + 1770,5,101,0,0,1770,1771,5,100,0,0,1771,1772,5,101,0,0,1772,1773, + 5,110,0,0,1773,1774,5,116,0,0,1774,1775,5,105,0,0,1775,1776,5,97, + 0,0,1776,1777,5,108,0,0,1777,1778,5,115,0,0,1778,1779,5,34,0,0,1779, + 196,1,0,0,0,1780,1781,5,34,0,0,1781,1782,5,82,0,0,1782,1783,5,111, + 0,0,1783,1784,5,108,0,0,1784,1785,5,101,0,0,1785,1786,5,65,0,0,1786, + 1787,5,114,0,0,1787,1788,5,110,0,0,1788,1789,5,34,0,0,1789,198,1, + 0,0,0,1790,1791,5,34,0,0,1791,1792,5,82,0,0,1792,1793,5,111,0,0, + 1793,1794,5,108,0,0,1794,1795,5,101,0,0,1795,1796,5,65,0,0,1796, + 1797,5,114,0,0,1797,1798,5,110,0,0,1798,1799,5,46,0,0,1799,1800, + 5,36,0,0,1800,1801,5,34,0,0,1801,200,1,0,0,0,1802,1803,5,34,0,0, + 1803,1804,5,82,0,0,1804,1805,5,101,0,0,1805,1806,5,115,0,0,1806, + 1807,5,117,0,0,1807,1808,5,108,0,0,1808,1809,5,116,0,0,1809,1810, + 5,83,0,0,1810,1811,5,101,0,0,1811,1812,5,108,0,0,1812,1813,5,101, + 0,0,1813,1814,5,99,0,0,1814,1815,5,116,0,0,1815,1816,5,111,0,0,1816, + 1817,5,114,0,0,1817,1818,5,34,0,0,1818,202,1,0,0,0,1819,1820,5,34, + 0,0,1820,1821,5,73,0,0,1821,1822,5,116,0,0,1822,1823,5,101,0,0,1823, + 1824,5,109,0,0,1824,1825,5,82,0,0,1825,1826,5,101,0,0,1826,1827, + 5,97,0,0,1827,1828,5,100,0,0,1828,1829,5,101,0,0,1829,1830,5,114, + 0,0,1830,1831,5,34,0,0,1831,204,1,0,0,0,1832,1833,5,34,0,0,1833, + 1834,5,82,0,0,1834,1835,5,101,0,0,1835,1836,5,97,0,0,1836,1837,5, + 100,0,0,1837,1838,5,101,0,0,1838,1839,5,114,0,0,1839,1840,5,67,0, + 0,1840,1841,5,111,0,0,1841,1842,5,110,0,0,1842,1843,5,102,0,0,1843, + 1844,5,105,0,0,1844,1845,5,103,0,0,1845,1846,5,34,0,0,1846,206,1, + 0,0,0,1847,1848,5,34,0,0,1848,1849,5,73,0,0,1849,1850,5,110,0,0, + 1850,1851,5,112,0,0,1851,1852,5,117,0,0,1852,1853,5,116,0,0,1853, + 1854,5,84,0,0,1854,1855,5,121,0,0,1855,1856,5,112,0,0,1856,1857, + 5,101,0,0,1857,1858,5,34,0,0,1858,208,1,0,0,0,1859,1860,5,34,0,0, + 1860,1861,5,67,0,0,1861,1862,5,83,0,0,1862,1863,5,86,0,0,1863,1864, + 5,72,0,0,1864,1865,5,101,0,0,1865,1866,5,97,0,0,1866,1867,5,100, + 0,0,1867,1868,5,101,0,0,1868,1869,5,114,0,0,1869,1870,5,76,0,0,1870, + 1871,5,111,0,0,1871,1872,5,99,0,0,1872,1873,5,97,0,0,1873,1874,5, + 116,0,0,1874,1875,5,105,0,0,1875,1876,5,111,0,0,1876,1877,5,110, + 0,0,1877,1878,5,34,0,0,1878,210,1,0,0,0,1879,1880,5,34,0,0,1880, + 1881,5,67,0,0,1881,1882,5,83,0,0,1882,1883,5,86,0,0,1883,1884,5, + 72,0,0,1884,1885,5,101,0,0,1885,1886,5,97,0,0,1886,1887,5,100,0, + 0,1887,1888,5,101,0,0,1888,1889,5,114,0,0,1889,1890,5,115,0,0,1890, + 1891,5,34,0,0,1891,212,1,0,0,0,1892,1893,5,34,0,0,1893,1894,5,77, + 0,0,1894,1895,5,97,0,0,1895,1896,5,120,0,0,1896,1897,5,73,0,0,1897, + 1898,5,116,0,0,1898,1899,5,101,0,0,1899,1900,5,109,0,0,1900,1901, + 5,115,0,0,1901,1902,5,34,0,0,1902,214,1,0,0,0,1903,1904,5,34,0,0, + 1904,1905,5,77,0,0,1905,1906,5,97,0,0,1906,1907,5,120,0,0,1907,1908, + 5,73,0,0,1908,1909,5,116,0,0,1909,1910,5,101,0,0,1910,1911,5,109, + 0,0,1911,1912,5,115,0,0,1912,1913,5,80,0,0,1913,1914,5,97,0,0,1914, + 1915,5,116,0,0,1915,1916,5,104,0,0,1916,1917,5,34,0,0,1917,216,1, + 0,0,0,1918,1919,5,34,0,0,1919,1920,5,84,0,0,1920,1921,5,111,0,0, + 1921,1922,5,108,0,0,1922,1923,5,101,0,0,1923,1924,5,114,0,0,1924, + 1925,5,97,0,0,1925,1926,5,116,0,0,1926,1927,5,101,0,0,1927,1928, + 5,100,0,0,1928,1929,5,70,0,0,1929,1930,5,97,0,0,1930,1931,5,105, + 0,0,1931,1932,5,108,0,0,1932,1933,5,117,0,0,1933,1934,5,114,0,0, + 1934,1935,5,101,0,0,1935,1936,5,67,0,0,1936,1937,5,111,0,0,1937, + 1938,5,117,0,0,1938,1939,5,110,0,0,1939,1940,5,116,0,0,1940,1941, + 5,34,0,0,1941,218,1,0,0,0,1942,1943,5,34,0,0,1943,1944,5,84,0,0, + 1944,1945,5,111,0,0,1945,1946,5,108,0,0,1946,1947,5,101,0,0,1947, + 1948,5,114,0,0,1948,1949,5,97,0,0,1949,1950,5,116,0,0,1950,1951, + 5,101,0,0,1951,1952,5,100,0,0,1952,1953,5,70,0,0,1953,1954,5,97, + 0,0,1954,1955,5,105,0,0,1955,1956,5,108,0,0,1956,1957,5,117,0,0, + 1957,1958,5,114,0,0,1958,1959,5,101,0,0,1959,1960,5,67,0,0,1960, + 1961,5,111,0,0,1961,1962,5,117,0,0,1962,1963,5,110,0,0,1963,1964, + 5,116,0,0,1964,1965,5,80,0,0,1965,1966,5,97,0,0,1966,1967,5,116, + 0,0,1967,1968,5,104,0,0,1968,1969,5,34,0,0,1969,220,1,0,0,0,1970, + 1971,5,34,0,0,1971,1972,5,84,0,0,1972,1973,5,111,0,0,1973,1974,5, + 108,0,0,1974,1975,5,101,0,0,1975,1976,5,114,0,0,1976,1977,5,97,0, + 0,1977,1978,5,116,0,0,1978,1979,5,101,0,0,1979,1980,5,100,0,0,1980, + 1981,5,70,0,0,1981,1982,5,97,0,0,1982,1983,5,105,0,0,1983,1984,5, + 108,0,0,1984,1985,5,117,0,0,1985,1986,5,114,0,0,1986,1987,5,101, + 0,0,1987,1988,5,80,0,0,1988,1989,5,101,0,0,1989,1990,5,114,0,0,1990, + 1991,5,99,0,0,1991,1992,5,101,0,0,1992,1993,5,110,0,0,1993,1994, + 5,116,0,0,1994,1995,5,97,0,0,1995,1996,5,103,0,0,1996,1997,5,101, + 0,0,1997,1998,5,34,0,0,1998,222,1,0,0,0,1999,2000,5,34,0,0,2000, + 2001,5,84,0,0,2001,2002,5,111,0,0,2002,2003,5,108,0,0,2003,2004, + 5,101,0,0,2004,2005,5,114,0,0,2005,2006,5,97,0,0,2006,2007,5,116, + 0,0,2007,2008,5,101,0,0,2008,2009,5,100,0,0,2009,2010,5,70,0,0,2010, + 2011,5,97,0,0,2011,2012,5,105,0,0,2012,2013,5,108,0,0,2013,2014, + 5,117,0,0,2014,2015,5,114,0,0,2015,2016,5,101,0,0,2016,2017,5,80, + 0,0,2017,2018,5,101,0,0,2018,2019,5,114,0,0,2019,2020,5,99,0,0,2020, + 2021,5,101,0,0,2021,2022,5,110,0,0,2022,2023,5,116,0,0,2023,2024, + 5,97,0,0,2024,2025,5,103,0,0,2025,2026,5,101,0,0,2026,2027,5,80, + 0,0,2027,2028,5,97,0,0,2028,2029,5,116,0,0,2029,2030,5,104,0,0,2030, + 2031,5,34,0,0,2031,224,1,0,0,0,2032,2033,5,34,0,0,2033,2034,5,76, + 0,0,2034,2035,5,97,0,0,2035,2036,5,98,0,0,2036,2037,5,101,0,0,2037, + 2038,5,108,0,0,2038,2039,5,34,0,0,2039,226,1,0,0,0,2040,2041,5,34, + 0,0,2041,2042,5,82,0,0,2042,2043,5,101,0,0,2043,2044,5,115,0,0,2044, + 2045,5,117,0,0,2045,2046,5,108,0,0,2046,2047,5,116,0,0,2047,2048, + 5,87,0,0,2048,2049,5,114,0,0,2049,2050,5,105,0,0,2050,2051,5,116, + 0,0,2051,2052,5,101,0,0,2052,2053,5,114,0,0,2053,2054,5,34,0,0,2054, + 228,1,0,0,0,2055,2056,5,34,0,0,2056,2057,5,78,0,0,2057,2058,5,101, + 0,0,2058,2059,5,120,0,0,2059,2060,5,116,0,0,2060,2061,5,34,0,0,2061, + 230,1,0,0,0,2062,2063,5,34,0,0,2063,2064,5,69,0,0,2064,2065,5,110, + 0,0,2065,2066,5,100,0,0,2066,2067,5,34,0,0,2067,232,1,0,0,0,2068, + 2069,5,34,0,0,2069,2070,5,67,0,0,2070,2071,5,97,0,0,2071,2072,5, + 117,0,0,2072,2073,5,115,0,0,2073,2074,5,101,0,0,2074,2075,5,34,0, + 0,2075,234,1,0,0,0,2076,2077,5,34,0,0,2077,2078,5,67,0,0,2078,2079, + 5,97,0,0,2079,2080,5,117,0,0,2080,2081,5,115,0,0,2081,2082,5,101, + 0,0,2082,2083,5,80,0,0,2083,2084,5,97,0,0,2084,2085,5,116,0,0,2085, + 2086,5,104,0,0,2086,2087,5,34,0,0,2087,236,1,0,0,0,2088,2089,5,34, + 0,0,2089,2090,5,69,0,0,2090,2091,5,114,0,0,2091,2092,5,114,0,0,2092, + 2093,5,111,0,0,2093,2094,5,114,0,0,2094,2095,5,34,0,0,2095,238,1, + 0,0,0,2096,2097,5,34,0,0,2097,2098,5,69,0,0,2098,2099,5,114,0,0, + 2099,2100,5,114,0,0,2100,2101,5,111,0,0,2101,2102,5,114,0,0,2102, + 2103,5,80,0,0,2103,2104,5,97,0,0,2104,2105,5,116,0,0,2105,2106,5, + 104,0,0,2106,2107,5,34,0,0,2107,240,1,0,0,0,2108,2109,5,34,0,0,2109, + 2110,5,82,0,0,2110,2111,5,101,0,0,2111,2112,5,116,0,0,2112,2113, + 5,114,0,0,2113,2114,5,121,0,0,2114,2115,5,34,0,0,2115,242,1,0,0, + 0,2116,2117,5,34,0,0,2117,2118,5,69,0,0,2118,2119,5,114,0,0,2119, + 2120,5,114,0,0,2120,2121,5,111,0,0,2121,2122,5,114,0,0,2122,2123, + 5,69,0,0,2123,2124,5,113,0,0,2124,2125,5,117,0,0,2125,2126,5,97, + 0,0,2126,2127,5,108,0,0,2127,2128,5,115,0,0,2128,2129,5,34,0,0,2129, + 244,1,0,0,0,2130,2131,5,34,0,0,2131,2132,5,73,0,0,2132,2133,5,110, + 0,0,2133,2134,5,116,0,0,2134,2135,5,101,0,0,2135,2136,5,114,0,0, + 2136,2137,5,118,0,0,2137,2138,5,97,0,0,2138,2139,5,108,0,0,2139, + 2140,5,83,0,0,2140,2141,5,101,0,0,2141,2142,5,99,0,0,2142,2143,5, + 111,0,0,2143,2144,5,110,0,0,2144,2145,5,100,0,0,2145,2146,5,115, + 0,0,2146,2147,5,34,0,0,2147,246,1,0,0,0,2148,2149,5,34,0,0,2149, + 2150,5,77,0,0,2150,2151,5,97,0,0,2151,2152,5,120,0,0,2152,2153,5, + 65,0,0,2153,2154,5,116,0,0,2154,2155,5,116,0,0,2155,2156,5,101,0, + 0,2156,2157,5,109,0,0,2157,2158,5,112,0,0,2158,2159,5,116,0,0,2159, + 2160,5,115,0,0,2160,2161,5,34,0,0,2161,248,1,0,0,0,2162,2163,5,34, + 0,0,2163,2164,5,66,0,0,2164,2165,5,97,0,0,2165,2166,5,99,0,0,2166, + 2167,5,107,0,0,2167,2168,5,111,0,0,2168,2169,5,102,0,0,2169,2170, + 5,102,0,0,2170,2171,5,82,0,0,2171,2172,5,97,0,0,2172,2173,5,116, + 0,0,2173,2174,5,101,0,0,2174,2175,5,34,0,0,2175,250,1,0,0,0,2176, + 2177,5,34,0,0,2177,2178,5,77,0,0,2178,2179,5,97,0,0,2179,2180,5, + 120,0,0,2180,2181,5,68,0,0,2181,2182,5,101,0,0,2182,2183,5,108,0, + 0,2183,2184,5,97,0,0,2184,2185,5,121,0,0,2185,2186,5,83,0,0,2186, + 2187,5,101,0,0,2187,2188,5,99,0,0,2188,2189,5,111,0,0,2189,2190, + 5,110,0,0,2190,2191,5,100,0,0,2191,2192,5,115,0,0,2192,2193,5,34, + 0,0,2193,252,1,0,0,0,2194,2195,5,34,0,0,2195,2196,5,74,0,0,2196, + 2197,5,105,0,0,2197,2198,5,116,0,0,2198,2199,5,116,0,0,2199,2200, + 5,101,0,0,2200,2201,5,114,0,0,2201,2202,5,83,0,0,2202,2203,5,116, + 0,0,2203,2204,5,114,0,0,2204,2205,5,97,0,0,2205,2206,5,116,0,0,2206, + 2207,5,101,0,0,2207,2208,5,103,0,0,2208,2209,5,121,0,0,2209,2210, + 5,34,0,0,2210,254,1,0,0,0,2211,2212,5,34,0,0,2212,2213,5,70,0,0, + 2213,2214,5,85,0,0,2214,2215,5,76,0,0,2215,2216,5,76,0,0,2216,2217, + 5,34,0,0,2217,256,1,0,0,0,2218,2219,5,34,0,0,2219,2220,5,78,0,0, + 2220,2221,5,79,0,0,2221,2222,5,78,0,0,2222,2223,5,69,0,0,2223,2224, + 5,34,0,0,2224,258,1,0,0,0,2225,2226,5,34,0,0,2226,2227,5,67,0,0, + 2227,2228,5,97,0,0,2228,2229,5,116,0,0,2229,2230,5,99,0,0,2230,2231, + 5,104,0,0,2231,2232,5,34,0,0,2232,260,1,0,0,0,2233,2234,5,34,0,0, + 2234,2235,5,81,0,0,2235,2236,5,117,0,0,2236,2237,5,101,0,0,2237, + 2238,5,114,0,0,2238,2239,5,121,0,0,2239,2240,5,76,0,0,2240,2241, + 5,97,0,0,2241,2242,5,110,0,0,2242,2243,5,103,0,0,2243,2244,5,117, + 0,0,2244,2245,5,97,0,0,2245,2246,5,103,0,0,2246,2247,5,101,0,0,2247, + 2248,5,34,0,0,2248,262,1,0,0,0,2249,2250,5,34,0,0,2250,2251,5,74, + 0,0,2251,2252,5,83,0,0,2252,2253,5,79,0,0,2253,2254,5,78,0,0,2254, + 2255,5,80,0,0,2255,2256,5,97,0,0,2256,2257,5,116,0,0,2257,2258,5, + 104,0,0,2258,2259,5,34,0,0,2259,264,1,0,0,0,2260,2261,5,34,0,0,2261, + 2262,5,74,0,0,2262,2263,5,83,0,0,2263,2264,5,79,0,0,2264,2265,5, + 78,0,0,2265,2266,5,97,0,0,2266,2267,5,116,0,0,2267,2268,5,97,0,0, + 2268,2269,5,34,0,0,2269,266,1,0,0,0,2270,2271,5,34,0,0,2271,2272, + 5,65,0,0,2272,2273,5,115,0,0,2273,2274,5,115,0,0,2274,2275,5,105, + 0,0,2275,2276,5,103,0,0,2276,2277,5,110,0,0,2277,2278,5,34,0,0,2278, + 268,1,0,0,0,2279,2280,5,34,0,0,2280,2281,5,79,0,0,2281,2282,5,117, + 0,0,2282,2283,5,116,0,0,2283,2284,5,112,0,0,2284,2285,5,117,0,0, + 2285,2286,5,116,0,0,2286,2287,5,34,0,0,2287,270,1,0,0,0,2288,2289, + 5,34,0,0,2289,2290,5,65,0,0,2290,2291,5,114,0,0,2291,2292,5,103, + 0,0,2292,2293,5,117,0,0,2293,2294,5,109,0,0,2294,2295,5,101,0,0, + 2295,2296,5,110,0,0,2296,2297,5,116,0,0,2297,2298,5,115,0,0,2298, + 2299,5,34,0,0,2299,272,1,0,0,0,2300,2301,5,34,0,0,2301,2302,5,83, + 0,0,2302,2303,5,116,0,0,2303,2304,5,97,0,0,2304,2305,5,116,0,0,2305, + 2306,5,101,0,0,2306,2307,5,115,0,0,2307,2308,5,46,0,0,2308,2309, + 5,65,0,0,2309,2310,5,76,0,0,2310,2311,5,76,0,0,2311,2312,5,34,0, + 0,2312,274,1,0,0,0,2313,2314,5,34,0,0,2314,2315,5,83,0,0,2315,2316, + 5,116,0,0,2316,2317,5,97,0,0,2317,2318,5,116,0,0,2318,2319,5,101, + 0,0,2319,2320,5,115,0,0,2320,2321,5,46,0,0,2321,2322,5,68,0,0,2322, + 2323,5,97,0,0,2323,2324,5,116,0,0,2324,2325,5,97,0,0,2325,2326,5, + 76,0,0,2326,2327,5,105,0,0,2327,2328,5,109,0,0,2328,2329,5,105,0, + 0,2329,2330,5,116,0,0,2330,2331,5,69,0,0,2331,2332,5,120,0,0,2332, + 2333,5,99,0,0,2333,2334,5,101,0,0,2334,2335,5,101,0,0,2335,2336, + 5,100,0,0,2336,2337,5,101,0,0,2337,2338,5,100,0,0,2338,2339,5,34, + 0,0,2339,276,1,0,0,0,2340,2341,5,34,0,0,2341,2342,5,83,0,0,2342, + 2343,5,116,0,0,2343,2344,5,97,0,0,2344,2345,5,116,0,0,2345,2346, + 5,101,0,0,2346,2347,5,115,0,0,2347,2348,5,46,0,0,2348,2349,5,72, + 0,0,2349,2350,5,101,0,0,2350,2351,5,97,0,0,2351,2352,5,114,0,0,2352, + 2353,5,116,0,0,2353,2354,5,98,0,0,2354,2355,5,101,0,0,2355,2356, + 5,97,0,0,2356,2357,5,116,0,0,2357,2358,5,84,0,0,2358,2359,5,105, + 0,0,2359,2360,5,109,0,0,2360,2361,5,101,0,0,2361,2362,5,111,0,0, + 2362,2363,5,117,0,0,2363,2364,5,116,0,0,2364,2365,5,34,0,0,2365, + 278,1,0,0,0,2366,2367,5,34,0,0,2367,2368,5,83,0,0,2368,2369,5,116, + 0,0,2369,2370,5,97,0,0,2370,2371,5,116,0,0,2371,2372,5,101,0,0,2372, + 2373,5,115,0,0,2373,2374,5,46,0,0,2374,2375,5,84,0,0,2375,2376,5, + 105,0,0,2376,2377,5,109,0,0,2377,2378,5,101,0,0,2378,2379,5,111, + 0,0,2379,2380,5,117,0,0,2380,2381,5,116,0,0,2381,2382,5,34,0,0,2382, + 280,1,0,0,0,2383,2384,5,34,0,0,2384,2385,5,83,0,0,2385,2386,5,116, + 0,0,2386,2387,5,97,0,0,2387,2388,5,116,0,0,2388,2389,5,101,0,0,2389, + 2390,5,115,0,0,2390,2391,5,46,0,0,2391,2392,5,84,0,0,2392,2393,5, + 97,0,0,2393,2394,5,115,0,0,2394,2395,5,107,0,0,2395,2396,5,70,0, + 0,2396,2397,5,97,0,0,2397,2398,5,105,0,0,2398,2399,5,108,0,0,2399, + 2400,5,101,0,0,2400,2401,5,100,0,0,2401,2402,5,34,0,0,2402,282,1, + 0,0,0,2403,2404,5,34,0,0,2404,2405,5,83,0,0,2405,2406,5,116,0,0, + 2406,2407,5,97,0,0,2407,2408,5,116,0,0,2408,2409,5,101,0,0,2409, + 2410,5,115,0,0,2410,2411,5,46,0,0,2411,2412,5,80,0,0,2412,2413,5, + 101,0,0,2413,2414,5,114,0,0,2414,2415,5,109,0,0,2415,2416,5,105, + 0,0,2416,2417,5,115,0,0,2417,2418,5,115,0,0,2418,2419,5,105,0,0, + 2419,2420,5,111,0,0,2420,2421,5,110,0,0,2421,2422,5,115,0,0,2422, + 2423,5,34,0,0,2423,284,1,0,0,0,2424,2425,5,34,0,0,2425,2426,5,83, + 0,0,2426,2427,5,116,0,0,2427,2428,5,97,0,0,2428,2429,5,116,0,0,2429, + 2430,5,101,0,0,2430,2431,5,115,0,0,2431,2432,5,46,0,0,2432,2433, + 5,82,0,0,2433,2434,5,101,0,0,2434,2435,5,115,0,0,2435,2436,5,117, + 0,0,2436,2437,5,108,0,0,2437,2438,5,116,0,0,2438,2439,5,80,0,0,2439, + 2440,5,97,0,0,2440,2441,5,116,0,0,2441,2442,5,104,0,0,2442,2443, + 5,77,0,0,2443,2444,5,97,0,0,2444,2445,5,116,0,0,2445,2446,5,99,0, + 0,2446,2447,5,104,0,0,2447,2448,5,70,0,0,2448,2449,5,97,0,0,2449, + 2450,5,105,0,0,2450,2451,5,108,0,0,2451,2452,5,117,0,0,2452,2453, + 5,114,0,0,2453,2454,5,101,0,0,2454,2455,5,34,0,0,2455,286,1,0,0, + 0,2456,2457,5,34,0,0,2457,2458,5,83,0,0,2458,2459,5,116,0,0,2459, + 2460,5,97,0,0,2460,2461,5,116,0,0,2461,2462,5,101,0,0,2462,2463, + 5,115,0,0,2463,2464,5,46,0,0,2464,2465,5,80,0,0,2465,2466,5,97,0, + 0,2466,2467,5,114,0,0,2467,2468,5,97,0,0,2468,2469,5,109,0,0,2469, + 2470,5,101,0,0,2470,2471,5,116,0,0,2471,2472,5,101,0,0,2472,2473, + 5,114,0,0,2473,2474,5,80,0,0,2474,2475,5,97,0,0,2475,2476,5,116, + 0,0,2476,2477,5,104,0,0,2477,2478,5,70,0,0,2478,2479,5,97,0,0,2479, + 2480,5,105,0,0,2480,2481,5,108,0,0,2481,2482,5,117,0,0,2482,2483, + 5,114,0,0,2483,2484,5,101,0,0,2484,2485,5,34,0,0,2485,288,1,0,0, + 0,2486,2487,5,34,0,0,2487,2488,5,83,0,0,2488,2489,5,116,0,0,2489, + 2490,5,97,0,0,2490,2491,5,116,0,0,2491,2492,5,101,0,0,2492,2493, + 5,115,0,0,2493,2494,5,46,0,0,2494,2495,5,66,0,0,2495,2496,5,114, + 0,0,2496,2497,5,97,0,0,2497,2498,5,110,0,0,2498,2499,5,99,0,0,2499, + 2500,5,104,0,0,2500,2501,5,70,0,0,2501,2502,5,97,0,0,2502,2503,5, + 105,0,0,2503,2504,5,108,0,0,2504,2505,5,101,0,0,2505,2506,5,100, + 0,0,2506,2507,5,34,0,0,2507,290,1,0,0,0,2508,2509,5,34,0,0,2509, + 2510,5,83,0,0,2510,2511,5,116,0,0,2511,2512,5,97,0,0,2512,2513,5, + 116,0,0,2513,2514,5,101,0,0,2514,2515,5,115,0,0,2515,2516,5,46,0, + 0,2516,2517,5,78,0,0,2517,2518,5,111,0,0,2518,2519,5,67,0,0,2519, + 2520,5,104,0,0,2520,2521,5,111,0,0,2521,2522,5,105,0,0,2522,2523, + 5,99,0,0,2523,2524,5,101,0,0,2524,2525,5,77,0,0,2525,2526,5,97,0, + 0,2526,2527,5,116,0,0,2527,2528,5,99,0,0,2528,2529,5,104,0,0,2529, + 2530,5,101,0,0,2530,2531,5,100,0,0,2531,2532,5,34,0,0,2532,292,1, + 0,0,0,2533,2534,5,34,0,0,2534,2535,5,83,0,0,2535,2536,5,116,0,0, + 2536,2537,5,97,0,0,2537,2538,5,116,0,0,2538,2539,5,101,0,0,2539, + 2540,5,115,0,0,2540,2541,5,46,0,0,2541,2542,5,73,0,0,2542,2543,5, + 110,0,0,2543,2544,5,116,0,0,2544,2545,5,114,0,0,2545,2546,5,105, + 0,0,2546,2547,5,110,0,0,2547,2548,5,115,0,0,2548,2549,5,105,0,0, + 2549,2550,5,99,0,0,2550,2551,5,70,0,0,2551,2552,5,97,0,0,2552,2553, + 5,105,0,0,2553,2554,5,108,0,0,2554,2555,5,117,0,0,2555,2556,5,114, + 0,0,2556,2557,5,101,0,0,2557,2558,5,34,0,0,2558,294,1,0,0,0,2559, + 2560,5,34,0,0,2560,2561,5,83,0,0,2561,2562,5,116,0,0,2562,2563,5, + 97,0,0,2563,2564,5,116,0,0,2564,2565,5,101,0,0,2565,2566,5,115,0, + 0,2566,2567,5,46,0,0,2567,2568,5,69,0,0,2568,2569,5,120,0,0,2569, + 2570,5,99,0,0,2570,2571,5,101,0,0,2571,2572,5,101,0,0,2572,2573, + 5,100,0,0,2573,2574,5,84,0,0,2574,2575,5,111,0,0,2575,2576,5,108, + 0,0,2576,2577,5,101,0,0,2577,2578,5,114,0,0,2578,2579,5,97,0,0,2579, + 2580,5,116,0,0,2580,2581,5,101,0,0,2581,2582,5,100,0,0,2582,2583, + 5,70,0,0,2583,2584,5,97,0,0,2584,2585,5,105,0,0,2585,2586,5,108, + 0,0,2586,2587,5,117,0,0,2587,2588,5,114,0,0,2588,2589,5,101,0,0, + 2589,2590,5,84,0,0,2590,2591,5,104,0,0,2591,2592,5,114,0,0,2592, + 2593,5,101,0,0,2593,2594,5,115,0,0,2594,2595,5,104,0,0,2595,2596, + 5,111,0,0,2596,2597,5,108,0,0,2597,2598,5,100,0,0,2598,2599,5,34, + 0,0,2599,296,1,0,0,0,2600,2601,5,34,0,0,2601,2602,5,83,0,0,2602, + 2603,5,116,0,0,2603,2604,5,97,0,0,2604,2605,5,116,0,0,2605,2606, + 5,101,0,0,2606,2607,5,115,0,0,2607,2608,5,46,0,0,2608,2609,5,73, + 0,0,2609,2610,5,116,0,0,2610,2611,5,101,0,0,2611,2612,5,109,0,0, + 2612,2613,5,82,0,0,2613,2614,5,101,0,0,2614,2615,5,97,0,0,2615,2616, + 5,100,0,0,2616,2617,5,101,0,0,2617,2618,5,114,0,0,2618,2619,5,70, + 0,0,2619,2620,5,97,0,0,2620,2621,5,105,0,0,2621,2622,5,108,0,0,2622, + 2623,5,101,0,0,2623,2624,5,100,0,0,2624,2625,5,34,0,0,2625,298,1, + 0,0,0,2626,2627,5,34,0,0,2627,2628,5,83,0,0,2628,2629,5,116,0,0, + 2629,2630,5,97,0,0,2630,2631,5,116,0,0,2631,2632,5,101,0,0,2632, + 2633,5,115,0,0,2633,2634,5,46,0,0,2634,2635,5,82,0,0,2635,2636,5, + 101,0,0,2636,2637,5,115,0,0,2637,2638,5,117,0,0,2638,2639,5,108, + 0,0,2639,2640,5,116,0,0,2640,2641,5,87,0,0,2641,2642,5,114,0,0,2642, + 2643,5,105,0,0,2643,2644,5,116,0,0,2644,2645,5,101,0,0,2645,2646, + 5,114,0,0,2646,2647,5,70,0,0,2647,2648,5,97,0,0,2648,2649,5,105, + 0,0,2649,2650,5,108,0,0,2650,2651,5,101,0,0,2651,2652,5,100,0,0, + 2652,2653,5,34,0,0,2653,300,1,0,0,0,2654,2655,5,34,0,0,2655,2656, + 5,83,0,0,2656,2657,5,116,0,0,2657,2658,5,97,0,0,2658,2659,5,116, + 0,0,2659,2660,5,101,0,0,2660,2661,5,115,0,0,2661,2662,5,46,0,0,2662, + 2663,5,81,0,0,2663,2664,5,117,0,0,2664,2665,5,101,0,0,2665,2666, + 5,114,0,0,2666,2667,5,121,0,0,2667,2668,5,69,0,0,2668,2669,5,118, + 0,0,2669,2670,5,97,0,0,2670,2671,5,108,0,0,2671,2672,5,117,0,0,2672, + 2673,5,97,0,0,2673,2674,5,116,0,0,2674,2675,5,105,0,0,2675,2676, + 5,111,0,0,2676,2677,5,110,0,0,2677,2678,5,69,0,0,2678,2679,5,114, + 0,0,2679,2680,5,114,0,0,2680,2681,5,111,0,0,2681,2682,5,114,0,0, + 2682,2683,5,34,0,0,2683,302,1,0,0,0,2684,2685,5,34,0,0,2685,2686, + 5,83,0,0,2686,2687,5,116,0,0,2687,2688,5,97,0,0,2688,2689,5,116, + 0,0,2689,2690,5,101,0,0,2690,2691,5,115,0,0,2691,2692,5,46,0,0,2692, + 2693,5,82,0,0,2693,2694,5,117,0,0,2694,2695,5,110,0,0,2695,2696, + 5,116,0,0,2696,2697,5,105,0,0,2697,2698,5,109,0,0,2698,2699,5,101, + 0,0,2699,2700,5,34,0,0,2700,304,1,0,0,0,2701,2706,5,34,0,0,2702, + 2705,3,319,159,0,2703,2705,3,325,162,0,2704,2702,1,0,0,0,2704,2703, + 1,0,0,0,2705,2708,1,0,0,0,2706,2704,1,0,0,0,2706,2707,1,0,0,0,2707, + 2709,1,0,0,0,2708,2706,1,0,0,0,2709,2710,5,46,0,0,2710,2711,5,36, + 0,0,2711,2712,5,34,0,0,2712,306,1,0,0,0,2713,2714,5,34,0,0,2714, + 2715,5,36,0,0,2715,2716,5,36,0,0,2716,2721,1,0,0,0,2717,2720,3,319, + 159,0,2718,2720,3,325,162,0,2719,2717,1,0,0,0,2719,2718,1,0,0,0, + 2720,2723,1,0,0,0,2721,2719,1,0,0,0,2721,2722,1,0,0,0,2722,2724, + 1,0,0,0,2723,2721,1,0,0,0,2724,2725,5,34,0,0,2725,308,1,0,0,0,2726, + 2727,5,34,0,0,2727,2728,5,36,0,0,2728,2742,5,34,0,0,2729,2730,5, + 34,0,0,2730,2731,5,36,0,0,2731,2732,1,0,0,0,2732,2737,7,0,0,0,2733, + 2736,3,319,159,0,2734,2736,3,325,162,0,2735,2733,1,0,0,0,2735,2734, + 1,0,0,0,2736,2739,1,0,0,0,2737,2735,1,0,0,0,2737,2738,1,0,0,0,2738, + 2740,1,0,0,0,2739,2737,1,0,0,0,2740,2742,5,34,0,0,2741,2726,1,0, + 0,0,2741,2729,1,0,0,0,2742,310,1,0,0,0,2743,2744,5,34,0,0,2744,2745, + 5,36,0,0,2745,2746,1,0,0,0,2746,2751,7,1,0,0,2747,2750,3,319,159, + 0,2748,2750,3,325,162,0,2749,2747,1,0,0,0,2749,2748,1,0,0,0,2750, + 2753,1,0,0,0,2751,2749,1,0,0,0,2751,2752,1,0,0,0,2752,2754,1,0,0, + 0,2753,2751,1,0,0,0,2754,2755,5,34,0,0,2755,312,1,0,0,0,2756,2757, + 5,34,0,0,2757,2758,5,83,0,0,2758,2759,5,116,0,0,2759,2760,5,97,0, + 0,2760,2761,5,116,0,0,2761,2762,5,101,0,0,2762,2763,5,115,0,0,2763, + 2764,5,46,0,0,2764,2767,1,0,0,0,2765,2768,3,319,159,0,2766,2768, + 3,325,162,0,2767,2765,1,0,0,0,2767,2766,1,0,0,0,2768,2769,1,0,0, + 0,2769,2767,1,0,0,0,2769,2770,1,0,0,0,2770,2771,1,0,0,0,2771,2776, + 5,40,0,0,2772,2775,3,319,159,0,2773,2775,3,325,162,0,2774,2772,1, + 0,0,0,2774,2773,1,0,0,0,2775,2778,1,0,0,0,2776,2774,1,0,0,0,2776, + 2777,1,0,0,0,2777,2779,1,0,0,0,2778,2776,1,0,0,0,2779,2780,5,41, + 0,0,2780,2781,5,34,0,0,2781,314,1,0,0,0,2782,2787,3,327,163,0,2783, + 2786,3,319,159,0,2784,2786,3,325,162,0,2785,2783,1,0,0,0,2785,2784, + 1,0,0,0,2786,2789,1,0,0,0,2787,2785,1,0,0,0,2787,2788,1,0,0,0,2788, + 2790,1,0,0,0,2789,2787,1,0,0,0,2790,2791,3,329,164,0,2791,316,1, + 0,0,0,2792,2797,5,34,0,0,2793,2796,3,319,159,0,2794,2796,3,325,162, + 0,2795,2793,1,0,0,0,2795,2794,1,0,0,0,2796,2799,1,0,0,0,2797,2795, + 1,0,0,0,2797,2798,1,0,0,0,2798,2800,1,0,0,0,2799,2797,1,0,0,0,2800, + 2801,5,34,0,0,2801,318,1,0,0,0,2802,2805,5,92,0,0,2803,2806,7,2, + 0,0,2804,2806,3,321,160,0,2805,2803,1,0,0,0,2805,2804,1,0,0,0,2806, + 320,1,0,0,0,2807,2808,5,117,0,0,2808,2809,3,323,161,0,2809,2810, + 3,323,161,0,2810,2811,3,323,161,0,2811,2812,3,323,161,0,2812,322, + 1,0,0,0,2813,2814,7,3,0,0,2814,324,1,0,0,0,2815,2816,8,4,0,0,2816, + 326,1,0,0,0,2817,2818,5,34,0,0,2818,2819,5,123,0,0,2819,2820,5,37, + 0,0,2820,328,1,0,0,0,2821,2822,5,37,0,0,2822,2823,5,125,0,0,2823, + 2824,5,34,0,0,2824,330,1,0,0,0,2825,2834,5,48,0,0,2826,2830,7,5, + 0,0,2827,2829,7,6,0,0,2828,2827,1,0,0,0,2829,2832,1,0,0,0,2830,2828, + 1,0,0,0,2830,2831,1,0,0,0,2831,2834,1,0,0,0,2832,2830,1,0,0,0,2833, + 2825,1,0,0,0,2833,2826,1,0,0,0,2834,332,1,0,0,0,2835,2837,5,45,0, + 0,2836,2835,1,0,0,0,2836,2837,1,0,0,0,2837,2838,1,0,0,0,2838,2845, + 3,331,165,0,2839,2841,5,46,0,0,2840,2842,7,6,0,0,2841,2840,1,0,0, + 0,2842,2843,1,0,0,0,2843,2841,1,0,0,0,2843,2844,1,0,0,0,2844,2846, + 1,0,0,0,2845,2839,1,0,0,0,2845,2846,1,0,0,0,2846,2848,1,0,0,0,2847, + 2849,3,335,167,0,2848,2847,1,0,0,0,2848,2849,1,0,0,0,2849,334,1, + 0,0,0,2850,2852,7,7,0,0,2851,2853,7,8,0,0,2852,2851,1,0,0,0,2852, + 2853,1,0,0,0,2853,2854,1,0,0,0,2854,2855,3,331,165,0,2855,336,1, + 0,0,0,2856,2858,7,9,0,0,2857,2856,1,0,0,0,2858,2859,1,0,0,0,2859, + 2857,1,0,0,0,2859,2860,1,0,0,0,2860,2861,1,0,0,0,2861,2862,6,168, + 0,0,2862,338,1,0,0,0,27,0,2704,2706,2719,2721,2735,2737,2741,2749, + 2751,2767,2769,2774,2776,2785,2787,2795,2797,2805,2830,2833,2836, + 2843,2845,2848,2852,2859,1,6,0,0 ] class ASLLexer(Lexer): @@ -1181,68 +1192,70 @@ class ASLLexer(Lexer): RESULT = 96 PARAMETERS = 97 CREDENTIALS = 98 - RESULTSELECTOR = 99 - ITEMREADER = 100 - READERCONFIG = 101 - INPUTTYPE = 102 - CSVHEADERLOCATION = 103 - CSVHEADERS = 104 - MAXITEMS = 105 - MAXITEMSPATH = 106 - TOLERATEDFAILURECOUNT = 107 - TOLERATEDFAILURECOUNTPATH = 108 - TOLERATEDFAILUREPERCENTAGE = 109 - TOLERATEDFAILUREPERCENTAGEPATH = 110 - LABEL = 111 - RESULTWRITER = 112 - NEXT = 113 - END = 114 - CAUSE = 115 - CAUSEPATH = 116 - ERROR = 117 - ERRORPATH = 118 - RETRY = 119 - ERROREQUALS = 120 - INTERVALSECONDS = 121 - MAXATTEMPTS = 122 - BACKOFFRATE = 123 - MAXDELAYSECONDS = 124 - JITTERSTRATEGY = 125 - FULL = 126 - NONE = 127 - CATCH = 128 - QUERYLANGUAGE = 129 - JSONPATH = 130 - JSONATA = 131 - ASSIGN = 132 - OUTPUT = 133 - ARGUMENTS = 134 - ERRORNAMEStatesALL = 135 - ERRORNAMEStatesDataLimitExceeded = 136 - ERRORNAMEStatesHeartbeatTimeout = 137 - ERRORNAMEStatesTimeout = 138 - ERRORNAMEStatesTaskFailed = 139 - ERRORNAMEStatesPermissions = 140 - ERRORNAMEStatesResultPathMatchFailure = 141 - ERRORNAMEStatesParameterPathFailure = 142 - ERRORNAMEStatesBranchFailed = 143 - ERRORNAMEStatesNoChoiceMatched = 144 - ERRORNAMEStatesIntrinsicFailure = 145 - ERRORNAMEStatesExceedToleratedFailureThreshold = 146 - ERRORNAMEStatesItemReaderFailed = 147 - ERRORNAMEStatesResultWriterFailed = 148 - ERRORNAMEStatesQueryEvaluationError = 149 - ERRORNAMEStatesRuntime = 150 - STRINGDOLLAR = 151 - STRINGPATHCONTEXTOBJ = 152 - STRINGPATH = 153 - STRINGVAR = 154 - STRINGINTRINSICFUNC = 155 - STRINGJSONATA = 156 - STRING = 157 - INT = 158 - NUMBER = 159 - WS = 160 + ROLEARN = 99 + ROLEARNPATH = 100 + RESULTSELECTOR = 101 + ITEMREADER = 102 + READERCONFIG = 103 + INPUTTYPE = 104 + CSVHEADERLOCATION = 105 + CSVHEADERS = 106 + MAXITEMS = 107 + MAXITEMSPATH = 108 + TOLERATEDFAILURECOUNT = 109 + TOLERATEDFAILURECOUNTPATH = 110 + TOLERATEDFAILUREPERCENTAGE = 111 + TOLERATEDFAILUREPERCENTAGEPATH = 112 + LABEL = 113 + RESULTWRITER = 114 + NEXT = 115 + END = 116 + CAUSE = 117 + CAUSEPATH = 118 + ERROR = 119 + ERRORPATH = 120 + RETRY = 121 + ERROREQUALS = 122 + INTERVALSECONDS = 123 + MAXATTEMPTS = 124 + BACKOFFRATE = 125 + MAXDELAYSECONDS = 126 + JITTERSTRATEGY = 127 + FULL = 128 + NONE = 129 + CATCH = 130 + QUERYLANGUAGE = 131 + JSONPATH = 132 + JSONATA = 133 + ASSIGN = 134 + OUTPUT = 135 + ARGUMENTS = 136 + ERRORNAMEStatesALL = 137 + ERRORNAMEStatesDataLimitExceeded = 138 + ERRORNAMEStatesHeartbeatTimeout = 139 + ERRORNAMEStatesTimeout = 140 + ERRORNAMEStatesTaskFailed = 141 + ERRORNAMEStatesPermissions = 142 + ERRORNAMEStatesResultPathMatchFailure = 143 + ERRORNAMEStatesParameterPathFailure = 144 + ERRORNAMEStatesBranchFailed = 145 + ERRORNAMEStatesNoChoiceMatched = 146 + ERRORNAMEStatesIntrinsicFailure = 147 + ERRORNAMEStatesExceedToleratedFailureThreshold = 148 + ERRORNAMEStatesItemReaderFailed = 149 + ERRORNAMEStatesResultWriterFailed = 150 + ERRORNAMEStatesQueryEvaluationError = 151 + ERRORNAMEStatesRuntime = 152 + STRINGDOLLAR = 153 + STRINGPATHCONTEXTOBJ = 154 + STRINGPATH = 155 + STRINGVAR = 156 + STRINGINTRINSICFUNC = 157 + STRINGJSONATA = 158 + STRING = 159 + INT = 160 + NUMBER = 161 + WS = 162 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -1277,10 +1290,11 @@ class ASLLexer(Lexer): "'\"Iterator\"'", "'\"ItemSelector\"'", "'\"MaxConcurrencyPath\"'", "'\"MaxConcurrency\"'", "'\"Resource\"'", "'\"InputPath\"'", "'\"OutputPath\"'", "'\"Items\"'", "'\"ItemsPath\"'", "'\"ResultPath\"'", - "'\"Result\"'", "'\"Parameters\"'", "'\"Credentials\"'", "'\"ResultSelector\"'", - "'\"ItemReader\"'", "'\"ReaderConfig\"'", "'\"InputType\"'", - "'\"CSVHeaderLocation\"'", "'\"CSVHeaders\"'", "'\"MaxItems\"'", - "'\"MaxItemsPath\"'", "'\"ToleratedFailureCount\"'", "'\"ToleratedFailureCountPath\"'", + "'\"Result\"'", "'\"Parameters\"'", "'\"Credentials\"'", "'\"RoleArn\"'", + "'\"RoleArn.$\"'", "'\"ResultSelector\"'", "'\"ItemReader\"'", + "'\"ReaderConfig\"'", "'\"InputType\"'", "'\"CSVHeaderLocation\"'", + "'\"CSVHeaders\"'", "'\"MaxItems\"'", "'\"MaxItemsPath\"'", + "'\"ToleratedFailureCount\"'", "'\"ToleratedFailureCountPath\"'", "'\"ToleratedFailurePercentage\"'", "'\"ToleratedFailurePercentagePath\"'", "'\"Label\"'", "'\"ResultWriter\"'", "'\"Next\"'", "'\"End\"'", "'\"Cause\"'", "'\"CausePath\"'", "'\"Error\"'", "'\"ErrorPath\"'", @@ -1320,10 +1334,11 @@ class ASLLexer(Lexer): "DISTRIBUTED", "EXECUTIONTYPE", "STANDARD", "ITEMPROCESSOR", "ITERATOR", "ITEMSELECTOR", "MAXCONCURRENCYPATH", "MAXCONCURRENCY", "RESOURCE", "INPUTPATH", "OUTPUTPATH", "ITEMS", "ITEMSPATH", - "RESULTPATH", "RESULT", "PARAMETERS", "CREDENTIALS", "RESULTSELECTOR", - "ITEMREADER", "READERCONFIG", "INPUTTYPE", "CSVHEADERLOCATION", - "CSVHEADERS", "MAXITEMS", "MAXITEMSPATH", "TOLERATEDFAILURECOUNT", - "TOLERATEDFAILURECOUNTPATH", "TOLERATEDFAILUREPERCENTAGE", "TOLERATEDFAILUREPERCENTAGEPATH", + "RESULTPATH", "RESULT", "PARAMETERS", "CREDENTIALS", "ROLEARN", + "ROLEARNPATH", "RESULTSELECTOR", "ITEMREADER", "READERCONFIG", + "INPUTTYPE", "CSVHEADERLOCATION", "CSVHEADERS", "MAXITEMS", + "MAXITEMSPATH", "TOLERATEDFAILURECOUNT", "TOLERATEDFAILURECOUNTPATH", + "TOLERATEDFAILUREPERCENTAGE", "TOLERATEDFAILUREPERCENTAGEPATH", "LABEL", "RESULTWRITER", "NEXT", "END", "CAUSE", "CAUSEPATH", "ERROR", "ERRORPATH", "RETRY", "ERROREQUALS", "INTERVALSECONDS", "MAXATTEMPTS", "BACKOFFRATE", "MAXDELAYSECONDS", "JITTERSTRATEGY", @@ -1364,15 +1379,16 @@ class ASLLexer(Lexer): "ITEMPROCESSOR", "ITERATOR", "ITEMSELECTOR", "MAXCONCURRENCYPATH", "MAXCONCURRENCY", "RESOURCE", "INPUTPATH", "OUTPUTPATH", "ITEMS", "ITEMSPATH", "RESULTPATH", "RESULT", "PARAMETERS", - "CREDENTIALS", "RESULTSELECTOR", "ITEMREADER", "READERCONFIG", - "INPUTTYPE", "CSVHEADERLOCATION", "CSVHEADERS", "MAXITEMS", - "MAXITEMSPATH", "TOLERATEDFAILURECOUNT", "TOLERATEDFAILURECOUNTPATH", - "TOLERATEDFAILUREPERCENTAGE", "TOLERATEDFAILUREPERCENTAGEPATH", - "LABEL", "RESULTWRITER", "NEXT", "END", "CAUSE", "CAUSEPATH", - "ERROR", "ERRORPATH", "RETRY", "ERROREQUALS", "INTERVALSECONDS", - "MAXATTEMPTS", "BACKOFFRATE", "MAXDELAYSECONDS", "JITTERSTRATEGY", - "FULL", "NONE", "CATCH", "QUERYLANGUAGE", "JSONPATH", - "JSONATA", "ASSIGN", "OUTPUT", "ARGUMENTS", "ERRORNAMEStatesALL", + "CREDENTIALS", "ROLEARN", "ROLEARNPATH", "RESULTSELECTOR", + "ITEMREADER", "READERCONFIG", "INPUTTYPE", "CSVHEADERLOCATION", + "CSVHEADERS", "MAXITEMS", "MAXITEMSPATH", "TOLERATEDFAILURECOUNT", + "TOLERATEDFAILURECOUNTPATH", "TOLERATEDFAILUREPERCENTAGE", + "TOLERATEDFAILUREPERCENTAGEPATH", "LABEL", "RESULTWRITER", + "NEXT", "END", "CAUSE", "CAUSEPATH", "ERROR", "ERRORPATH", + "RETRY", "ERROREQUALS", "INTERVALSECONDS", "MAXATTEMPTS", + "BACKOFFRATE", "MAXDELAYSECONDS", "JITTERSTRATEGY", "FULL", + "NONE", "CATCH", "QUERYLANGUAGE", "JSONPATH", "JSONATA", + "ASSIGN", "OUTPUT", "ARGUMENTS", "ERRORNAMEStatesALL", "ERRORNAMEStatesDataLimitExceeded", "ERRORNAMEStatesHeartbeatTimeout", "ERRORNAMEStatesTimeout", "ERRORNAMEStatesTaskFailed", "ERRORNAMEStatesPermissions", "ERRORNAMEStatesResultPathMatchFailure", diff --git a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParser.py b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParser.py index 838f50e6b88cd..fb31f6a958112 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParser.py +++ b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParser.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,1,160,1235,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,1,162,1259,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7, @@ -28,455 +28,465 @@ def serializedATN(): 98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103,7,103, 2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108,2,109, 7,109,2,110,7,110,2,111,7,111,2,112,7,112,2,113,7,113,2,114,7,114, - 2,115,7,115,2,116,7,116,2,117,7,117,1,0,1,0,1,0,1,1,1,1,1,1,1,1, - 5,1,244,8,1,10,1,12,1,247,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,3, - 2,257,8,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,6,1, - 6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, + 2,115,7,115,2,116,7,116,2,117,7,117,2,118,7,118,1,0,1,0,1,0,1,1, + 1,1,1,1,1,1,5,1,246,8,1,10,1,12,1,249,9,1,1,1,1,1,1,2,1,2,1,2,1, + 2,1,2,1,2,3,2,259,8,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,5,1,5,1, + 5,1,5,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, - 7,1,7,3,7,322,8,7,1,8,1,8,1,8,1,8,1,8,1,8,5,8,330,8,8,10,8,12,8, - 333,9,8,1,8,1,8,1,9,1,9,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11, - 5,11,347,8,11,10,11,12,11,350,9,11,1,11,1,11,1,12,1,12,1,12,1,12, - 1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15, - 1,15,1,15,1,15,1,15,1,15,3,15,376,8,15,3,15,378,8,15,1,16,1,16,1, - 16,1,16,1,17,1,17,1,17,1,17,3,17,388,8,17,1,18,1,18,1,18,1,18,1, - 18,1,18,1,18,1,18,1,18,1,18,3,18,400,8,18,3,18,402,8,18,1,19,1,19, - 1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,3,21, - 418,8,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, - 1,22,3,22,432,8,22,1,23,1,23,1,23,1,23,1,23,1,23,3,23,440,8,23,1, - 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,454, - 8,24,1,25,1,25,1,25,1,25,1,25,1,25,3,25,462,8,25,1,26,1,26,1,26, - 1,26,1,26,1,26,3,26,470,8,26,1,27,1,27,1,27,1,27,1,27,1,27,3,27, - 478,8,27,1,28,1,28,1,28,1,28,1,28,1,28,3,28,486,8,28,1,29,1,29,1, - 29,1,29,1,29,1,29,3,29,494,8,29,1,30,1,30,1,30,1,30,1,30,1,30,1, - 30,1,30,1,30,3,30,505,8,30,1,31,1,31,1,31,1,31,1,31,1,31,3,31,513, - 8,31,1,32,1,32,1,32,1,32,1,32,1,32,3,32,521,8,32,1,33,1,33,1,33, - 1,33,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,3,35,537, - 8,35,1,36,1,36,1,36,1,36,1,36,1,36,3,36,545,8,36,1,37,1,37,1,37, - 1,37,1,37,1,37,3,37,553,8,37,1,38,1,38,1,38,1,38,1,38,1,38,3,38, - 561,8,38,1,39,1,39,1,40,1,40,1,40,1,40,5,40,569,8,40,10,40,12,40, - 572,9,40,1,40,1,40,1,40,1,40,3,40,578,8,40,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,596, - 8,41,1,42,1,42,1,42,1,42,5,42,602,8,42,10,42,12,42,605,9,42,1,42, - 1,42,1,42,1,42,3,42,611,8,42,1,43,1,43,1,43,3,43,616,8,43,1,44,1, - 44,1,44,1,44,1,44,3,44,623,8,44,1,45,1,45,1,45,1,45,1,46,1,46,1, - 46,1,46,1,46,1,46,5,46,635,8,46,10,46,12,46,638,9,46,1,46,1,46,3, - 46,642,8,46,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,5,48,652,8,48, - 10,48,12,48,655,9,48,1,48,1,48,3,48,659,8,48,1,49,1,49,1,49,1,49, - 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,3,49,676, - 8,49,1,50,1,50,1,50,3,50,681,8,50,1,51,1,51,1,51,1,51,1,51,1,51, - 5,51,689,8,51,10,51,12,51,692,9,51,1,51,1,51,3,51,696,8,51,1,52, - 1,52,1,52,1,52,1,52,1,52,3,52,704,8,52,1,53,1,53,1,53,1,53,1,53, - 1,53,3,53,712,8,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55, - 1,55,5,55,724,8,55,10,55,12,55,727,9,55,1,55,1,55,3,55,731,8,55, - 1,56,1,56,1,56,1,56,1,57,1,57,1,57,3,57,740,8,57,1,58,1,58,1,58, - 1,58,1,58,1,58,5,58,748,8,58,10,58,12,58,751,9,58,1,58,1,58,3,58, - 755,8,58,1,59,1,59,1,59,1,59,1,59,1,59,3,59,763,8,59,1,60,1,60,1, - 60,1,60,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,5,62,777,8,62,10, - 62,12,62,780,9,62,1,62,1,62,1,63,1,63,1,63,1,63,4,63,788,8,63,11, - 63,12,63,789,1,63,1,63,1,63,1,63,1,63,1,63,5,63,798,8,63,10,63,12, - 63,801,9,63,1,63,1,63,3,63,805,8,63,1,64,1,64,1,64,1,64,1,64,3,64, - 812,8,64,1,65,1,65,1,65,1,65,3,65,818,8,65,1,66,1,66,1,66,1,66,1, - 66,1,66,1,66,5,66,827,8,66,10,66,12,66,830,9,66,1,66,1,66,3,66,834, - 8,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,845,8,67, - 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, - 1,68,3,68,861,8,68,1,69,1,69,1,69,1,69,1,69,1,69,5,69,869,8,69,10, - 69,12,69,872,9,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,5,70,882, - 8,70,10,70,12,70,885,9,70,1,70,1,70,1,71,1,71,1,71,1,71,3,71,893, - 8,71,1,72,1,72,1,72,1,72,1,72,1,72,5,72,901,8,72,10,72,12,72,904, - 9,72,1,72,1,72,1,73,1,73,3,73,910,8,73,1,74,1,74,1,74,1,74,1,75, - 1,75,1,76,1,76,1,76,1,76,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78, - 5,78,930,8,78,10,78,12,78,933,9,78,1,78,1,78,1,79,1,79,1,79,1,79, - 3,79,941,8,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81, - 5,81,953,8,81,10,81,12,81,956,9,81,1,81,1,81,1,82,1,82,1,82,1,82, - 3,82,964,8,82,1,83,1,83,1,83,1,83,1,83,1,83,5,83,972,8,83,10,83, - 12,83,975,9,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,3,84,984,8,84, - 1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87, - 1,87,5,87,1000,8,87,10,87,12,87,1003,9,87,1,87,1,87,1,88,1,88,1, - 88,1,88,1,88,1,88,3,88,1013,8,88,1,89,1,89,1,89,1,89,1,89,1,89,3, - 89,1021,8,89,1,90,1,90,1,90,1,90,1,90,1,90,3,90,1029,8,90,1,91,1, - 91,1,91,1,91,1,91,1,91,3,91,1037,8,91,1,92,1,92,1,92,1,92,1,92,1, - 92,3,92,1045,8,92,1,93,1,93,1,93,1,93,1,93,1,93,3,93,1053,8,93,1, - 94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,5,95,1065,8,95,10, - 95,12,95,1068,9,95,1,95,1,95,1,96,1,96,3,96,1074,8,96,1,97,1,97, - 1,97,1,97,1,97,1,97,5,97,1082,8,97,10,97,12,97,1085,9,97,3,97,1087, - 8,97,1,97,1,97,1,98,1,98,1,98,1,98,5,98,1095,8,98,10,98,12,98,1098, - 9,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,99,3,99,1109,8,99, - 1,100,1,100,1,100,1,100,1,100,1,100,5,100,1117,8,100,10,100,12,100, - 1120,9,100,1,100,1,100,1,101,1,101,1,101,1,101,1,102,1,102,1,102, - 1,102,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,1,105,1,105, - 1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,5,106,1150,8,106, - 10,106,12,106,1153,9,106,3,106,1155,8,106,1,106,1,106,1,107,1,107, - 1,107,1,107,5,107,1163,8,107,10,107,12,107,1166,9,107,1,107,1,107, - 1,108,1,108,1,108,1,108,1,108,1,108,3,108,1176,8,108,1,109,1,109, - 1,110,1,110,1,111,1,111,1,112,1,112,3,112,1186,8,112,1,113,1,113, - 1,113,1,113,5,113,1192,8,113,10,113,12,113,1195,9,113,1,113,1,113, - 1,113,1,113,3,113,1201,8,113,1,114,1,114,1,114,1,114,1,115,1,115, - 1,115,1,115,5,115,1211,8,115,10,115,12,115,1214,9,115,1,115,1,115, - 1,115,1,115,3,115,1220,8,115,1,116,1,116,1,116,1,116,1,116,1,116, - 1,116,1,116,1,116,3,116,1231,8,116,1,117,1,117,1,117,0,0,118,0,2, - 4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48, - 50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92, - 94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126, - 128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158, - 160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190, - 192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222, - 224,226,228,230,232,234,0,10,1,0,130,131,1,0,7,8,1,0,16,23,1,0,81, - 82,1,0,158,159,1,0,126,127,3,0,30,37,39,48,50,70,3,0,29,29,38,38, - 49,49,1,0,135,150,6,0,10,13,15,115,117,117,119,129,132,135,137,157, - 1319,0,236,1,0,0,0,2,239,1,0,0,0,4,256,1,0,0,0,6,258,1,0,0,0,8,262, - 1,0,0,0,10,266,1,0,0,0,12,270,1,0,0,0,14,321,1,0,0,0,16,323,1,0, - 0,0,18,336,1,0,0,0,20,338,1,0,0,0,22,342,1,0,0,0,24,353,1,0,0,0, - 26,357,1,0,0,0,28,361,1,0,0,0,30,377,1,0,0,0,32,379,1,0,0,0,34,383, - 1,0,0,0,36,401,1,0,0,0,38,403,1,0,0,0,40,407,1,0,0,0,42,417,1,0, - 0,0,44,431,1,0,0,0,46,439,1,0,0,0,48,453,1,0,0,0,50,461,1,0,0,0, - 52,469,1,0,0,0,54,477,1,0,0,0,56,485,1,0,0,0,58,493,1,0,0,0,60,504, - 1,0,0,0,62,512,1,0,0,0,64,520,1,0,0,0,66,522,1,0,0,0,68,526,1,0, - 0,0,70,536,1,0,0,0,72,544,1,0,0,0,74,552,1,0,0,0,76,560,1,0,0,0, - 78,562,1,0,0,0,80,577,1,0,0,0,82,595,1,0,0,0,84,610,1,0,0,0,86,615, - 1,0,0,0,88,622,1,0,0,0,90,624,1,0,0,0,92,641,1,0,0,0,94,643,1,0, - 0,0,96,658,1,0,0,0,98,675,1,0,0,0,100,680,1,0,0,0,102,695,1,0,0, - 0,104,703,1,0,0,0,106,711,1,0,0,0,108,713,1,0,0,0,110,730,1,0,0, - 0,112,732,1,0,0,0,114,739,1,0,0,0,116,754,1,0,0,0,118,762,1,0,0, - 0,120,764,1,0,0,0,122,768,1,0,0,0,124,770,1,0,0,0,126,804,1,0,0, - 0,128,811,1,0,0,0,130,817,1,0,0,0,132,819,1,0,0,0,134,844,1,0,0, - 0,136,860,1,0,0,0,138,862,1,0,0,0,140,875,1,0,0,0,142,892,1,0,0, - 0,144,894,1,0,0,0,146,909,1,0,0,0,148,911,1,0,0,0,150,915,1,0,0, - 0,152,917,1,0,0,0,154,921,1,0,0,0,156,923,1,0,0,0,158,940,1,0,0, - 0,160,942,1,0,0,0,162,946,1,0,0,0,164,963,1,0,0,0,166,965,1,0,0, - 0,168,983,1,0,0,0,170,985,1,0,0,0,172,989,1,0,0,0,174,993,1,0,0, - 0,176,1012,1,0,0,0,178,1020,1,0,0,0,180,1028,1,0,0,0,182,1036,1, - 0,0,0,184,1044,1,0,0,0,186,1052,1,0,0,0,188,1054,1,0,0,0,190,1058, - 1,0,0,0,192,1073,1,0,0,0,194,1075,1,0,0,0,196,1090,1,0,0,0,198,1108, - 1,0,0,0,200,1110,1,0,0,0,202,1123,1,0,0,0,204,1127,1,0,0,0,206,1131, - 1,0,0,0,208,1135,1,0,0,0,210,1139,1,0,0,0,212,1143,1,0,0,0,214,1158, - 1,0,0,0,216,1175,1,0,0,0,218,1177,1,0,0,0,220,1179,1,0,0,0,222,1181, - 1,0,0,0,224,1185,1,0,0,0,226,1200,1,0,0,0,228,1202,1,0,0,0,230,1219, - 1,0,0,0,232,1230,1,0,0,0,234,1232,1,0,0,0,236,237,3,2,1,0,237,238, - 5,0,0,1,238,1,1,0,0,0,239,240,5,5,0,0,240,245,3,4,2,0,241,242,5, - 1,0,0,242,244,3,4,2,0,243,241,1,0,0,0,244,247,1,0,0,0,245,243,1, - 0,0,0,245,246,1,0,0,0,246,248,1,0,0,0,247,245,1,0,0,0,248,249,5, - 6,0,0,249,3,1,0,0,0,250,257,3,8,4,0,251,257,3,10,5,0,252,257,3,12, - 6,0,253,257,3,6,3,0,254,257,3,16,8,0,255,257,3,70,35,0,256,250,1, - 0,0,0,256,251,1,0,0,0,256,252,1,0,0,0,256,253,1,0,0,0,256,254,1, - 0,0,0,256,255,1,0,0,0,257,5,1,0,0,0,258,259,5,12,0,0,259,260,5,2, - 0,0,260,261,3,234,117,0,261,7,1,0,0,0,262,263,5,10,0,0,263,264,5, - 2,0,0,264,265,3,234,117,0,265,9,1,0,0,0,266,267,5,14,0,0,267,268, - 5,2,0,0,268,269,3,234,117,0,269,11,1,0,0,0,270,271,5,129,0,0,271, - 272,5,2,0,0,272,273,7,0,0,0,273,13,1,0,0,0,274,322,3,8,4,0,275,322, - 3,12,6,0,276,322,3,24,12,0,277,322,3,30,15,0,278,322,3,28,14,0,279, - 322,3,26,13,0,280,322,3,32,16,0,281,322,3,34,17,0,282,322,3,36,18, - 0,283,322,3,38,19,0,284,322,3,40,20,0,285,322,3,124,62,0,286,322, - 3,42,21,0,287,322,3,44,22,0,288,322,3,46,23,0,289,322,3,48,24,0, - 290,322,3,50,25,0,291,322,3,52,26,0,292,322,3,54,27,0,293,322,3, - 56,28,0,294,322,3,58,29,0,295,322,3,60,30,0,296,322,3,140,70,0,297, - 322,3,156,78,0,298,322,3,160,80,0,299,322,3,162,81,0,300,322,3,62, - 31,0,301,322,3,64,32,0,302,322,3,70,35,0,303,322,3,72,36,0,304,322, - 3,74,37,0,305,322,3,76,38,0,306,322,3,138,69,0,307,322,3,66,33,0, - 308,322,3,194,97,0,309,322,3,212,106,0,310,322,3,120,60,0,311,322, - 3,180,90,0,312,322,3,182,91,0,313,322,3,184,92,0,314,322,3,186,93, - 0,315,322,3,188,94,0,316,322,3,190,95,0,317,322,3,90,45,0,318,322, - 3,106,53,0,319,322,3,108,54,0,320,322,3,68,34,0,321,274,1,0,0,0, - 321,275,1,0,0,0,321,276,1,0,0,0,321,277,1,0,0,0,321,278,1,0,0,0, - 321,279,1,0,0,0,321,280,1,0,0,0,321,281,1,0,0,0,321,282,1,0,0,0, - 321,283,1,0,0,0,321,284,1,0,0,0,321,285,1,0,0,0,321,286,1,0,0,0, - 321,287,1,0,0,0,321,288,1,0,0,0,321,289,1,0,0,0,321,290,1,0,0,0, - 321,291,1,0,0,0,321,292,1,0,0,0,321,293,1,0,0,0,321,294,1,0,0,0, - 321,295,1,0,0,0,321,296,1,0,0,0,321,297,1,0,0,0,321,298,1,0,0,0, - 321,299,1,0,0,0,321,300,1,0,0,0,321,301,1,0,0,0,321,302,1,0,0,0, - 321,303,1,0,0,0,321,304,1,0,0,0,321,305,1,0,0,0,321,306,1,0,0,0, - 321,307,1,0,0,0,321,308,1,0,0,0,321,309,1,0,0,0,321,310,1,0,0,0, - 321,311,1,0,0,0,321,312,1,0,0,0,321,313,1,0,0,0,321,314,1,0,0,0, - 321,315,1,0,0,0,321,316,1,0,0,0,321,317,1,0,0,0,321,318,1,0,0,0, - 321,319,1,0,0,0,321,320,1,0,0,0,322,15,1,0,0,0,323,324,5,11,0,0, - 324,325,5,2,0,0,325,326,5,5,0,0,326,331,3,20,10,0,327,328,5,1,0, - 0,328,330,3,20,10,0,329,327,1,0,0,0,330,333,1,0,0,0,331,329,1,0, - 0,0,331,332,1,0,0,0,332,334,1,0,0,0,333,331,1,0,0,0,334,335,5,6, - 0,0,335,17,1,0,0,0,336,337,3,234,117,0,337,19,1,0,0,0,338,339,3, - 18,9,0,339,340,5,2,0,0,340,341,3,22,11,0,341,21,1,0,0,0,342,343, - 5,5,0,0,343,348,3,14,7,0,344,345,5,1,0,0,345,347,3,14,7,0,346,344, - 1,0,0,0,347,350,1,0,0,0,348,346,1,0,0,0,348,349,1,0,0,0,349,351, - 1,0,0,0,350,348,1,0,0,0,351,352,5,6,0,0,352,23,1,0,0,0,353,354,5, - 15,0,0,354,355,5,2,0,0,355,356,3,122,61,0,356,25,1,0,0,0,357,358, - 5,113,0,0,358,359,5,2,0,0,359,360,3,234,117,0,360,27,1,0,0,0,361, - 362,5,90,0,0,362,363,5,2,0,0,363,364,3,234,117,0,364,29,1,0,0,0, - 365,366,5,91,0,0,366,367,5,2,0,0,367,378,3,78,39,0,368,369,5,91, - 0,0,369,370,5,2,0,0,370,378,5,152,0,0,371,372,5,91,0,0,372,375,5, - 2,0,0,373,376,5,9,0,0,374,376,3,234,117,0,375,373,1,0,0,0,375,374, - 1,0,0,0,376,378,1,0,0,0,377,365,1,0,0,0,377,368,1,0,0,0,377,371, - 1,0,0,0,378,31,1,0,0,0,379,380,5,96,0,0,380,381,5,2,0,0,381,382, - 3,232,116,0,382,33,1,0,0,0,383,384,5,95,0,0,384,387,5,2,0,0,385, - 388,5,9,0,0,386,388,3,234,117,0,387,385,1,0,0,0,387,386,1,0,0,0, - 388,35,1,0,0,0,389,390,5,92,0,0,390,391,5,2,0,0,391,402,3,78,39, - 0,392,393,5,92,0,0,393,394,5,2,0,0,394,402,5,152,0,0,395,396,5,92, - 0,0,396,399,5,2,0,0,397,400,5,9,0,0,398,400,3,234,117,0,399,397, - 1,0,0,0,399,398,1,0,0,0,400,402,1,0,0,0,401,389,1,0,0,0,401,392, - 1,0,0,0,401,395,1,0,0,0,402,37,1,0,0,0,403,404,5,114,0,0,404,405, - 5,2,0,0,405,406,7,1,0,0,406,39,1,0,0,0,407,408,5,27,0,0,408,409, - 5,2,0,0,409,410,3,234,117,0,410,41,1,0,0,0,411,412,5,117,0,0,412, - 413,5,2,0,0,413,418,5,156,0,0,414,415,5,117,0,0,415,416,5,2,0,0, - 416,418,3,234,117,0,417,411,1,0,0,0,417,414,1,0,0,0,418,43,1,0,0, - 0,419,420,5,118,0,0,420,421,5,2,0,0,421,432,3,78,39,0,422,423,5, - 118,0,0,423,424,5,2,0,0,424,432,5,153,0,0,425,426,5,118,0,0,426, - 427,5,2,0,0,427,432,5,152,0,0,428,429,5,118,0,0,429,430,5,2,0,0, - 430,432,5,155,0,0,431,419,1,0,0,0,431,422,1,0,0,0,431,425,1,0,0, - 0,431,428,1,0,0,0,432,45,1,0,0,0,433,434,5,115,0,0,434,435,5,2,0, - 0,435,440,5,156,0,0,436,437,5,115,0,0,437,438,5,2,0,0,438,440,3, - 234,117,0,439,433,1,0,0,0,439,436,1,0,0,0,440,47,1,0,0,0,441,442, - 5,116,0,0,442,443,5,2,0,0,443,454,3,78,39,0,444,445,5,116,0,0,445, - 446,5,2,0,0,446,454,5,153,0,0,447,448,5,116,0,0,448,449,5,2,0,0, - 449,454,5,152,0,0,450,451,5,116,0,0,451,452,5,2,0,0,452,454,5,155, - 0,0,453,441,1,0,0,0,453,444,1,0,0,0,453,447,1,0,0,0,453,450,1,0, - 0,0,454,49,1,0,0,0,455,456,5,72,0,0,456,457,5,2,0,0,457,462,5,156, - 0,0,458,459,5,72,0,0,459,460,5,2,0,0,460,462,5,158,0,0,461,455,1, - 0,0,0,461,458,1,0,0,0,462,51,1,0,0,0,463,464,5,71,0,0,464,465,5, - 2,0,0,465,470,3,78,39,0,466,467,5,71,0,0,467,468,5,2,0,0,468,470, - 3,234,117,0,469,463,1,0,0,0,469,466,1,0,0,0,470,53,1,0,0,0,471,472, - 5,74,0,0,472,473,5,2,0,0,473,478,5,156,0,0,474,475,5,74,0,0,475, - 476,5,2,0,0,476,478,3,234,117,0,477,471,1,0,0,0,477,474,1,0,0,0, - 478,55,1,0,0,0,479,480,5,73,0,0,480,481,5,2,0,0,481,486,3,78,39, - 0,482,483,5,73,0,0,483,484,5,2,0,0,484,486,3,234,117,0,485,479,1, - 0,0,0,485,482,1,0,0,0,486,57,1,0,0,0,487,488,5,93,0,0,488,489,5, - 2,0,0,489,494,3,116,58,0,490,491,5,93,0,0,491,492,5,2,0,0,492,494, - 5,156,0,0,493,487,1,0,0,0,493,490,1,0,0,0,494,59,1,0,0,0,495,496, - 5,94,0,0,496,497,5,2,0,0,497,505,5,152,0,0,498,499,5,94,0,0,499, - 500,5,2,0,0,500,505,3,78,39,0,501,502,5,94,0,0,502,503,5,2,0,0,503, - 505,3,234,117,0,504,495,1,0,0,0,504,498,1,0,0,0,504,501,1,0,0,0, - 505,61,1,0,0,0,506,507,5,89,0,0,507,508,5,2,0,0,508,513,5,156,0, - 0,509,510,5,89,0,0,510,511,5,2,0,0,511,513,5,158,0,0,512,506,1,0, - 0,0,512,509,1,0,0,0,513,63,1,0,0,0,514,515,5,88,0,0,515,516,5,2, - 0,0,516,521,3,78,39,0,517,518,5,88,0,0,518,519,5,2,0,0,519,521,5, - 153,0,0,520,514,1,0,0,0,520,517,1,0,0,0,521,65,1,0,0,0,522,523,5, - 97,0,0,523,524,5,2,0,0,524,525,3,80,40,0,525,67,1,0,0,0,526,527, - 5,98,0,0,527,528,5,2,0,0,528,529,3,80,40,0,529,69,1,0,0,0,530,531, - 5,75,0,0,531,532,5,2,0,0,532,537,5,156,0,0,533,534,5,75,0,0,534, - 535,5,2,0,0,535,537,5,158,0,0,536,530,1,0,0,0,536,533,1,0,0,0,537, - 71,1,0,0,0,538,539,5,76,0,0,539,540,5,2,0,0,540,545,3,78,39,0,541, - 542,5,76,0,0,542,543,5,2,0,0,543,545,5,153,0,0,544,538,1,0,0,0,544, - 541,1,0,0,0,545,73,1,0,0,0,546,547,5,77,0,0,547,548,5,2,0,0,548, - 553,5,156,0,0,549,550,5,77,0,0,550,551,5,2,0,0,551,553,5,158,0,0, - 552,546,1,0,0,0,552,549,1,0,0,0,553,75,1,0,0,0,554,555,5,78,0,0, - 555,556,5,2,0,0,556,561,3,78,39,0,557,558,5,78,0,0,558,559,5,2,0, - 0,559,561,5,153,0,0,560,554,1,0,0,0,560,557,1,0,0,0,561,77,1,0,0, - 0,562,563,5,154,0,0,563,79,1,0,0,0,564,565,5,5,0,0,565,570,3,82, - 41,0,566,567,5,1,0,0,567,569,3,82,41,0,568,566,1,0,0,0,569,572,1, - 0,0,0,570,568,1,0,0,0,570,571,1,0,0,0,571,573,1,0,0,0,572,570,1, - 0,0,0,573,574,5,6,0,0,574,578,1,0,0,0,575,576,5,5,0,0,576,578,5, - 6,0,0,577,564,1,0,0,0,577,575,1,0,0,0,578,81,1,0,0,0,579,580,5,151, - 0,0,580,581,5,2,0,0,581,596,5,153,0,0,582,583,5,151,0,0,583,584, - 5,2,0,0,584,596,5,152,0,0,585,586,5,151,0,0,586,587,5,2,0,0,587, - 596,5,155,0,0,588,589,5,151,0,0,589,590,5,2,0,0,590,596,3,78,39, - 0,591,592,3,234,117,0,592,593,5,2,0,0,593,594,3,86,43,0,594,596, - 1,0,0,0,595,579,1,0,0,0,595,582,1,0,0,0,595,585,1,0,0,0,595,588, - 1,0,0,0,595,591,1,0,0,0,596,83,1,0,0,0,597,598,5,3,0,0,598,603,3, - 86,43,0,599,600,5,1,0,0,600,602,3,86,43,0,601,599,1,0,0,0,602,605, - 1,0,0,0,603,601,1,0,0,0,603,604,1,0,0,0,604,606,1,0,0,0,605,603, - 1,0,0,0,606,607,5,4,0,0,607,611,1,0,0,0,608,609,5,3,0,0,609,611, - 5,4,0,0,610,597,1,0,0,0,610,608,1,0,0,0,611,85,1,0,0,0,612,616,3, - 84,42,0,613,616,3,80,40,0,614,616,3,88,44,0,615,612,1,0,0,0,615, - 613,1,0,0,0,615,614,1,0,0,0,616,87,1,0,0,0,617,623,5,159,0,0,618, - 623,5,158,0,0,619,623,7,1,0,0,620,623,5,9,0,0,621,623,3,234,117, - 0,622,617,1,0,0,0,622,618,1,0,0,0,622,619,1,0,0,0,622,620,1,0,0, - 0,622,621,1,0,0,0,623,89,1,0,0,0,624,625,5,132,0,0,625,626,5,2,0, - 0,626,627,3,92,46,0,627,91,1,0,0,0,628,629,5,5,0,0,629,642,5,6,0, - 0,630,631,5,5,0,0,631,636,3,94,47,0,632,633,5,1,0,0,633,635,3,94, - 47,0,634,632,1,0,0,0,635,638,1,0,0,0,636,634,1,0,0,0,636,637,1,0, - 0,0,637,639,1,0,0,0,638,636,1,0,0,0,639,640,5,6,0,0,640,642,1,0, - 0,0,641,628,1,0,0,0,641,630,1,0,0,0,642,93,1,0,0,0,643,644,3,98, - 49,0,644,95,1,0,0,0,645,646,5,5,0,0,646,659,5,6,0,0,647,648,5,5, - 0,0,648,653,3,98,49,0,649,650,5,1,0,0,650,652,3,98,49,0,651,649, - 1,0,0,0,652,655,1,0,0,0,653,651,1,0,0,0,653,654,1,0,0,0,654,656, - 1,0,0,0,655,653,1,0,0,0,656,657,5,6,0,0,657,659,1,0,0,0,658,645, - 1,0,0,0,658,647,1,0,0,0,659,97,1,0,0,0,660,661,5,151,0,0,661,662, - 5,2,0,0,662,676,5,153,0,0,663,664,5,151,0,0,664,665,5,2,0,0,665, - 676,5,152,0,0,666,667,5,151,0,0,667,668,5,2,0,0,668,676,3,78,39, - 0,669,670,5,151,0,0,670,671,5,2,0,0,671,676,5,155,0,0,672,673,5, - 157,0,0,673,674,5,2,0,0,674,676,3,100,50,0,675,660,1,0,0,0,675,663, - 1,0,0,0,675,666,1,0,0,0,675,669,1,0,0,0,675,672,1,0,0,0,676,99,1, - 0,0,0,677,681,3,96,48,0,678,681,3,102,51,0,679,681,3,104,52,0,680, - 677,1,0,0,0,680,678,1,0,0,0,680,679,1,0,0,0,681,101,1,0,0,0,682, - 683,5,3,0,0,683,696,5,4,0,0,684,685,5,3,0,0,685,690,3,100,50,0,686, - 687,5,1,0,0,687,689,3,100,50,0,688,686,1,0,0,0,689,692,1,0,0,0,690, - 688,1,0,0,0,690,691,1,0,0,0,691,693,1,0,0,0,692,690,1,0,0,0,693, - 694,5,4,0,0,694,696,1,0,0,0,695,682,1,0,0,0,695,684,1,0,0,0,696, - 103,1,0,0,0,697,704,5,159,0,0,698,704,5,158,0,0,699,704,7,1,0,0, - 700,704,5,9,0,0,701,704,5,156,0,0,702,704,3,234,117,0,703,697,1, - 0,0,0,703,698,1,0,0,0,703,699,1,0,0,0,703,700,1,0,0,0,703,701,1, - 0,0,0,703,702,1,0,0,0,704,105,1,0,0,0,705,706,5,134,0,0,706,707, - 5,2,0,0,707,712,3,110,55,0,708,709,5,134,0,0,709,710,5,2,0,0,710, - 712,5,156,0,0,711,705,1,0,0,0,711,708,1,0,0,0,712,107,1,0,0,0,713, - 714,5,133,0,0,714,715,5,2,0,0,715,716,3,114,57,0,716,109,1,0,0,0, - 717,718,5,5,0,0,718,731,5,6,0,0,719,720,5,5,0,0,720,725,3,112,56, - 0,721,722,5,1,0,0,722,724,3,112,56,0,723,721,1,0,0,0,724,727,1,0, - 0,0,725,723,1,0,0,0,725,726,1,0,0,0,726,728,1,0,0,0,727,725,1,0, - 0,0,728,729,5,6,0,0,729,731,1,0,0,0,730,717,1,0,0,0,730,719,1,0, - 0,0,731,111,1,0,0,0,732,733,3,234,117,0,733,734,5,2,0,0,734,735, - 3,114,57,0,735,113,1,0,0,0,736,740,3,110,55,0,737,740,3,116,58,0, - 738,740,3,118,59,0,739,736,1,0,0,0,739,737,1,0,0,0,739,738,1,0,0, - 0,740,115,1,0,0,0,741,742,5,3,0,0,742,755,5,4,0,0,743,744,5,3,0, - 0,744,749,3,114,57,0,745,746,5,1,0,0,746,748,3,114,57,0,747,745, - 1,0,0,0,748,751,1,0,0,0,749,747,1,0,0,0,749,750,1,0,0,0,750,752, - 1,0,0,0,751,749,1,0,0,0,752,753,5,4,0,0,753,755,1,0,0,0,754,741, - 1,0,0,0,754,743,1,0,0,0,755,117,1,0,0,0,756,763,5,159,0,0,757,763, - 5,158,0,0,758,763,7,1,0,0,759,763,5,9,0,0,760,763,5,156,0,0,761, - 763,3,234,117,0,762,756,1,0,0,0,762,757,1,0,0,0,762,758,1,0,0,0, - 762,759,1,0,0,0,762,760,1,0,0,0,762,761,1,0,0,0,763,119,1,0,0,0, - 764,765,5,99,0,0,765,766,5,2,0,0,766,767,3,80,40,0,767,121,1,0,0, - 0,768,769,7,2,0,0,769,123,1,0,0,0,770,771,5,24,0,0,771,772,5,2,0, - 0,772,773,5,3,0,0,773,778,3,126,63,0,774,775,5,1,0,0,775,777,3,126, - 63,0,776,774,1,0,0,0,777,780,1,0,0,0,778,776,1,0,0,0,778,779,1,0, - 0,0,779,781,1,0,0,0,780,778,1,0,0,0,781,782,5,4,0,0,782,125,1,0, - 0,0,783,784,5,5,0,0,784,787,3,128,64,0,785,786,5,1,0,0,786,788,3, - 128,64,0,787,785,1,0,0,0,788,789,1,0,0,0,789,787,1,0,0,0,789,790, - 1,0,0,0,790,791,1,0,0,0,791,792,5,6,0,0,792,805,1,0,0,0,793,794, - 5,5,0,0,794,799,3,130,65,0,795,796,5,1,0,0,796,798,3,130,65,0,797, - 795,1,0,0,0,798,801,1,0,0,0,799,797,1,0,0,0,799,800,1,0,0,0,800, - 802,1,0,0,0,801,799,1,0,0,0,802,803,5,6,0,0,803,805,1,0,0,0,804, - 783,1,0,0,0,804,793,1,0,0,0,805,127,1,0,0,0,806,812,3,134,67,0,807, - 812,3,136,68,0,808,812,3,26,13,0,809,812,3,90,45,0,810,812,3,8,4, - 0,811,806,1,0,0,0,811,807,1,0,0,0,811,808,1,0,0,0,811,809,1,0,0, - 0,811,810,1,0,0,0,812,129,1,0,0,0,813,818,3,132,66,0,814,818,3,26, - 13,0,815,818,3,90,45,0,816,818,3,8,4,0,817,813,1,0,0,0,817,814,1, - 0,0,0,817,815,1,0,0,0,817,816,1,0,0,0,818,131,1,0,0,0,819,820,3, - 220,110,0,820,833,5,2,0,0,821,834,3,126,63,0,822,823,5,3,0,0,823, - 828,3,126,63,0,824,825,5,1,0,0,825,827,3,126,63,0,826,824,1,0,0, - 0,827,830,1,0,0,0,828,826,1,0,0,0,828,829,1,0,0,0,829,831,1,0,0, - 0,830,828,1,0,0,0,831,832,5,4,0,0,832,834,1,0,0,0,833,821,1,0,0, - 0,833,822,1,0,0,0,834,133,1,0,0,0,835,836,5,26,0,0,836,837,5,2,0, - 0,837,845,5,153,0,0,838,839,5,26,0,0,839,840,5,2,0,0,840,845,3,78, - 39,0,841,842,5,26,0,0,842,843,5,2,0,0,843,845,5,152,0,0,844,835, - 1,0,0,0,844,838,1,0,0,0,844,841,1,0,0,0,845,135,1,0,0,0,846,847, - 5,25,0,0,847,848,5,2,0,0,848,861,7,1,0,0,849,850,5,25,0,0,850,851, - 5,2,0,0,851,861,5,156,0,0,852,853,3,218,109,0,853,854,5,2,0,0,854, - 855,3,78,39,0,855,861,1,0,0,0,856,857,3,218,109,0,857,858,5,2,0, - 0,858,859,3,232,116,0,859,861,1,0,0,0,860,846,1,0,0,0,860,849,1, - 0,0,0,860,852,1,0,0,0,860,856,1,0,0,0,861,137,1,0,0,0,862,863,5, - 28,0,0,863,864,5,2,0,0,864,865,5,3,0,0,865,870,3,2,1,0,866,867,5, - 1,0,0,867,869,3,2,1,0,868,866,1,0,0,0,869,872,1,0,0,0,870,868,1, - 0,0,0,870,871,1,0,0,0,871,873,1,0,0,0,872,870,1,0,0,0,873,874,5, - 4,0,0,874,139,1,0,0,0,875,876,5,85,0,0,876,877,5,2,0,0,877,878,5, - 5,0,0,878,883,3,142,71,0,879,880,5,1,0,0,880,882,3,142,71,0,881, - 879,1,0,0,0,882,885,1,0,0,0,883,881,1,0,0,0,883,884,1,0,0,0,884, - 886,1,0,0,0,885,883,1,0,0,0,886,887,5,6,0,0,887,141,1,0,0,0,888, - 893,3,144,72,0,889,893,3,6,3,0,890,893,3,16,8,0,891,893,3,8,4,0, - 892,888,1,0,0,0,892,889,1,0,0,0,892,890,1,0,0,0,892,891,1,0,0,0, - 893,143,1,0,0,0,894,895,5,79,0,0,895,896,5,2,0,0,896,897,5,5,0,0, - 897,902,3,146,73,0,898,899,5,1,0,0,899,901,3,146,73,0,900,898,1, - 0,0,0,901,904,1,0,0,0,902,900,1,0,0,0,902,903,1,0,0,0,903,905,1, - 0,0,0,904,902,1,0,0,0,905,906,5,6,0,0,906,145,1,0,0,0,907,910,3, - 148,74,0,908,910,3,152,76,0,909,907,1,0,0,0,909,908,1,0,0,0,910, - 147,1,0,0,0,911,912,5,80,0,0,912,913,5,2,0,0,913,914,3,150,75,0, - 914,149,1,0,0,0,915,916,7,3,0,0,916,151,1,0,0,0,917,918,5,83,0,0, - 918,919,5,2,0,0,919,920,3,154,77,0,920,153,1,0,0,0,921,922,5,84, - 0,0,922,155,1,0,0,0,923,924,5,86,0,0,924,925,5,2,0,0,925,926,5,5, - 0,0,926,931,3,158,79,0,927,928,5,1,0,0,928,930,3,158,79,0,929,927, - 1,0,0,0,930,933,1,0,0,0,931,929,1,0,0,0,931,932,1,0,0,0,932,934, - 1,0,0,0,933,931,1,0,0,0,934,935,5,6,0,0,935,157,1,0,0,0,936,941, - 3,6,3,0,937,941,3,16,8,0,938,941,3,8,4,0,939,941,3,144,72,0,940, - 936,1,0,0,0,940,937,1,0,0,0,940,938,1,0,0,0,940,939,1,0,0,0,941, - 159,1,0,0,0,942,943,5,87,0,0,943,944,5,2,0,0,944,945,3,80,40,0,945, - 161,1,0,0,0,946,947,5,100,0,0,947,948,5,2,0,0,948,949,5,5,0,0,949, - 954,3,164,82,0,950,951,5,1,0,0,951,953,3,164,82,0,952,950,1,0,0, - 0,953,956,1,0,0,0,954,952,1,0,0,0,954,955,1,0,0,0,955,957,1,0,0, - 0,956,954,1,0,0,0,957,958,5,6,0,0,958,163,1,0,0,0,959,964,3,28,14, - 0,960,964,3,166,83,0,961,964,3,66,33,0,962,964,3,106,53,0,963,959, - 1,0,0,0,963,960,1,0,0,0,963,961,1,0,0,0,963,962,1,0,0,0,964,165, - 1,0,0,0,965,966,5,101,0,0,966,967,5,2,0,0,967,968,5,5,0,0,968,973, - 3,168,84,0,969,970,5,1,0,0,970,972,3,168,84,0,971,969,1,0,0,0,972, - 975,1,0,0,0,973,971,1,0,0,0,973,974,1,0,0,0,974,976,1,0,0,0,975, - 973,1,0,0,0,976,977,5,6,0,0,977,167,1,0,0,0,978,984,3,170,85,0,979, - 984,3,172,86,0,980,984,3,174,87,0,981,984,3,176,88,0,982,984,3,178, - 89,0,983,978,1,0,0,0,983,979,1,0,0,0,983,980,1,0,0,0,983,981,1,0, - 0,0,983,982,1,0,0,0,984,169,1,0,0,0,985,986,5,102,0,0,986,987,5, - 2,0,0,987,988,3,234,117,0,988,171,1,0,0,0,989,990,5,103,0,0,990, - 991,5,2,0,0,991,992,3,234,117,0,992,173,1,0,0,0,993,994,5,104,0, - 0,994,995,5,2,0,0,995,996,5,3,0,0,996,1001,3,234,117,0,997,998,5, - 1,0,0,998,1000,3,234,117,0,999,997,1,0,0,0,1000,1003,1,0,0,0,1001, - 999,1,0,0,0,1001,1002,1,0,0,0,1002,1004,1,0,0,0,1003,1001,1,0,0, - 0,1004,1005,5,4,0,0,1005,175,1,0,0,0,1006,1007,5,105,0,0,1007,1008, - 5,2,0,0,1008,1013,5,156,0,0,1009,1010,5,105,0,0,1010,1011,5,2,0, - 0,1011,1013,5,158,0,0,1012,1006,1,0,0,0,1012,1009,1,0,0,0,1013,177, - 1,0,0,0,1014,1015,5,106,0,0,1015,1016,5,2,0,0,1016,1021,3,78,39, - 0,1017,1018,5,106,0,0,1018,1019,5,2,0,0,1019,1021,5,153,0,0,1020, - 1014,1,0,0,0,1020,1017,1,0,0,0,1021,179,1,0,0,0,1022,1023,5,107, - 0,0,1023,1024,5,2,0,0,1024,1029,5,156,0,0,1025,1026,5,107,0,0,1026, - 1027,5,2,0,0,1027,1029,5,158,0,0,1028,1022,1,0,0,0,1028,1025,1,0, - 0,0,1029,181,1,0,0,0,1030,1031,5,108,0,0,1031,1032,5,2,0,0,1032, - 1037,3,78,39,0,1033,1034,5,108,0,0,1034,1035,5,2,0,0,1035,1037,5, - 153,0,0,1036,1030,1,0,0,0,1036,1033,1,0,0,0,1037,183,1,0,0,0,1038, - 1039,5,109,0,0,1039,1040,5,2,0,0,1040,1045,5,156,0,0,1041,1042,5, - 109,0,0,1042,1043,5,2,0,0,1043,1045,5,159,0,0,1044,1038,1,0,0,0, - 1044,1041,1,0,0,0,1045,185,1,0,0,0,1046,1047,5,110,0,0,1047,1048, - 5,2,0,0,1048,1053,3,78,39,0,1049,1050,5,110,0,0,1050,1051,5,2,0, - 0,1051,1053,5,153,0,0,1052,1046,1,0,0,0,1052,1049,1,0,0,0,1053,187, - 1,0,0,0,1054,1055,5,111,0,0,1055,1056,5,2,0,0,1056,1057,3,234,117, - 0,1057,189,1,0,0,0,1058,1059,5,112,0,0,1059,1060,5,2,0,0,1060,1061, - 5,5,0,0,1061,1066,3,192,96,0,1062,1063,5,1,0,0,1063,1065,3,192,96, - 0,1064,1062,1,0,0,0,1065,1068,1,0,0,0,1066,1064,1,0,0,0,1066,1067, - 1,0,0,0,1067,1069,1,0,0,0,1068,1066,1,0,0,0,1069,1070,5,6,0,0,1070, - 191,1,0,0,0,1071,1074,3,28,14,0,1072,1074,3,66,33,0,1073,1071,1, - 0,0,0,1073,1072,1,0,0,0,1074,193,1,0,0,0,1075,1076,5,119,0,0,1076, - 1077,5,2,0,0,1077,1086,5,3,0,0,1078,1083,3,196,98,0,1079,1080,5, - 1,0,0,1080,1082,3,196,98,0,1081,1079,1,0,0,0,1082,1085,1,0,0,0,1083, - 1081,1,0,0,0,1083,1084,1,0,0,0,1084,1087,1,0,0,0,1085,1083,1,0,0, - 0,1086,1078,1,0,0,0,1086,1087,1,0,0,0,1087,1088,1,0,0,0,1088,1089, - 5,4,0,0,1089,195,1,0,0,0,1090,1091,5,5,0,0,1091,1096,3,198,99,0, - 1092,1093,5,1,0,0,1093,1095,3,198,99,0,1094,1092,1,0,0,0,1095,1098, - 1,0,0,0,1096,1094,1,0,0,0,1096,1097,1,0,0,0,1097,1099,1,0,0,0,1098, - 1096,1,0,0,0,1099,1100,5,6,0,0,1100,197,1,0,0,0,1101,1109,3,200, - 100,0,1102,1109,3,202,101,0,1103,1109,3,204,102,0,1104,1109,3,206, - 103,0,1105,1109,3,208,104,0,1106,1109,3,210,105,0,1107,1109,3,8, - 4,0,1108,1101,1,0,0,0,1108,1102,1,0,0,0,1108,1103,1,0,0,0,1108,1104, - 1,0,0,0,1108,1105,1,0,0,0,1108,1106,1,0,0,0,1108,1107,1,0,0,0,1109, - 199,1,0,0,0,1110,1111,5,120,0,0,1111,1112,5,2,0,0,1112,1113,5,3, - 0,0,1113,1118,3,224,112,0,1114,1115,5,1,0,0,1115,1117,3,224,112, - 0,1116,1114,1,0,0,0,1117,1120,1,0,0,0,1118,1116,1,0,0,0,1118,1119, - 1,0,0,0,1119,1121,1,0,0,0,1120,1118,1,0,0,0,1121,1122,5,4,0,0,1122, - 201,1,0,0,0,1123,1124,5,121,0,0,1124,1125,5,2,0,0,1125,1126,5,158, - 0,0,1126,203,1,0,0,0,1127,1128,5,122,0,0,1128,1129,5,2,0,0,1129, - 1130,5,158,0,0,1130,205,1,0,0,0,1131,1132,5,123,0,0,1132,1133,5, - 2,0,0,1133,1134,7,4,0,0,1134,207,1,0,0,0,1135,1136,5,124,0,0,1136, - 1137,5,2,0,0,1137,1138,5,158,0,0,1138,209,1,0,0,0,1139,1140,5,125, - 0,0,1140,1141,5,2,0,0,1141,1142,7,5,0,0,1142,211,1,0,0,0,1143,1144, - 5,128,0,0,1144,1145,5,2,0,0,1145,1154,5,3,0,0,1146,1151,3,214,107, - 0,1147,1148,5,1,0,0,1148,1150,3,214,107,0,1149,1147,1,0,0,0,1150, - 1153,1,0,0,0,1151,1149,1,0,0,0,1151,1152,1,0,0,0,1152,1155,1,0,0, - 0,1153,1151,1,0,0,0,1154,1146,1,0,0,0,1154,1155,1,0,0,0,1155,1156, - 1,0,0,0,1156,1157,5,4,0,0,1157,213,1,0,0,0,1158,1159,5,5,0,0,1159, - 1164,3,216,108,0,1160,1161,5,1,0,0,1161,1163,3,216,108,0,1162,1160, - 1,0,0,0,1163,1166,1,0,0,0,1164,1162,1,0,0,0,1164,1165,1,0,0,0,1165, - 1167,1,0,0,0,1166,1164,1,0,0,0,1167,1168,5,6,0,0,1168,215,1,0,0, - 0,1169,1176,3,200,100,0,1170,1176,3,34,17,0,1171,1176,3,26,13,0, - 1172,1176,3,90,45,0,1173,1176,3,108,54,0,1174,1176,3,8,4,0,1175, - 1169,1,0,0,0,1175,1170,1,0,0,0,1175,1171,1,0,0,0,1175,1172,1,0,0, - 0,1175,1173,1,0,0,0,1175,1174,1,0,0,0,1176,217,1,0,0,0,1177,1178, - 7,6,0,0,1178,219,1,0,0,0,1179,1180,7,7,0,0,1180,221,1,0,0,0,1181, - 1182,7,8,0,0,1182,223,1,0,0,0,1183,1186,3,222,111,0,1184,1186,3, - 234,117,0,1185,1183,1,0,0,0,1185,1184,1,0,0,0,1186,225,1,0,0,0,1187, - 1188,5,5,0,0,1188,1193,3,228,114,0,1189,1190,5,1,0,0,1190,1192,3, - 228,114,0,1191,1189,1,0,0,0,1192,1195,1,0,0,0,1193,1191,1,0,0,0, - 1193,1194,1,0,0,0,1194,1196,1,0,0,0,1195,1193,1,0,0,0,1196,1197, - 5,6,0,0,1197,1201,1,0,0,0,1198,1199,5,5,0,0,1199,1201,5,6,0,0,1200, - 1187,1,0,0,0,1200,1198,1,0,0,0,1201,227,1,0,0,0,1202,1203,3,234, - 117,0,1203,1204,5,2,0,0,1204,1205,3,232,116,0,1205,229,1,0,0,0,1206, - 1207,5,3,0,0,1207,1212,3,232,116,0,1208,1209,5,1,0,0,1209,1211,3, - 232,116,0,1210,1208,1,0,0,0,1211,1214,1,0,0,0,1212,1210,1,0,0,0, - 1212,1213,1,0,0,0,1213,1215,1,0,0,0,1214,1212,1,0,0,0,1215,1216, - 5,4,0,0,1216,1220,1,0,0,0,1217,1218,5,3,0,0,1218,1220,5,4,0,0,1219, - 1206,1,0,0,0,1219,1217,1,0,0,0,1220,231,1,0,0,0,1221,1231,5,159, - 0,0,1222,1231,5,158,0,0,1223,1231,5,7,0,0,1224,1231,5,8,0,0,1225, - 1231,5,9,0,0,1226,1231,3,228,114,0,1227,1231,3,230,115,0,1228,1231, - 3,226,113,0,1229,1231,3,234,117,0,1230,1221,1,0,0,0,1230,1222,1, - 0,0,0,1230,1223,1,0,0,0,1230,1224,1,0,0,0,1230,1225,1,0,0,0,1230, - 1226,1,0,0,0,1230,1227,1,0,0,0,1230,1228,1,0,0,0,1230,1229,1,0,0, - 0,1231,233,1,0,0,0,1232,1233,7,9,0,0,1233,235,1,0,0,0,94,245,256, - 321,331,348,375,377,387,399,401,417,431,439,453,461,469,477,485, - 493,504,512,520,536,544,552,560,570,577,595,603,610,615,622,636, - 641,653,658,675,680,690,695,703,711,725,730,739,749,754,762,778, - 789,799,804,811,817,828,833,844,860,870,883,892,902,909,931,940, - 954,963,973,983,1001,1012,1020,1028,1036,1044,1052,1066,1073,1083, - 1086,1096,1108,1118,1151,1154,1164,1175,1185,1193,1200,1212,1219, - 1230 + 7,1,7,1,7,1,7,1,7,3,7,324,8,7,1,8,1,8,1,8,1,8,1,8,1,8,5,8,332,8, + 8,10,8,12,8,335,9,8,1,8,1,8,1,9,1,9,1,10,1,10,1,10,1,10,1,11,1,11, + 1,11,1,11,5,11,349,8,11,10,11,12,11,352,9,11,1,11,1,11,1,12,1,12, + 1,12,1,12,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,15,1,15,1,15, + 1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,378,8,15,3,15,380,8,15,1, + 16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,3,17,390,8,17,1,18,1,18,1, + 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,402,8,18,3,18,404,8,18, + 1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21, + 1,21,3,21,420,8,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 1,22,1,22,1,22,3,22,434,8,22,1,23,1,23,1,23,1,23,1,23,1,23,3,23, + 442,8,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24, + 1,24,3,24,456,8,24,1,25,1,25,1,25,1,25,1,25,1,25,3,25,464,8,25,1, + 26,1,26,1,26,1,26,1,26,1,26,3,26,472,8,26,1,27,1,27,1,27,1,27,1, + 27,1,27,3,27,480,8,27,1,28,1,28,1,28,1,28,1,28,1,28,3,28,488,8,28, + 1,29,1,29,1,29,1,29,1,29,1,29,3,29,496,8,29,1,30,1,30,1,30,1,30, + 1,30,1,30,1,30,1,30,1,30,3,30,507,8,30,1,31,1,31,1,31,1,31,1,31, + 1,31,3,31,515,8,31,1,32,1,32,1,32,1,32,1,32,1,32,3,32,523,8,32,1, + 33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1, + 35,1,35,3,35,553,8,35,1,36,1,36,1,36,1,36,1,36,1,36,3,36,561,8,36, + 1,37,1,37,1,37,1,37,1,37,1,37,3,37,569,8,37,1,38,1,38,1,38,1,38, + 1,38,1,38,3,38,577,8,38,1,39,1,39,1,39,1,39,1,39,1,39,3,39,585,8, + 39,1,40,1,40,1,41,1,41,1,41,1,41,5,41,593,8,41,10,41,12,41,596,9, + 41,1,41,1,41,1,41,1,41,3,41,602,8,41,1,42,1,42,1,42,1,42,1,42,1, + 42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,620,8, + 42,1,43,1,43,1,43,1,43,5,43,626,8,43,10,43,12,43,629,9,43,1,43,1, + 43,1,43,1,43,3,43,635,8,43,1,44,1,44,1,44,3,44,640,8,44,1,45,1,45, + 1,45,1,45,1,45,3,45,647,8,45,1,46,1,46,1,46,1,46,1,47,1,47,1,47, + 1,47,1,47,1,47,5,47,659,8,47,10,47,12,47,662,9,47,1,47,1,47,3,47, + 666,8,47,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,5,49,676,8,49,10, + 49,12,49,679,9,49,1,49,1,49,3,49,683,8,49,1,50,1,50,1,50,1,50,1, + 50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,3,50,700,8, + 50,1,51,1,51,1,51,3,51,705,8,51,1,52,1,52,1,52,1,52,1,52,1,52,5, + 52,713,8,52,10,52,12,52,716,9,52,1,52,1,52,3,52,720,8,52,1,53,1, + 53,1,53,1,53,1,53,1,53,3,53,728,8,53,1,54,1,54,1,54,1,54,1,54,1, + 54,3,54,736,8,54,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1, + 56,5,56,748,8,56,10,56,12,56,751,9,56,1,56,1,56,3,56,755,8,56,1, + 57,1,57,1,57,1,57,1,58,1,58,1,58,3,58,764,8,58,1,59,1,59,1,59,1, + 59,1,59,1,59,5,59,772,8,59,10,59,12,59,775,9,59,1,59,1,59,3,59,779, + 8,59,1,60,1,60,1,60,1,60,1,60,1,60,3,60,787,8,60,1,61,1,61,1,61, + 1,61,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,5,63,801,8,63,10,63, + 12,63,804,9,63,1,63,1,63,1,64,1,64,1,64,1,64,4,64,812,8,64,11,64, + 12,64,813,1,64,1,64,1,64,1,64,1,64,1,64,5,64,822,8,64,10,64,12,64, + 825,9,64,1,64,1,64,3,64,829,8,64,1,65,1,65,1,65,1,65,1,65,3,65,836, + 8,65,1,66,1,66,1,66,1,66,3,66,842,8,66,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,5,67,851,8,67,10,67,12,67,854,9,67,1,67,1,67,3,67,858, + 8,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,3,68,869,8,68, + 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, + 1,69,3,69,885,8,69,1,70,1,70,1,70,1,70,1,70,1,70,5,70,893,8,70,10, + 70,12,70,896,9,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,5,71,906, + 8,71,10,71,12,71,909,9,71,1,71,1,71,1,72,1,72,1,72,1,72,3,72,917, + 8,72,1,73,1,73,1,73,1,73,1,73,1,73,5,73,925,8,73,10,73,12,73,928, + 9,73,1,73,1,73,1,74,1,74,3,74,934,8,74,1,75,1,75,1,75,1,75,1,76, + 1,76,1,77,1,77,1,77,1,77,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79, + 5,79,954,8,79,10,79,12,79,957,9,79,1,79,1,79,1,80,1,80,1,80,1,80, + 3,80,965,8,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82, + 5,82,977,8,82,10,82,12,82,980,9,82,1,82,1,82,1,83,1,83,1,83,1,83, + 3,83,988,8,83,1,84,1,84,1,84,1,84,1,84,1,84,5,84,996,8,84,10,84, + 12,84,999,9,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,3,85,1008,8,85, + 1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88, + 1,88,5,88,1024,8,88,10,88,12,88,1027,9,88,1,88,1,88,1,89,1,89,1, + 89,1,89,1,89,1,89,3,89,1037,8,89,1,90,1,90,1,90,1,90,1,90,1,90,3, + 90,1045,8,90,1,91,1,91,1,91,1,91,1,91,1,91,3,91,1053,8,91,1,92,1, + 92,1,92,1,92,1,92,1,92,3,92,1061,8,92,1,93,1,93,1,93,1,93,1,93,1, + 93,3,93,1069,8,93,1,94,1,94,1,94,1,94,1,94,1,94,3,94,1077,8,94,1, + 95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,5,96,1089,8,96,10, + 96,12,96,1092,9,96,1,96,1,96,1,97,1,97,3,97,1098,8,97,1,98,1,98, + 1,98,1,98,1,98,1,98,5,98,1106,8,98,10,98,12,98,1109,9,98,3,98,1111, + 8,98,1,98,1,98,1,99,1,99,1,99,1,99,5,99,1119,8,99,10,99,12,99,1122, + 9,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,1,100,3,100,1133, + 8,100,1,101,1,101,1,101,1,101,1,101,1,101,5,101,1141,8,101,10,101, + 12,101,1144,9,101,1,101,1,101,1,102,1,102,1,102,1,102,1,103,1,103, + 1,103,1,103,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,106, + 1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,5,107,1174, + 8,107,10,107,12,107,1177,9,107,3,107,1179,8,107,1,107,1,107,1,108, + 1,108,1,108,1,108,5,108,1187,8,108,10,108,12,108,1190,9,108,1,108, + 1,108,1,109,1,109,1,109,1,109,1,109,1,109,3,109,1200,8,109,1,110, + 1,110,1,111,1,111,1,112,1,112,1,113,1,113,3,113,1210,8,113,1,114, + 1,114,1,114,1,114,5,114,1216,8,114,10,114,12,114,1219,9,114,1,114, + 1,114,1,114,1,114,3,114,1225,8,114,1,115,1,115,1,115,1,115,1,116, + 1,116,1,116,1,116,5,116,1235,8,116,10,116,12,116,1238,9,116,1,116, + 1,116,1,116,1,116,3,116,1244,8,116,1,117,1,117,1,117,1,117,1,117, + 1,117,1,117,1,117,1,117,3,117,1255,8,117,1,118,1,118,1,118,0,0,119, + 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44, + 46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88, + 90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124, + 126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156, + 158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188, + 190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220, + 222,224,226,228,230,232,234,236,0,10,1,0,132,133,1,0,7,8,1,0,16, + 23,1,0,81,82,1,0,160,161,1,0,128,129,3,0,30,37,39,48,50,70,3,0,29, + 29,38,38,49,49,1,0,137,152,6,0,10,13,15,117,119,119,121,131,134, + 137,139,159,1347,0,238,1,0,0,0,2,241,1,0,0,0,4,258,1,0,0,0,6,260, + 1,0,0,0,8,264,1,0,0,0,10,268,1,0,0,0,12,272,1,0,0,0,14,323,1,0,0, + 0,16,325,1,0,0,0,18,338,1,0,0,0,20,340,1,0,0,0,22,344,1,0,0,0,24, + 355,1,0,0,0,26,359,1,0,0,0,28,363,1,0,0,0,30,379,1,0,0,0,32,381, + 1,0,0,0,34,385,1,0,0,0,36,403,1,0,0,0,38,405,1,0,0,0,40,409,1,0, + 0,0,42,419,1,0,0,0,44,433,1,0,0,0,46,441,1,0,0,0,48,455,1,0,0,0, + 50,463,1,0,0,0,52,471,1,0,0,0,54,479,1,0,0,0,56,487,1,0,0,0,58,495, + 1,0,0,0,60,506,1,0,0,0,62,514,1,0,0,0,64,522,1,0,0,0,66,524,1,0, + 0,0,68,528,1,0,0,0,70,552,1,0,0,0,72,560,1,0,0,0,74,568,1,0,0,0, + 76,576,1,0,0,0,78,584,1,0,0,0,80,586,1,0,0,0,82,601,1,0,0,0,84,619, + 1,0,0,0,86,634,1,0,0,0,88,639,1,0,0,0,90,646,1,0,0,0,92,648,1,0, + 0,0,94,665,1,0,0,0,96,667,1,0,0,0,98,682,1,0,0,0,100,699,1,0,0,0, + 102,704,1,0,0,0,104,719,1,0,0,0,106,727,1,0,0,0,108,735,1,0,0,0, + 110,737,1,0,0,0,112,754,1,0,0,0,114,756,1,0,0,0,116,763,1,0,0,0, + 118,778,1,0,0,0,120,786,1,0,0,0,122,788,1,0,0,0,124,792,1,0,0,0, + 126,794,1,0,0,0,128,828,1,0,0,0,130,835,1,0,0,0,132,841,1,0,0,0, + 134,843,1,0,0,0,136,868,1,0,0,0,138,884,1,0,0,0,140,886,1,0,0,0, + 142,899,1,0,0,0,144,916,1,0,0,0,146,918,1,0,0,0,148,933,1,0,0,0, + 150,935,1,0,0,0,152,939,1,0,0,0,154,941,1,0,0,0,156,945,1,0,0,0, + 158,947,1,0,0,0,160,964,1,0,0,0,162,966,1,0,0,0,164,970,1,0,0,0, + 166,987,1,0,0,0,168,989,1,0,0,0,170,1007,1,0,0,0,172,1009,1,0,0, + 0,174,1013,1,0,0,0,176,1017,1,0,0,0,178,1036,1,0,0,0,180,1044,1, + 0,0,0,182,1052,1,0,0,0,184,1060,1,0,0,0,186,1068,1,0,0,0,188,1076, + 1,0,0,0,190,1078,1,0,0,0,192,1082,1,0,0,0,194,1097,1,0,0,0,196,1099, + 1,0,0,0,198,1114,1,0,0,0,200,1132,1,0,0,0,202,1134,1,0,0,0,204,1147, + 1,0,0,0,206,1151,1,0,0,0,208,1155,1,0,0,0,210,1159,1,0,0,0,212,1163, + 1,0,0,0,214,1167,1,0,0,0,216,1182,1,0,0,0,218,1199,1,0,0,0,220,1201, + 1,0,0,0,222,1203,1,0,0,0,224,1205,1,0,0,0,226,1209,1,0,0,0,228,1224, + 1,0,0,0,230,1226,1,0,0,0,232,1243,1,0,0,0,234,1254,1,0,0,0,236,1256, + 1,0,0,0,238,239,3,2,1,0,239,240,5,0,0,1,240,1,1,0,0,0,241,242,5, + 5,0,0,242,247,3,4,2,0,243,244,5,1,0,0,244,246,3,4,2,0,245,243,1, + 0,0,0,246,249,1,0,0,0,247,245,1,0,0,0,247,248,1,0,0,0,248,250,1, + 0,0,0,249,247,1,0,0,0,250,251,5,6,0,0,251,3,1,0,0,0,252,259,3,8, + 4,0,253,259,3,10,5,0,254,259,3,12,6,0,255,259,3,6,3,0,256,259,3, + 16,8,0,257,259,3,72,36,0,258,252,1,0,0,0,258,253,1,0,0,0,258,254, + 1,0,0,0,258,255,1,0,0,0,258,256,1,0,0,0,258,257,1,0,0,0,259,5,1, + 0,0,0,260,261,5,12,0,0,261,262,5,2,0,0,262,263,3,236,118,0,263,7, + 1,0,0,0,264,265,5,10,0,0,265,266,5,2,0,0,266,267,3,236,118,0,267, + 9,1,0,0,0,268,269,5,14,0,0,269,270,5,2,0,0,270,271,3,236,118,0,271, + 11,1,0,0,0,272,273,5,131,0,0,273,274,5,2,0,0,274,275,7,0,0,0,275, + 13,1,0,0,0,276,324,3,8,4,0,277,324,3,12,6,0,278,324,3,24,12,0,279, + 324,3,30,15,0,280,324,3,28,14,0,281,324,3,26,13,0,282,324,3,32,16, + 0,283,324,3,34,17,0,284,324,3,36,18,0,285,324,3,38,19,0,286,324, + 3,40,20,0,287,324,3,126,63,0,288,324,3,42,21,0,289,324,3,44,22,0, + 290,324,3,46,23,0,291,324,3,48,24,0,292,324,3,50,25,0,293,324,3, + 52,26,0,294,324,3,54,27,0,295,324,3,56,28,0,296,324,3,58,29,0,297, + 324,3,60,30,0,298,324,3,142,71,0,299,324,3,158,79,0,300,324,3,162, + 81,0,301,324,3,164,82,0,302,324,3,62,31,0,303,324,3,64,32,0,304, + 324,3,72,36,0,305,324,3,74,37,0,306,324,3,76,38,0,307,324,3,78,39, + 0,308,324,3,140,70,0,309,324,3,66,33,0,310,324,3,196,98,0,311,324, + 3,214,107,0,312,324,3,122,61,0,313,324,3,182,91,0,314,324,3,184, + 92,0,315,324,3,186,93,0,316,324,3,188,94,0,317,324,3,190,95,0,318, + 324,3,192,96,0,319,324,3,92,46,0,320,324,3,108,54,0,321,324,3,110, + 55,0,322,324,3,68,34,0,323,276,1,0,0,0,323,277,1,0,0,0,323,278,1, + 0,0,0,323,279,1,0,0,0,323,280,1,0,0,0,323,281,1,0,0,0,323,282,1, + 0,0,0,323,283,1,0,0,0,323,284,1,0,0,0,323,285,1,0,0,0,323,286,1, + 0,0,0,323,287,1,0,0,0,323,288,1,0,0,0,323,289,1,0,0,0,323,290,1, + 0,0,0,323,291,1,0,0,0,323,292,1,0,0,0,323,293,1,0,0,0,323,294,1, + 0,0,0,323,295,1,0,0,0,323,296,1,0,0,0,323,297,1,0,0,0,323,298,1, + 0,0,0,323,299,1,0,0,0,323,300,1,0,0,0,323,301,1,0,0,0,323,302,1, + 0,0,0,323,303,1,0,0,0,323,304,1,0,0,0,323,305,1,0,0,0,323,306,1, + 0,0,0,323,307,1,0,0,0,323,308,1,0,0,0,323,309,1,0,0,0,323,310,1, + 0,0,0,323,311,1,0,0,0,323,312,1,0,0,0,323,313,1,0,0,0,323,314,1, + 0,0,0,323,315,1,0,0,0,323,316,1,0,0,0,323,317,1,0,0,0,323,318,1, + 0,0,0,323,319,1,0,0,0,323,320,1,0,0,0,323,321,1,0,0,0,323,322,1, + 0,0,0,324,15,1,0,0,0,325,326,5,11,0,0,326,327,5,2,0,0,327,328,5, + 5,0,0,328,333,3,20,10,0,329,330,5,1,0,0,330,332,3,20,10,0,331,329, + 1,0,0,0,332,335,1,0,0,0,333,331,1,0,0,0,333,334,1,0,0,0,334,336, + 1,0,0,0,335,333,1,0,0,0,336,337,5,6,0,0,337,17,1,0,0,0,338,339,3, + 236,118,0,339,19,1,0,0,0,340,341,3,18,9,0,341,342,5,2,0,0,342,343, + 3,22,11,0,343,21,1,0,0,0,344,345,5,5,0,0,345,350,3,14,7,0,346,347, + 5,1,0,0,347,349,3,14,7,0,348,346,1,0,0,0,349,352,1,0,0,0,350,348, + 1,0,0,0,350,351,1,0,0,0,351,353,1,0,0,0,352,350,1,0,0,0,353,354, + 5,6,0,0,354,23,1,0,0,0,355,356,5,15,0,0,356,357,5,2,0,0,357,358, + 3,124,62,0,358,25,1,0,0,0,359,360,5,115,0,0,360,361,5,2,0,0,361, + 362,3,236,118,0,362,27,1,0,0,0,363,364,5,90,0,0,364,365,5,2,0,0, + 365,366,3,236,118,0,366,29,1,0,0,0,367,368,5,91,0,0,368,369,5,2, + 0,0,369,380,3,80,40,0,370,371,5,91,0,0,371,372,5,2,0,0,372,380,5, + 154,0,0,373,374,5,91,0,0,374,377,5,2,0,0,375,378,5,9,0,0,376,378, + 3,236,118,0,377,375,1,0,0,0,377,376,1,0,0,0,378,380,1,0,0,0,379, + 367,1,0,0,0,379,370,1,0,0,0,379,373,1,0,0,0,380,31,1,0,0,0,381,382, + 5,96,0,0,382,383,5,2,0,0,383,384,3,234,117,0,384,33,1,0,0,0,385, + 386,5,95,0,0,386,389,5,2,0,0,387,390,5,9,0,0,388,390,3,236,118,0, + 389,387,1,0,0,0,389,388,1,0,0,0,390,35,1,0,0,0,391,392,5,92,0,0, + 392,393,5,2,0,0,393,404,3,80,40,0,394,395,5,92,0,0,395,396,5,2,0, + 0,396,404,5,154,0,0,397,398,5,92,0,0,398,401,5,2,0,0,399,402,5,9, + 0,0,400,402,3,236,118,0,401,399,1,0,0,0,401,400,1,0,0,0,402,404, + 1,0,0,0,403,391,1,0,0,0,403,394,1,0,0,0,403,397,1,0,0,0,404,37,1, + 0,0,0,405,406,5,116,0,0,406,407,5,2,0,0,407,408,7,1,0,0,408,39,1, + 0,0,0,409,410,5,27,0,0,410,411,5,2,0,0,411,412,3,236,118,0,412,41, + 1,0,0,0,413,414,5,119,0,0,414,415,5,2,0,0,415,420,5,158,0,0,416, + 417,5,119,0,0,417,418,5,2,0,0,418,420,3,236,118,0,419,413,1,0,0, + 0,419,416,1,0,0,0,420,43,1,0,0,0,421,422,5,120,0,0,422,423,5,2,0, + 0,423,434,3,80,40,0,424,425,5,120,0,0,425,426,5,2,0,0,426,434,5, + 155,0,0,427,428,5,120,0,0,428,429,5,2,0,0,429,434,5,154,0,0,430, + 431,5,120,0,0,431,432,5,2,0,0,432,434,5,157,0,0,433,421,1,0,0,0, + 433,424,1,0,0,0,433,427,1,0,0,0,433,430,1,0,0,0,434,45,1,0,0,0,435, + 436,5,117,0,0,436,437,5,2,0,0,437,442,5,158,0,0,438,439,5,117,0, + 0,439,440,5,2,0,0,440,442,3,236,118,0,441,435,1,0,0,0,441,438,1, + 0,0,0,442,47,1,0,0,0,443,444,5,118,0,0,444,445,5,2,0,0,445,456,3, + 80,40,0,446,447,5,118,0,0,447,448,5,2,0,0,448,456,5,155,0,0,449, + 450,5,118,0,0,450,451,5,2,0,0,451,456,5,154,0,0,452,453,5,118,0, + 0,453,454,5,2,0,0,454,456,5,157,0,0,455,443,1,0,0,0,455,446,1,0, + 0,0,455,449,1,0,0,0,455,452,1,0,0,0,456,49,1,0,0,0,457,458,5,72, + 0,0,458,459,5,2,0,0,459,464,5,158,0,0,460,461,5,72,0,0,461,462,5, + 2,0,0,462,464,5,160,0,0,463,457,1,0,0,0,463,460,1,0,0,0,464,51,1, + 0,0,0,465,466,5,71,0,0,466,467,5,2,0,0,467,472,3,80,40,0,468,469, + 5,71,0,0,469,470,5,2,0,0,470,472,3,236,118,0,471,465,1,0,0,0,471, + 468,1,0,0,0,472,53,1,0,0,0,473,474,5,74,0,0,474,475,5,2,0,0,475, + 480,5,158,0,0,476,477,5,74,0,0,477,478,5,2,0,0,478,480,3,236,118, + 0,479,473,1,0,0,0,479,476,1,0,0,0,480,55,1,0,0,0,481,482,5,73,0, + 0,482,483,5,2,0,0,483,488,3,80,40,0,484,485,5,73,0,0,485,486,5,2, + 0,0,486,488,3,236,118,0,487,481,1,0,0,0,487,484,1,0,0,0,488,57,1, + 0,0,0,489,490,5,93,0,0,490,491,5,2,0,0,491,496,3,118,59,0,492,493, + 5,93,0,0,493,494,5,2,0,0,494,496,5,158,0,0,495,489,1,0,0,0,495,492, + 1,0,0,0,496,59,1,0,0,0,497,498,5,94,0,0,498,499,5,2,0,0,499,507, + 5,154,0,0,500,501,5,94,0,0,501,502,5,2,0,0,502,507,3,80,40,0,503, + 504,5,94,0,0,504,505,5,2,0,0,505,507,3,236,118,0,506,497,1,0,0,0, + 506,500,1,0,0,0,506,503,1,0,0,0,507,61,1,0,0,0,508,509,5,89,0,0, + 509,510,5,2,0,0,510,515,5,158,0,0,511,512,5,89,0,0,512,513,5,2,0, + 0,513,515,5,160,0,0,514,508,1,0,0,0,514,511,1,0,0,0,515,63,1,0,0, + 0,516,517,5,88,0,0,517,518,5,2,0,0,518,523,3,80,40,0,519,520,5,88, + 0,0,520,521,5,2,0,0,521,523,5,155,0,0,522,516,1,0,0,0,522,519,1, + 0,0,0,523,65,1,0,0,0,524,525,5,97,0,0,525,526,5,2,0,0,526,527,3, + 82,41,0,527,67,1,0,0,0,528,529,5,98,0,0,529,530,5,2,0,0,530,531, + 5,5,0,0,531,532,3,70,35,0,532,533,5,6,0,0,533,69,1,0,0,0,534,535, + 5,99,0,0,535,536,5,2,0,0,536,553,5,158,0,0,537,538,5,100,0,0,538, + 539,5,2,0,0,539,553,5,155,0,0,540,541,5,100,0,0,541,542,5,2,0,0, + 542,553,5,154,0,0,543,544,5,100,0,0,544,545,5,2,0,0,545,553,5,157, + 0,0,546,547,5,100,0,0,547,548,5,2,0,0,548,553,3,80,40,0,549,550, + 5,99,0,0,550,551,5,2,0,0,551,553,3,236,118,0,552,534,1,0,0,0,552, + 537,1,0,0,0,552,540,1,0,0,0,552,543,1,0,0,0,552,546,1,0,0,0,552, + 549,1,0,0,0,553,71,1,0,0,0,554,555,5,75,0,0,555,556,5,2,0,0,556, + 561,5,158,0,0,557,558,5,75,0,0,558,559,5,2,0,0,559,561,5,160,0,0, + 560,554,1,0,0,0,560,557,1,0,0,0,561,73,1,0,0,0,562,563,5,76,0,0, + 563,564,5,2,0,0,564,569,3,80,40,0,565,566,5,76,0,0,566,567,5,2,0, + 0,567,569,5,155,0,0,568,562,1,0,0,0,568,565,1,0,0,0,569,75,1,0,0, + 0,570,571,5,77,0,0,571,572,5,2,0,0,572,577,5,158,0,0,573,574,5,77, + 0,0,574,575,5,2,0,0,575,577,5,160,0,0,576,570,1,0,0,0,576,573,1, + 0,0,0,577,77,1,0,0,0,578,579,5,78,0,0,579,580,5,2,0,0,580,585,3, + 80,40,0,581,582,5,78,0,0,582,583,5,2,0,0,583,585,5,155,0,0,584,578, + 1,0,0,0,584,581,1,0,0,0,585,79,1,0,0,0,586,587,5,156,0,0,587,81, + 1,0,0,0,588,589,5,5,0,0,589,594,3,84,42,0,590,591,5,1,0,0,591,593, + 3,84,42,0,592,590,1,0,0,0,593,596,1,0,0,0,594,592,1,0,0,0,594,595, + 1,0,0,0,595,597,1,0,0,0,596,594,1,0,0,0,597,598,5,6,0,0,598,602, + 1,0,0,0,599,600,5,5,0,0,600,602,5,6,0,0,601,588,1,0,0,0,601,599, + 1,0,0,0,602,83,1,0,0,0,603,604,5,153,0,0,604,605,5,2,0,0,605,620, + 5,155,0,0,606,607,5,153,0,0,607,608,5,2,0,0,608,620,5,154,0,0,609, + 610,5,153,0,0,610,611,5,2,0,0,611,620,5,157,0,0,612,613,5,153,0, + 0,613,614,5,2,0,0,614,620,3,80,40,0,615,616,3,236,118,0,616,617, + 5,2,0,0,617,618,3,88,44,0,618,620,1,0,0,0,619,603,1,0,0,0,619,606, + 1,0,0,0,619,609,1,0,0,0,619,612,1,0,0,0,619,615,1,0,0,0,620,85,1, + 0,0,0,621,622,5,3,0,0,622,627,3,88,44,0,623,624,5,1,0,0,624,626, + 3,88,44,0,625,623,1,0,0,0,626,629,1,0,0,0,627,625,1,0,0,0,627,628, + 1,0,0,0,628,630,1,0,0,0,629,627,1,0,0,0,630,631,5,4,0,0,631,635, + 1,0,0,0,632,633,5,3,0,0,633,635,5,4,0,0,634,621,1,0,0,0,634,632, + 1,0,0,0,635,87,1,0,0,0,636,640,3,86,43,0,637,640,3,82,41,0,638,640, + 3,90,45,0,639,636,1,0,0,0,639,637,1,0,0,0,639,638,1,0,0,0,640,89, + 1,0,0,0,641,647,5,161,0,0,642,647,5,160,0,0,643,647,7,1,0,0,644, + 647,5,9,0,0,645,647,3,236,118,0,646,641,1,0,0,0,646,642,1,0,0,0, + 646,643,1,0,0,0,646,644,1,0,0,0,646,645,1,0,0,0,647,91,1,0,0,0,648, + 649,5,134,0,0,649,650,5,2,0,0,650,651,3,94,47,0,651,93,1,0,0,0,652, + 653,5,5,0,0,653,666,5,6,0,0,654,655,5,5,0,0,655,660,3,96,48,0,656, + 657,5,1,0,0,657,659,3,96,48,0,658,656,1,0,0,0,659,662,1,0,0,0,660, + 658,1,0,0,0,660,661,1,0,0,0,661,663,1,0,0,0,662,660,1,0,0,0,663, + 664,5,6,0,0,664,666,1,0,0,0,665,652,1,0,0,0,665,654,1,0,0,0,666, + 95,1,0,0,0,667,668,3,100,50,0,668,97,1,0,0,0,669,670,5,5,0,0,670, + 683,5,6,0,0,671,672,5,5,0,0,672,677,3,100,50,0,673,674,5,1,0,0,674, + 676,3,100,50,0,675,673,1,0,0,0,676,679,1,0,0,0,677,675,1,0,0,0,677, + 678,1,0,0,0,678,680,1,0,0,0,679,677,1,0,0,0,680,681,5,6,0,0,681, + 683,1,0,0,0,682,669,1,0,0,0,682,671,1,0,0,0,683,99,1,0,0,0,684,685, + 5,153,0,0,685,686,5,2,0,0,686,700,5,155,0,0,687,688,5,153,0,0,688, + 689,5,2,0,0,689,700,5,154,0,0,690,691,5,153,0,0,691,692,5,2,0,0, + 692,700,3,80,40,0,693,694,5,153,0,0,694,695,5,2,0,0,695,700,5,157, + 0,0,696,697,5,159,0,0,697,698,5,2,0,0,698,700,3,102,51,0,699,684, + 1,0,0,0,699,687,1,0,0,0,699,690,1,0,0,0,699,693,1,0,0,0,699,696, + 1,0,0,0,700,101,1,0,0,0,701,705,3,98,49,0,702,705,3,104,52,0,703, + 705,3,106,53,0,704,701,1,0,0,0,704,702,1,0,0,0,704,703,1,0,0,0,705, + 103,1,0,0,0,706,707,5,3,0,0,707,720,5,4,0,0,708,709,5,3,0,0,709, + 714,3,102,51,0,710,711,5,1,0,0,711,713,3,102,51,0,712,710,1,0,0, + 0,713,716,1,0,0,0,714,712,1,0,0,0,714,715,1,0,0,0,715,717,1,0,0, + 0,716,714,1,0,0,0,717,718,5,4,0,0,718,720,1,0,0,0,719,706,1,0,0, + 0,719,708,1,0,0,0,720,105,1,0,0,0,721,728,5,161,0,0,722,728,5,160, + 0,0,723,728,7,1,0,0,724,728,5,9,0,0,725,728,5,158,0,0,726,728,3, + 236,118,0,727,721,1,0,0,0,727,722,1,0,0,0,727,723,1,0,0,0,727,724, + 1,0,0,0,727,725,1,0,0,0,727,726,1,0,0,0,728,107,1,0,0,0,729,730, + 5,136,0,0,730,731,5,2,0,0,731,736,3,112,56,0,732,733,5,136,0,0,733, + 734,5,2,0,0,734,736,5,158,0,0,735,729,1,0,0,0,735,732,1,0,0,0,736, + 109,1,0,0,0,737,738,5,135,0,0,738,739,5,2,0,0,739,740,3,116,58,0, + 740,111,1,0,0,0,741,742,5,5,0,0,742,755,5,6,0,0,743,744,5,5,0,0, + 744,749,3,114,57,0,745,746,5,1,0,0,746,748,3,114,57,0,747,745,1, + 0,0,0,748,751,1,0,0,0,749,747,1,0,0,0,749,750,1,0,0,0,750,752,1, + 0,0,0,751,749,1,0,0,0,752,753,5,6,0,0,753,755,1,0,0,0,754,741,1, + 0,0,0,754,743,1,0,0,0,755,113,1,0,0,0,756,757,3,236,118,0,757,758, + 5,2,0,0,758,759,3,116,58,0,759,115,1,0,0,0,760,764,3,112,56,0,761, + 764,3,118,59,0,762,764,3,120,60,0,763,760,1,0,0,0,763,761,1,0,0, + 0,763,762,1,0,0,0,764,117,1,0,0,0,765,766,5,3,0,0,766,779,5,4,0, + 0,767,768,5,3,0,0,768,773,3,116,58,0,769,770,5,1,0,0,770,772,3,116, + 58,0,771,769,1,0,0,0,772,775,1,0,0,0,773,771,1,0,0,0,773,774,1,0, + 0,0,774,776,1,0,0,0,775,773,1,0,0,0,776,777,5,4,0,0,777,779,1,0, + 0,0,778,765,1,0,0,0,778,767,1,0,0,0,779,119,1,0,0,0,780,787,5,161, + 0,0,781,787,5,160,0,0,782,787,7,1,0,0,783,787,5,9,0,0,784,787,5, + 158,0,0,785,787,3,236,118,0,786,780,1,0,0,0,786,781,1,0,0,0,786, + 782,1,0,0,0,786,783,1,0,0,0,786,784,1,0,0,0,786,785,1,0,0,0,787, + 121,1,0,0,0,788,789,5,101,0,0,789,790,5,2,0,0,790,791,3,82,41,0, + 791,123,1,0,0,0,792,793,7,2,0,0,793,125,1,0,0,0,794,795,5,24,0,0, + 795,796,5,2,0,0,796,797,5,3,0,0,797,802,3,128,64,0,798,799,5,1,0, + 0,799,801,3,128,64,0,800,798,1,0,0,0,801,804,1,0,0,0,802,800,1,0, + 0,0,802,803,1,0,0,0,803,805,1,0,0,0,804,802,1,0,0,0,805,806,5,4, + 0,0,806,127,1,0,0,0,807,808,5,5,0,0,808,811,3,130,65,0,809,810,5, + 1,0,0,810,812,3,130,65,0,811,809,1,0,0,0,812,813,1,0,0,0,813,811, + 1,0,0,0,813,814,1,0,0,0,814,815,1,0,0,0,815,816,5,6,0,0,816,829, + 1,0,0,0,817,818,5,5,0,0,818,823,3,132,66,0,819,820,5,1,0,0,820,822, + 3,132,66,0,821,819,1,0,0,0,822,825,1,0,0,0,823,821,1,0,0,0,823,824, + 1,0,0,0,824,826,1,0,0,0,825,823,1,0,0,0,826,827,5,6,0,0,827,829, + 1,0,0,0,828,807,1,0,0,0,828,817,1,0,0,0,829,129,1,0,0,0,830,836, + 3,136,68,0,831,836,3,138,69,0,832,836,3,26,13,0,833,836,3,92,46, + 0,834,836,3,8,4,0,835,830,1,0,0,0,835,831,1,0,0,0,835,832,1,0,0, + 0,835,833,1,0,0,0,835,834,1,0,0,0,836,131,1,0,0,0,837,842,3,134, + 67,0,838,842,3,26,13,0,839,842,3,92,46,0,840,842,3,8,4,0,841,837, + 1,0,0,0,841,838,1,0,0,0,841,839,1,0,0,0,841,840,1,0,0,0,842,133, + 1,0,0,0,843,844,3,222,111,0,844,857,5,2,0,0,845,858,3,128,64,0,846, + 847,5,3,0,0,847,852,3,128,64,0,848,849,5,1,0,0,849,851,3,128,64, + 0,850,848,1,0,0,0,851,854,1,0,0,0,852,850,1,0,0,0,852,853,1,0,0, + 0,853,855,1,0,0,0,854,852,1,0,0,0,855,856,5,4,0,0,856,858,1,0,0, + 0,857,845,1,0,0,0,857,846,1,0,0,0,858,135,1,0,0,0,859,860,5,26,0, + 0,860,861,5,2,0,0,861,869,5,155,0,0,862,863,5,26,0,0,863,864,5,2, + 0,0,864,869,3,80,40,0,865,866,5,26,0,0,866,867,5,2,0,0,867,869,5, + 154,0,0,868,859,1,0,0,0,868,862,1,0,0,0,868,865,1,0,0,0,869,137, + 1,0,0,0,870,871,5,25,0,0,871,872,5,2,0,0,872,885,7,1,0,0,873,874, + 5,25,0,0,874,875,5,2,0,0,875,885,5,158,0,0,876,877,3,220,110,0,877, + 878,5,2,0,0,878,879,3,80,40,0,879,885,1,0,0,0,880,881,3,220,110, + 0,881,882,5,2,0,0,882,883,3,234,117,0,883,885,1,0,0,0,884,870,1, + 0,0,0,884,873,1,0,0,0,884,876,1,0,0,0,884,880,1,0,0,0,885,139,1, + 0,0,0,886,887,5,28,0,0,887,888,5,2,0,0,888,889,5,3,0,0,889,894,3, + 2,1,0,890,891,5,1,0,0,891,893,3,2,1,0,892,890,1,0,0,0,893,896,1, + 0,0,0,894,892,1,0,0,0,894,895,1,0,0,0,895,897,1,0,0,0,896,894,1, + 0,0,0,897,898,5,4,0,0,898,141,1,0,0,0,899,900,5,85,0,0,900,901,5, + 2,0,0,901,902,5,5,0,0,902,907,3,144,72,0,903,904,5,1,0,0,904,906, + 3,144,72,0,905,903,1,0,0,0,906,909,1,0,0,0,907,905,1,0,0,0,907,908, + 1,0,0,0,908,910,1,0,0,0,909,907,1,0,0,0,910,911,5,6,0,0,911,143, + 1,0,0,0,912,917,3,146,73,0,913,917,3,6,3,0,914,917,3,16,8,0,915, + 917,3,8,4,0,916,912,1,0,0,0,916,913,1,0,0,0,916,914,1,0,0,0,916, + 915,1,0,0,0,917,145,1,0,0,0,918,919,5,79,0,0,919,920,5,2,0,0,920, + 921,5,5,0,0,921,926,3,148,74,0,922,923,5,1,0,0,923,925,3,148,74, + 0,924,922,1,0,0,0,925,928,1,0,0,0,926,924,1,0,0,0,926,927,1,0,0, + 0,927,929,1,0,0,0,928,926,1,0,0,0,929,930,5,6,0,0,930,147,1,0,0, + 0,931,934,3,150,75,0,932,934,3,154,77,0,933,931,1,0,0,0,933,932, + 1,0,0,0,934,149,1,0,0,0,935,936,5,80,0,0,936,937,5,2,0,0,937,938, + 3,152,76,0,938,151,1,0,0,0,939,940,7,3,0,0,940,153,1,0,0,0,941,942, + 5,83,0,0,942,943,5,2,0,0,943,944,3,156,78,0,944,155,1,0,0,0,945, + 946,5,84,0,0,946,157,1,0,0,0,947,948,5,86,0,0,948,949,5,2,0,0,949, + 950,5,5,0,0,950,955,3,160,80,0,951,952,5,1,0,0,952,954,3,160,80, + 0,953,951,1,0,0,0,954,957,1,0,0,0,955,953,1,0,0,0,955,956,1,0,0, + 0,956,958,1,0,0,0,957,955,1,0,0,0,958,959,5,6,0,0,959,159,1,0,0, + 0,960,965,3,6,3,0,961,965,3,16,8,0,962,965,3,8,4,0,963,965,3,146, + 73,0,964,960,1,0,0,0,964,961,1,0,0,0,964,962,1,0,0,0,964,963,1,0, + 0,0,965,161,1,0,0,0,966,967,5,87,0,0,967,968,5,2,0,0,968,969,3,82, + 41,0,969,163,1,0,0,0,970,971,5,102,0,0,971,972,5,2,0,0,972,973,5, + 5,0,0,973,978,3,166,83,0,974,975,5,1,0,0,975,977,3,166,83,0,976, + 974,1,0,0,0,977,980,1,0,0,0,978,976,1,0,0,0,978,979,1,0,0,0,979, + 981,1,0,0,0,980,978,1,0,0,0,981,982,5,6,0,0,982,165,1,0,0,0,983, + 988,3,28,14,0,984,988,3,168,84,0,985,988,3,66,33,0,986,988,3,108, + 54,0,987,983,1,0,0,0,987,984,1,0,0,0,987,985,1,0,0,0,987,986,1,0, + 0,0,988,167,1,0,0,0,989,990,5,103,0,0,990,991,5,2,0,0,991,992,5, + 5,0,0,992,997,3,170,85,0,993,994,5,1,0,0,994,996,3,170,85,0,995, + 993,1,0,0,0,996,999,1,0,0,0,997,995,1,0,0,0,997,998,1,0,0,0,998, + 1000,1,0,0,0,999,997,1,0,0,0,1000,1001,5,6,0,0,1001,169,1,0,0,0, + 1002,1008,3,172,86,0,1003,1008,3,174,87,0,1004,1008,3,176,88,0,1005, + 1008,3,178,89,0,1006,1008,3,180,90,0,1007,1002,1,0,0,0,1007,1003, + 1,0,0,0,1007,1004,1,0,0,0,1007,1005,1,0,0,0,1007,1006,1,0,0,0,1008, + 171,1,0,0,0,1009,1010,5,104,0,0,1010,1011,5,2,0,0,1011,1012,3,236, + 118,0,1012,173,1,0,0,0,1013,1014,5,105,0,0,1014,1015,5,2,0,0,1015, + 1016,3,236,118,0,1016,175,1,0,0,0,1017,1018,5,106,0,0,1018,1019, + 5,2,0,0,1019,1020,5,3,0,0,1020,1025,3,236,118,0,1021,1022,5,1,0, + 0,1022,1024,3,236,118,0,1023,1021,1,0,0,0,1024,1027,1,0,0,0,1025, + 1023,1,0,0,0,1025,1026,1,0,0,0,1026,1028,1,0,0,0,1027,1025,1,0,0, + 0,1028,1029,5,4,0,0,1029,177,1,0,0,0,1030,1031,5,107,0,0,1031,1032, + 5,2,0,0,1032,1037,5,158,0,0,1033,1034,5,107,0,0,1034,1035,5,2,0, + 0,1035,1037,5,160,0,0,1036,1030,1,0,0,0,1036,1033,1,0,0,0,1037,179, + 1,0,0,0,1038,1039,5,108,0,0,1039,1040,5,2,0,0,1040,1045,3,80,40, + 0,1041,1042,5,108,0,0,1042,1043,5,2,0,0,1043,1045,5,155,0,0,1044, + 1038,1,0,0,0,1044,1041,1,0,0,0,1045,181,1,0,0,0,1046,1047,5,109, + 0,0,1047,1048,5,2,0,0,1048,1053,5,158,0,0,1049,1050,5,109,0,0,1050, + 1051,5,2,0,0,1051,1053,5,160,0,0,1052,1046,1,0,0,0,1052,1049,1,0, + 0,0,1053,183,1,0,0,0,1054,1055,5,110,0,0,1055,1056,5,2,0,0,1056, + 1061,3,80,40,0,1057,1058,5,110,0,0,1058,1059,5,2,0,0,1059,1061,5, + 155,0,0,1060,1054,1,0,0,0,1060,1057,1,0,0,0,1061,185,1,0,0,0,1062, + 1063,5,111,0,0,1063,1064,5,2,0,0,1064,1069,5,158,0,0,1065,1066,5, + 111,0,0,1066,1067,5,2,0,0,1067,1069,5,161,0,0,1068,1062,1,0,0,0, + 1068,1065,1,0,0,0,1069,187,1,0,0,0,1070,1071,5,112,0,0,1071,1072, + 5,2,0,0,1072,1077,3,80,40,0,1073,1074,5,112,0,0,1074,1075,5,2,0, + 0,1075,1077,5,155,0,0,1076,1070,1,0,0,0,1076,1073,1,0,0,0,1077,189, + 1,0,0,0,1078,1079,5,113,0,0,1079,1080,5,2,0,0,1080,1081,3,236,118, + 0,1081,191,1,0,0,0,1082,1083,5,114,0,0,1083,1084,5,2,0,0,1084,1085, + 5,5,0,0,1085,1090,3,194,97,0,1086,1087,5,1,0,0,1087,1089,3,194,97, + 0,1088,1086,1,0,0,0,1089,1092,1,0,0,0,1090,1088,1,0,0,0,1090,1091, + 1,0,0,0,1091,1093,1,0,0,0,1092,1090,1,0,0,0,1093,1094,5,6,0,0,1094, + 193,1,0,0,0,1095,1098,3,28,14,0,1096,1098,3,66,33,0,1097,1095,1, + 0,0,0,1097,1096,1,0,0,0,1098,195,1,0,0,0,1099,1100,5,121,0,0,1100, + 1101,5,2,0,0,1101,1110,5,3,0,0,1102,1107,3,198,99,0,1103,1104,5, + 1,0,0,1104,1106,3,198,99,0,1105,1103,1,0,0,0,1106,1109,1,0,0,0,1107, + 1105,1,0,0,0,1107,1108,1,0,0,0,1108,1111,1,0,0,0,1109,1107,1,0,0, + 0,1110,1102,1,0,0,0,1110,1111,1,0,0,0,1111,1112,1,0,0,0,1112,1113, + 5,4,0,0,1113,197,1,0,0,0,1114,1115,5,5,0,0,1115,1120,3,200,100,0, + 1116,1117,5,1,0,0,1117,1119,3,200,100,0,1118,1116,1,0,0,0,1119,1122, + 1,0,0,0,1120,1118,1,0,0,0,1120,1121,1,0,0,0,1121,1123,1,0,0,0,1122, + 1120,1,0,0,0,1123,1124,5,6,0,0,1124,199,1,0,0,0,1125,1133,3,202, + 101,0,1126,1133,3,204,102,0,1127,1133,3,206,103,0,1128,1133,3,208, + 104,0,1129,1133,3,210,105,0,1130,1133,3,212,106,0,1131,1133,3,8, + 4,0,1132,1125,1,0,0,0,1132,1126,1,0,0,0,1132,1127,1,0,0,0,1132,1128, + 1,0,0,0,1132,1129,1,0,0,0,1132,1130,1,0,0,0,1132,1131,1,0,0,0,1133, + 201,1,0,0,0,1134,1135,5,122,0,0,1135,1136,5,2,0,0,1136,1137,5,3, + 0,0,1137,1142,3,226,113,0,1138,1139,5,1,0,0,1139,1141,3,226,113, + 0,1140,1138,1,0,0,0,1141,1144,1,0,0,0,1142,1140,1,0,0,0,1142,1143, + 1,0,0,0,1143,1145,1,0,0,0,1144,1142,1,0,0,0,1145,1146,5,4,0,0,1146, + 203,1,0,0,0,1147,1148,5,123,0,0,1148,1149,5,2,0,0,1149,1150,5,160, + 0,0,1150,205,1,0,0,0,1151,1152,5,124,0,0,1152,1153,5,2,0,0,1153, + 1154,5,160,0,0,1154,207,1,0,0,0,1155,1156,5,125,0,0,1156,1157,5, + 2,0,0,1157,1158,7,4,0,0,1158,209,1,0,0,0,1159,1160,5,126,0,0,1160, + 1161,5,2,0,0,1161,1162,5,160,0,0,1162,211,1,0,0,0,1163,1164,5,127, + 0,0,1164,1165,5,2,0,0,1165,1166,7,5,0,0,1166,213,1,0,0,0,1167,1168, + 5,130,0,0,1168,1169,5,2,0,0,1169,1178,5,3,0,0,1170,1175,3,216,108, + 0,1171,1172,5,1,0,0,1172,1174,3,216,108,0,1173,1171,1,0,0,0,1174, + 1177,1,0,0,0,1175,1173,1,0,0,0,1175,1176,1,0,0,0,1176,1179,1,0,0, + 0,1177,1175,1,0,0,0,1178,1170,1,0,0,0,1178,1179,1,0,0,0,1179,1180, + 1,0,0,0,1180,1181,5,4,0,0,1181,215,1,0,0,0,1182,1183,5,5,0,0,1183, + 1188,3,218,109,0,1184,1185,5,1,0,0,1185,1187,3,218,109,0,1186,1184, + 1,0,0,0,1187,1190,1,0,0,0,1188,1186,1,0,0,0,1188,1189,1,0,0,0,1189, + 1191,1,0,0,0,1190,1188,1,0,0,0,1191,1192,5,6,0,0,1192,217,1,0,0, + 0,1193,1200,3,202,101,0,1194,1200,3,34,17,0,1195,1200,3,26,13,0, + 1196,1200,3,92,46,0,1197,1200,3,110,55,0,1198,1200,3,8,4,0,1199, + 1193,1,0,0,0,1199,1194,1,0,0,0,1199,1195,1,0,0,0,1199,1196,1,0,0, + 0,1199,1197,1,0,0,0,1199,1198,1,0,0,0,1200,219,1,0,0,0,1201,1202, + 7,6,0,0,1202,221,1,0,0,0,1203,1204,7,7,0,0,1204,223,1,0,0,0,1205, + 1206,7,8,0,0,1206,225,1,0,0,0,1207,1210,3,224,112,0,1208,1210,3, + 236,118,0,1209,1207,1,0,0,0,1209,1208,1,0,0,0,1210,227,1,0,0,0,1211, + 1212,5,5,0,0,1212,1217,3,230,115,0,1213,1214,5,1,0,0,1214,1216,3, + 230,115,0,1215,1213,1,0,0,0,1216,1219,1,0,0,0,1217,1215,1,0,0,0, + 1217,1218,1,0,0,0,1218,1220,1,0,0,0,1219,1217,1,0,0,0,1220,1221, + 5,6,0,0,1221,1225,1,0,0,0,1222,1223,5,5,0,0,1223,1225,5,6,0,0,1224, + 1211,1,0,0,0,1224,1222,1,0,0,0,1225,229,1,0,0,0,1226,1227,3,236, + 118,0,1227,1228,5,2,0,0,1228,1229,3,234,117,0,1229,231,1,0,0,0,1230, + 1231,5,3,0,0,1231,1236,3,234,117,0,1232,1233,5,1,0,0,1233,1235,3, + 234,117,0,1234,1232,1,0,0,0,1235,1238,1,0,0,0,1236,1234,1,0,0,0, + 1236,1237,1,0,0,0,1237,1239,1,0,0,0,1238,1236,1,0,0,0,1239,1240, + 5,4,0,0,1240,1244,1,0,0,0,1241,1242,5,3,0,0,1242,1244,5,4,0,0,1243, + 1230,1,0,0,0,1243,1241,1,0,0,0,1244,233,1,0,0,0,1245,1255,5,161, + 0,0,1246,1255,5,160,0,0,1247,1255,5,7,0,0,1248,1255,5,8,0,0,1249, + 1255,5,9,0,0,1250,1255,3,230,115,0,1251,1255,3,232,116,0,1252,1255, + 3,228,114,0,1253,1255,3,236,118,0,1254,1245,1,0,0,0,1254,1246,1, + 0,0,0,1254,1247,1,0,0,0,1254,1248,1,0,0,0,1254,1249,1,0,0,0,1254, + 1250,1,0,0,0,1254,1251,1,0,0,0,1254,1252,1,0,0,0,1254,1253,1,0,0, + 0,1255,235,1,0,0,0,1256,1257,7,9,0,0,1257,237,1,0,0,0,95,247,258, + 323,333,350,377,379,389,401,403,419,433,441,455,463,471,479,487, + 495,506,514,522,552,560,568,576,584,594,601,619,627,634,639,646, + 660,665,677,682,699,704,714,719,727,735,749,754,763,773,778,786, + 802,813,823,828,835,841,852,857,868,884,894,907,916,926,933,955, + 964,978,987,997,1007,1025,1036,1044,1052,1060,1068,1076,1090,1097, + 1107,1110,1120,1132,1142,1175,1178,1188,1199,1209,1217,1224,1236, + 1243,1254 ] class ASLParser ( Parser ): @@ -524,9 +534,10 @@ class ASLParser ( Parser ): "'\"Resource\"'", "'\"InputPath\"'", "'\"OutputPath\"'", "'\"Items\"'", "'\"ItemsPath\"'", "'\"ResultPath\"'", "'\"Result\"'", "'\"Parameters\"'", "'\"Credentials\"'", - "'\"ResultSelector\"'", "'\"ItemReader\"'", "'\"ReaderConfig\"'", - "'\"InputType\"'", "'\"CSVHeaderLocation\"'", "'\"CSVHeaders\"'", - "'\"MaxItems\"'", "'\"MaxItemsPath\"'", "'\"ToleratedFailureCount\"'", + "'\"RoleArn\"'", "'\"RoleArn.$\"'", "'\"ResultSelector\"'", + "'\"ItemReader\"'", "'\"ReaderConfig\"'", "'\"InputType\"'", + "'\"CSVHeaderLocation\"'", "'\"CSVHeaders\"'", "'\"MaxItems\"'", + "'\"MaxItemsPath\"'", "'\"ToleratedFailureCount\"'", "'\"ToleratedFailureCountPath\"'", "'\"ToleratedFailurePercentage\"'", "'\"ToleratedFailurePercentagePath\"'", "'\"Label\"'", "'\"ResultWriter\"'", "'\"Next\"'", "'\"End\"'", "'\"Cause\"'", @@ -571,14 +582,14 @@ class ASLParser ( Parser ): "STANDARD", "ITEMPROCESSOR", "ITERATOR", "ITEMSELECTOR", "MAXCONCURRENCYPATH", "MAXCONCURRENCY", "RESOURCE", "INPUTPATH", "OUTPUTPATH", "ITEMS", "ITEMSPATH", "RESULTPATH", - "RESULT", "PARAMETERS", "CREDENTIALS", "RESULTSELECTOR", - "ITEMREADER", "READERCONFIG", "INPUTTYPE", "CSVHEADERLOCATION", - "CSVHEADERS", "MAXITEMS", "MAXITEMSPATH", "TOLERATEDFAILURECOUNT", - "TOLERATEDFAILURECOUNTPATH", "TOLERATEDFAILUREPERCENTAGE", - "TOLERATEDFAILUREPERCENTAGEPATH", "LABEL", "RESULTWRITER", - "NEXT", "END", "CAUSE", "CAUSEPATH", "ERROR", "ERRORPATH", - "RETRY", "ERROREQUALS", "INTERVALSECONDS", "MAXATTEMPTS", - "BACKOFFRATE", "MAXDELAYSECONDS", "JITTERSTRATEGY", + "RESULT", "PARAMETERS", "CREDENTIALS", "ROLEARN", + "ROLEARNPATH", "RESULTSELECTOR", "ITEMREADER", "READERCONFIG", + "INPUTTYPE", "CSVHEADERLOCATION", "CSVHEADERS", "MAXITEMS", + "MAXITEMSPATH", "TOLERATEDFAILURECOUNT", "TOLERATEDFAILURECOUNTPATH", + "TOLERATEDFAILUREPERCENTAGE", "TOLERATEDFAILUREPERCENTAGEPATH", + "LABEL", "RESULTWRITER", "NEXT", "END", "CAUSE", "CAUSEPATH", + "ERROR", "ERRORPATH", "RETRY", "ERROREQUALS", "INTERVALSECONDS", + "MAXATTEMPTS", "BACKOFFRATE", "MAXDELAYSECONDS", "JITTERSTRATEGY", "FULL", "NONE", "CATCH", "QUERYLANGUAGE", "JSONPATH", "JSONATA", "ASSIGN", "OUTPUT", "ARGUMENTS", "ERRORNAMEStatesALL", "ERRORNAMEStatesDataLimitExceeded", "ERRORNAMEStatesHeartbeatTimeout", @@ -628,89 +639,90 @@ class ASLParser ( Parser ): RULE_max_concurrency_path_decl = 32 RULE_parameters_decl = 33 RULE_credentials_decl = 34 - RULE_timeout_seconds_decl = 35 - RULE_timeout_seconds_path_decl = 36 - RULE_heartbeat_seconds_decl = 37 - RULE_heartbeat_seconds_path_decl = 38 - RULE_variable_sample = 39 - RULE_payload_tmpl_decl = 40 - RULE_payload_binding = 41 - RULE_payload_arr_decl = 42 - RULE_payload_value_decl = 43 - RULE_payload_value_lit = 44 - RULE_assign_decl = 45 - RULE_assign_decl_body = 46 - RULE_assign_decl_binding = 47 - RULE_assign_template_value_object = 48 - RULE_assign_template_binding = 49 - RULE_assign_template_value = 50 - RULE_assign_template_value_array = 51 - RULE_assign_template_value_terminal = 52 - RULE_arguments_decl = 53 - RULE_output_decl = 54 - RULE_jsonata_template_value_object = 55 - RULE_jsonata_template_binding = 56 - RULE_jsonata_template_value = 57 - RULE_jsonata_template_value_array = 58 - RULE_jsonata_template_value_terminal = 59 - RULE_result_selector_decl = 60 - RULE_state_type = 61 - RULE_choices_decl = 62 - RULE_choice_rule = 63 - RULE_comparison_variable_stmt = 64 - RULE_comparison_composite_stmt = 65 - RULE_comparison_composite = 66 - RULE_variable_decl = 67 - RULE_comparison_func = 68 - RULE_branches_decl = 69 - RULE_item_processor_decl = 70 - RULE_item_processor_item = 71 - RULE_processor_config_decl = 72 - RULE_processor_config_field = 73 - RULE_mode_decl = 74 - RULE_mode_type = 75 - RULE_execution_decl = 76 - RULE_execution_type = 77 - RULE_iterator_decl = 78 - RULE_iterator_decl_item = 79 - RULE_item_selector_decl = 80 - RULE_item_reader_decl = 81 - RULE_items_reader_field = 82 - RULE_reader_config_decl = 83 - RULE_reader_config_field = 84 - RULE_input_type_decl = 85 - RULE_csv_header_location_decl = 86 - RULE_csv_headers_decl = 87 - RULE_max_items_decl = 88 - RULE_max_items_path_decl = 89 - RULE_tolerated_failure_count_decl = 90 - RULE_tolerated_failure_count_path_decl = 91 - RULE_tolerated_failure_percentage_decl = 92 - RULE_tolerated_failure_percentage_path_decl = 93 - RULE_label_decl = 94 - RULE_result_writer_decl = 95 - RULE_result_writer_field = 96 - RULE_retry_decl = 97 - RULE_retrier_decl = 98 - RULE_retrier_stmt = 99 - RULE_error_equals_decl = 100 - RULE_interval_seconds_decl = 101 - RULE_max_attempts_decl = 102 - RULE_backoff_rate_decl = 103 - RULE_max_delay_seconds_decl = 104 - RULE_jitter_strategy_decl = 105 - RULE_catch_decl = 106 - RULE_catcher_decl = 107 - RULE_catcher_stmt = 108 - RULE_comparison_op = 109 - RULE_choice_operator = 110 - RULE_states_error_name = 111 - RULE_error_name = 112 - RULE_json_obj_decl = 113 - RULE_json_binding = 114 - RULE_json_arr_decl = 115 - RULE_json_value_decl = 116 - RULE_keyword_or_string = 117 + RULE_role_arn_decl = 35 + RULE_timeout_seconds_decl = 36 + RULE_timeout_seconds_path_decl = 37 + RULE_heartbeat_seconds_decl = 38 + RULE_heartbeat_seconds_path_decl = 39 + RULE_variable_sample = 40 + RULE_payload_tmpl_decl = 41 + RULE_payload_binding = 42 + RULE_payload_arr_decl = 43 + RULE_payload_value_decl = 44 + RULE_payload_value_lit = 45 + RULE_assign_decl = 46 + RULE_assign_decl_body = 47 + RULE_assign_decl_binding = 48 + RULE_assign_template_value_object = 49 + RULE_assign_template_binding = 50 + RULE_assign_template_value = 51 + RULE_assign_template_value_array = 52 + RULE_assign_template_value_terminal = 53 + RULE_arguments_decl = 54 + RULE_output_decl = 55 + RULE_jsonata_template_value_object = 56 + RULE_jsonata_template_binding = 57 + RULE_jsonata_template_value = 58 + RULE_jsonata_template_value_array = 59 + RULE_jsonata_template_value_terminal = 60 + RULE_result_selector_decl = 61 + RULE_state_type = 62 + RULE_choices_decl = 63 + RULE_choice_rule = 64 + RULE_comparison_variable_stmt = 65 + RULE_comparison_composite_stmt = 66 + RULE_comparison_composite = 67 + RULE_variable_decl = 68 + RULE_comparison_func = 69 + RULE_branches_decl = 70 + RULE_item_processor_decl = 71 + RULE_item_processor_item = 72 + RULE_processor_config_decl = 73 + RULE_processor_config_field = 74 + RULE_mode_decl = 75 + RULE_mode_type = 76 + RULE_execution_decl = 77 + RULE_execution_type = 78 + RULE_iterator_decl = 79 + RULE_iterator_decl_item = 80 + RULE_item_selector_decl = 81 + RULE_item_reader_decl = 82 + RULE_items_reader_field = 83 + RULE_reader_config_decl = 84 + RULE_reader_config_field = 85 + RULE_input_type_decl = 86 + RULE_csv_header_location_decl = 87 + RULE_csv_headers_decl = 88 + RULE_max_items_decl = 89 + RULE_max_items_path_decl = 90 + RULE_tolerated_failure_count_decl = 91 + RULE_tolerated_failure_count_path_decl = 92 + RULE_tolerated_failure_percentage_decl = 93 + RULE_tolerated_failure_percentage_path_decl = 94 + RULE_label_decl = 95 + RULE_result_writer_decl = 96 + RULE_result_writer_field = 97 + RULE_retry_decl = 98 + RULE_retrier_decl = 99 + RULE_retrier_stmt = 100 + RULE_error_equals_decl = 101 + RULE_interval_seconds_decl = 102 + RULE_max_attempts_decl = 103 + RULE_backoff_rate_decl = 104 + RULE_max_delay_seconds_decl = 105 + RULE_jitter_strategy_decl = 106 + RULE_catch_decl = 107 + RULE_catcher_decl = 108 + RULE_catcher_stmt = 109 + RULE_comparison_op = 110 + RULE_choice_operator = 111 + RULE_states_error_name = 112 + RULE_error_name = 113 + RULE_json_obj_decl = 114 + RULE_json_binding = 115 + RULE_json_arr_decl = 116 + RULE_json_value_decl = 117 + RULE_keyword_or_string = 118 ruleNames = [ "state_machine", "program_decl", "top_layer_stmt", "startat_decl", "comment_decl", "version_decl", "query_language_decl", @@ -722,7 +734,7 @@ class ASLParser ( Parser ): "seconds_path_decl", "timestamp_decl", "timestamp_path_decl", "items_decl", "items_path_decl", "max_concurrency_decl", "max_concurrency_path_decl", "parameters_decl", "credentials_decl", - "timeout_seconds_decl", "timeout_seconds_path_decl", + "role_arn_decl", "timeout_seconds_decl", "timeout_seconds_path_decl", "heartbeat_seconds_decl", "heartbeat_seconds_path_decl", "variable_sample", "payload_tmpl_decl", "payload_binding", "payload_arr_decl", "payload_value_decl", "payload_value_lit", @@ -852,68 +864,70 @@ class ASLParser ( Parser ): RESULT=96 PARAMETERS=97 CREDENTIALS=98 - RESULTSELECTOR=99 - ITEMREADER=100 - READERCONFIG=101 - INPUTTYPE=102 - CSVHEADERLOCATION=103 - CSVHEADERS=104 - MAXITEMS=105 - MAXITEMSPATH=106 - TOLERATEDFAILURECOUNT=107 - TOLERATEDFAILURECOUNTPATH=108 - TOLERATEDFAILUREPERCENTAGE=109 - TOLERATEDFAILUREPERCENTAGEPATH=110 - LABEL=111 - RESULTWRITER=112 - NEXT=113 - END=114 - CAUSE=115 - CAUSEPATH=116 - ERROR=117 - ERRORPATH=118 - RETRY=119 - ERROREQUALS=120 - INTERVALSECONDS=121 - MAXATTEMPTS=122 - BACKOFFRATE=123 - MAXDELAYSECONDS=124 - JITTERSTRATEGY=125 - FULL=126 - NONE=127 - CATCH=128 - QUERYLANGUAGE=129 - JSONPATH=130 - JSONATA=131 - ASSIGN=132 - OUTPUT=133 - ARGUMENTS=134 - ERRORNAMEStatesALL=135 - ERRORNAMEStatesDataLimitExceeded=136 - ERRORNAMEStatesHeartbeatTimeout=137 - ERRORNAMEStatesTimeout=138 - ERRORNAMEStatesTaskFailed=139 - ERRORNAMEStatesPermissions=140 - ERRORNAMEStatesResultPathMatchFailure=141 - ERRORNAMEStatesParameterPathFailure=142 - ERRORNAMEStatesBranchFailed=143 - ERRORNAMEStatesNoChoiceMatched=144 - ERRORNAMEStatesIntrinsicFailure=145 - ERRORNAMEStatesExceedToleratedFailureThreshold=146 - ERRORNAMEStatesItemReaderFailed=147 - ERRORNAMEStatesResultWriterFailed=148 - ERRORNAMEStatesQueryEvaluationError=149 - ERRORNAMEStatesRuntime=150 - STRINGDOLLAR=151 - STRINGPATHCONTEXTOBJ=152 - STRINGPATH=153 - STRINGVAR=154 - STRINGINTRINSICFUNC=155 - STRINGJSONATA=156 - STRING=157 - INT=158 - NUMBER=159 - WS=160 + ROLEARN=99 + ROLEARNPATH=100 + RESULTSELECTOR=101 + ITEMREADER=102 + READERCONFIG=103 + INPUTTYPE=104 + CSVHEADERLOCATION=105 + CSVHEADERS=106 + MAXITEMS=107 + MAXITEMSPATH=108 + TOLERATEDFAILURECOUNT=109 + TOLERATEDFAILURECOUNTPATH=110 + TOLERATEDFAILUREPERCENTAGE=111 + TOLERATEDFAILUREPERCENTAGEPATH=112 + LABEL=113 + RESULTWRITER=114 + NEXT=115 + END=116 + CAUSE=117 + CAUSEPATH=118 + ERROR=119 + ERRORPATH=120 + RETRY=121 + ERROREQUALS=122 + INTERVALSECONDS=123 + MAXATTEMPTS=124 + BACKOFFRATE=125 + MAXDELAYSECONDS=126 + JITTERSTRATEGY=127 + FULL=128 + NONE=129 + CATCH=130 + QUERYLANGUAGE=131 + JSONPATH=132 + JSONATA=133 + ASSIGN=134 + OUTPUT=135 + ARGUMENTS=136 + ERRORNAMEStatesALL=137 + ERRORNAMEStatesDataLimitExceeded=138 + ERRORNAMEStatesHeartbeatTimeout=139 + ERRORNAMEStatesTimeout=140 + ERRORNAMEStatesTaskFailed=141 + ERRORNAMEStatesPermissions=142 + ERRORNAMEStatesResultPathMatchFailure=143 + ERRORNAMEStatesParameterPathFailure=144 + ERRORNAMEStatesBranchFailed=145 + ERRORNAMEStatesNoChoiceMatched=146 + ERRORNAMEStatesIntrinsicFailure=147 + ERRORNAMEStatesExceedToleratedFailureThreshold=148 + ERRORNAMEStatesItemReaderFailed=149 + ERRORNAMEStatesResultWriterFailed=150 + ERRORNAMEStatesQueryEvaluationError=151 + ERRORNAMEStatesRuntime=152 + STRINGDOLLAR=153 + STRINGPATHCONTEXTOBJ=154 + STRINGPATH=155 + STRINGVAR=156 + STRINGINTRINSICFUNC=157 + STRINGJSONATA=158 + STRING=159 + INT=160 + NUMBER=161 + WS=162 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -964,9 +978,9 @@ def state_machine(self): self.enterRule(localctx, 0, self.RULE_state_machine) try: self.enterOuterAlt(localctx, 1) - self.state = 236 + self.state = 238 self.program_decl() - self.state = 237 + self.state = 239 self.match(ASLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -1030,23 +1044,23 @@ def program_decl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 239 + self.state = 241 self.match(ASLParser.LBRACE) - self.state = 240 + self.state = 242 self.top_layer_stmt() - self.state = 245 + self.state = 247 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 241 + self.state = 243 self.match(ASLParser.COMMA) - self.state = 242 + self.state = 244 self.top_layer_stmt() - self.state = 247 + self.state = 249 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 248 + self.state = 250 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1113,37 +1127,37 @@ def top_layer_stmt(self): localctx = ASLParser.Top_layer_stmtContext(self, self._ctx, self.state) self.enterRule(localctx, 4, self.RULE_top_layer_stmt) try: - self.state = 256 + self.state = 258 self._errHandler.sync(self) token = self._input.LA(1) if token in [10]: self.enterOuterAlt(localctx, 1) - self.state = 250 + self.state = 252 self.comment_decl() pass elif token in [14]: self.enterOuterAlt(localctx, 2) - self.state = 251 + self.state = 253 self.version_decl() pass - elif token in [129]: + elif token in [131]: self.enterOuterAlt(localctx, 3) - self.state = 252 + self.state = 254 self.query_language_decl() pass elif token in [12]: self.enterOuterAlt(localctx, 4) - self.state = 253 + self.state = 255 self.startat_decl() pass elif token in [11]: self.enterOuterAlt(localctx, 5) - self.state = 254 + self.state = 256 self.states_decl() pass elif token in [75]: self.enterOuterAlt(localctx, 6) - self.state = 255 + self.state = 257 self.timeout_seconds_decl() pass else: @@ -1201,11 +1215,11 @@ def startat_decl(self): self.enterRule(localctx, 6, self.RULE_startat_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 258 + self.state = 260 self.match(ASLParser.STARTAT) - self.state = 259 + self.state = 261 self.match(ASLParser.COLON) - self.state = 260 + self.state = 262 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -1259,11 +1273,11 @@ def comment_decl(self): self.enterRule(localctx, 8, self.RULE_comment_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 262 + self.state = 264 self.match(ASLParser.COMMENT) - self.state = 263 + self.state = 265 self.match(ASLParser.COLON) - self.state = 264 + self.state = 266 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -1317,11 +1331,11 @@ def version_decl(self): self.enterRule(localctx, 10, self.RULE_version_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 266 + self.state = 268 self.match(ASLParser.VERSION) - self.state = 267 + self.state = 269 self.match(ASLParser.COLON) - self.state = 268 + self.state = 270 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -1378,13 +1392,13 @@ def query_language_decl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 270 + self.state = 272 self.match(ASLParser.QUERYLANGUAGE) - self.state = 271 + self.state = 273 self.match(ASLParser.COLON) - self.state = 272 + self.state = 274 _la = self._input.LA(1) - if not(_la==130 or _la==131): + if not(_la==132 or _la==133): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -1618,242 +1632,242 @@ def state_stmt(self): localctx = ASLParser.State_stmtContext(self, self._ctx, self.state) self.enterRule(localctx, 14, self.RULE_state_stmt) try: - self.state = 321 + self.state = 323 self._errHandler.sync(self) token = self._input.LA(1) if token in [10]: self.enterOuterAlt(localctx, 1) - self.state = 274 + self.state = 276 self.comment_decl() pass - elif token in [129]: + elif token in [131]: self.enterOuterAlt(localctx, 2) - self.state = 275 + self.state = 277 self.query_language_decl() pass elif token in [15]: self.enterOuterAlt(localctx, 3) - self.state = 276 + self.state = 278 self.type_decl() pass elif token in [91]: self.enterOuterAlt(localctx, 4) - self.state = 277 + self.state = 279 self.input_path_decl() pass elif token in [90]: self.enterOuterAlt(localctx, 5) - self.state = 278 + self.state = 280 self.resource_decl() pass - elif token in [113]: + elif token in [115]: self.enterOuterAlt(localctx, 6) - self.state = 279 + self.state = 281 self.next_decl() pass elif token in [96]: self.enterOuterAlt(localctx, 7) - self.state = 280 + self.state = 282 self.result_decl() pass elif token in [95]: self.enterOuterAlt(localctx, 8) - self.state = 281 + self.state = 283 self.result_path_decl() pass elif token in [92]: self.enterOuterAlt(localctx, 9) - self.state = 282 + self.state = 284 self.output_path_decl() pass - elif token in [114]: + elif token in [116]: self.enterOuterAlt(localctx, 10) - self.state = 283 + self.state = 285 self.end_decl() pass elif token in [27]: self.enterOuterAlt(localctx, 11) - self.state = 284 + self.state = 286 self.default_decl() pass elif token in [24]: self.enterOuterAlt(localctx, 12) - self.state = 285 + self.state = 287 self.choices_decl() pass - elif token in [117]: + elif token in [119]: self.enterOuterAlt(localctx, 13) - self.state = 286 + self.state = 288 self.error_decl() pass - elif token in [118]: + elif token in [120]: self.enterOuterAlt(localctx, 14) - self.state = 287 + self.state = 289 self.error_path_decl() pass - elif token in [115]: + elif token in [117]: self.enterOuterAlt(localctx, 15) - self.state = 288 + self.state = 290 self.cause_decl() pass - elif token in [116]: + elif token in [118]: self.enterOuterAlt(localctx, 16) - self.state = 289 + self.state = 291 self.cause_path_decl() pass elif token in [72]: self.enterOuterAlt(localctx, 17) - self.state = 290 + self.state = 292 self.seconds_decl() pass elif token in [71]: self.enterOuterAlt(localctx, 18) - self.state = 291 + self.state = 293 self.seconds_path_decl() pass elif token in [74]: self.enterOuterAlt(localctx, 19) - self.state = 292 + self.state = 294 self.timestamp_decl() pass elif token in [73]: self.enterOuterAlt(localctx, 20) - self.state = 293 + self.state = 295 self.timestamp_path_decl() pass elif token in [93]: self.enterOuterAlt(localctx, 21) - self.state = 294 + self.state = 296 self.items_decl() pass elif token in [94]: self.enterOuterAlt(localctx, 22) - self.state = 295 + self.state = 297 self.items_path_decl() pass elif token in [85]: self.enterOuterAlt(localctx, 23) - self.state = 296 + self.state = 298 self.item_processor_decl() pass elif token in [86]: self.enterOuterAlt(localctx, 24) - self.state = 297 + self.state = 299 self.iterator_decl() pass elif token in [87]: self.enterOuterAlt(localctx, 25) - self.state = 298 + self.state = 300 self.item_selector_decl() pass - elif token in [100]: + elif token in [102]: self.enterOuterAlt(localctx, 26) - self.state = 299 + self.state = 301 self.item_reader_decl() pass elif token in [89]: self.enterOuterAlt(localctx, 27) - self.state = 300 + self.state = 302 self.max_concurrency_decl() pass elif token in [88]: self.enterOuterAlt(localctx, 28) - self.state = 301 + self.state = 303 self.max_concurrency_path_decl() pass elif token in [75]: self.enterOuterAlt(localctx, 29) - self.state = 302 + self.state = 304 self.timeout_seconds_decl() pass elif token in [76]: self.enterOuterAlt(localctx, 30) - self.state = 303 + self.state = 305 self.timeout_seconds_path_decl() pass elif token in [77]: self.enterOuterAlt(localctx, 31) - self.state = 304 + self.state = 306 self.heartbeat_seconds_decl() pass elif token in [78]: self.enterOuterAlt(localctx, 32) - self.state = 305 + self.state = 307 self.heartbeat_seconds_path_decl() pass elif token in [28]: self.enterOuterAlt(localctx, 33) - self.state = 306 + self.state = 308 self.branches_decl() pass elif token in [97]: self.enterOuterAlt(localctx, 34) - self.state = 307 + self.state = 309 self.parameters_decl() pass - elif token in [119]: + elif token in [121]: self.enterOuterAlt(localctx, 35) - self.state = 308 + self.state = 310 self.retry_decl() pass - elif token in [128]: + elif token in [130]: self.enterOuterAlt(localctx, 36) - self.state = 309 + self.state = 311 self.catch_decl() pass - elif token in [99]: + elif token in [101]: self.enterOuterAlt(localctx, 37) - self.state = 310 + self.state = 312 self.result_selector_decl() pass - elif token in [107]: + elif token in [109]: self.enterOuterAlt(localctx, 38) - self.state = 311 + self.state = 313 self.tolerated_failure_count_decl() pass - elif token in [108]: + elif token in [110]: self.enterOuterAlt(localctx, 39) - self.state = 312 + self.state = 314 self.tolerated_failure_count_path_decl() pass - elif token in [109]: + elif token in [111]: self.enterOuterAlt(localctx, 40) - self.state = 313 + self.state = 315 self.tolerated_failure_percentage_decl() pass - elif token in [110]: + elif token in [112]: self.enterOuterAlt(localctx, 41) - self.state = 314 + self.state = 316 self.tolerated_failure_percentage_path_decl() pass - elif token in [111]: + elif token in [113]: self.enterOuterAlt(localctx, 42) - self.state = 315 + self.state = 317 self.label_decl() pass - elif token in [112]: + elif token in [114]: self.enterOuterAlt(localctx, 43) - self.state = 316 + self.state = 318 self.result_writer_decl() pass - elif token in [132]: + elif token in [134]: self.enterOuterAlt(localctx, 44) - self.state = 317 + self.state = 319 self.assign_decl() pass - elif token in [134]: + elif token in [136]: self.enterOuterAlt(localctx, 45) - self.state = 318 + self.state = 320 self.arguments_decl() pass - elif token in [133]: + elif token in [135]: self.enterOuterAlt(localctx, 46) - self.state = 319 + self.state = 321 self.output_decl() pass elif token in [98]: self.enterOuterAlt(localctx, 47) - self.state = 320 + self.state = 322 self.credentials_decl() pass else: @@ -1927,27 +1941,27 @@ def states_decl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 323 + self.state = 325 self.match(ASLParser.STATES) - self.state = 324 + self.state = 326 self.match(ASLParser.COLON) - self.state = 325 + self.state = 327 self.match(ASLParser.LBRACE) - self.state = 326 + self.state = 328 self.state_decl() - self.state = 331 + self.state = 333 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 327 + self.state = 329 self.match(ASLParser.COMMA) - self.state = 328 + self.state = 330 self.state_decl() - self.state = 333 + self.state = 335 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 334 + self.state = 336 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1995,7 +2009,7 @@ def state_name(self): self.enterRule(localctx, 18, self.RULE_state_name) try: self.enterOuterAlt(localctx, 1) - self.state = 336 + self.state = 338 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -2050,11 +2064,11 @@ def state_decl(self): self.enterRule(localctx, 20, self.RULE_state_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 338 + self.state = 340 self.state_name() - self.state = 339 + self.state = 341 self.match(ASLParser.COLON) - self.state = 340 + self.state = 342 self.state_decl_body() except RecognitionException as re: localctx.exception = re @@ -2118,23 +2132,23 @@ def state_decl_body(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 342 + self.state = 344 self.match(ASLParser.LBRACE) - self.state = 343 + self.state = 345 self.state_stmt() - self.state = 348 + self.state = 350 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 344 + self.state = 346 self.match(ASLParser.COMMA) - self.state = 345 + self.state = 347 self.state_stmt() - self.state = 350 + self.state = 352 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 351 + self.state = 353 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -2188,11 +2202,11 @@ def type_decl(self): self.enterRule(localctx, 24, self.RULE_type_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 353 + self.state = 355 self.match(ASLParser.TYPE) - self.state = 354 + self.state = 356 self.match(ASLParser.COLON) - self.state = 355 + self.state = 357 self.state_type() except RecognitionException as re: localctx.exception = re @@ -2246,11 +2260,11 @@ def next_decl(self): self.enterRule(localctx, 26, self.RULE_next_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 357 + self.state = 359 self.match(ASLParser.NEXT) - self.state = 358 + self.state = 360 self.match(ASLParser.COLON) - self.state = 359 + self.state = 361 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -2304,11 +2318,11 @@ def resource_decl(self): self.enterRule(localctx, 28, self.RULE_resource_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 361 + self.state = 363 self.match(ASLParser.RESOURCE) - self.state = 362 + self.state = 364 self.match(ASLParser.COLON) - self.state = 363 + self.state = 365 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -2430,47 +2444,47 @@ def input_path_decl(self): localctx = ASLParser.Input_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 30, self.RULE_input_path_decl) try: - self.state = 377 + self.state = 379 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,6,self._ctx) if la_ == 1: localctx = ASLParser.Input_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 365 + self.state = 367 self.match(ASLParser.INPUTPATH) - self.state = 366 + self.state = 368 self.match(ASLParser.COLON) - self.state = 367 + self.state = 369 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Input_path_decl_path_context_objectContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 368 + self.state = 370 self.match(ASLParser.INPUTPATH) - self.state = 369 + self.state = 371 self.match(ASLParser.COLON) - self.state = 370 + self.state = 372 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass elif la_ == 3: localctx = ASLParser.Input_path_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 371 + self.state = 373 self.match(ASLParser.INPUTPATH) - self.state = 372 + self.state = 374 self.match(ASLParser.COLON) - self.state = 375 + self.state = 377 self._errHandler.sync(self) token = self._input.LA(1) if token in [9]: - self.state = 373 + self.state = 375 self.match(ASLParser.NULL) pass - elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157]: - self.state = 374 + elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159]: + self.state = 376 self.keyword_or_string() pass else: @@ -2531,11 +2545,11 @@ def result_decl(self): self.enterRule(localctx, 32, self.RULE_result_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 379 + self.state = 381 self.match(ASLParser.RESULT) - self.state = 380 + self.state = 382 self.match(ASLParser.COLON) - self.state = 381 + self.state = 383 self.json_value_decl() except RecognitionException as re: localctx.exception = re @@ -2592,19 +2606,19 @@ def result_path_decl(self): self.enterRule(localctx, 34, self.RULE_result_path_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 383 + self.state = 385 self.match(ASLParser.RESULTPATH) - self.state = 384 + self.state = 386 self.match(ASLParser.COLON) - self.state = 387 + self.state = 389 self._errHandler.sync(self) token = self._input.LA(1) if token in [9]: - self.state = 385 + self.state = 387 self.match(ASLParser.NULL) pass - elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157]: - self.state = 386 + elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159]: + self.state = 388 self.keyword_or_string() pass else: @@ -2730,47 +2744,47 @@ def output_path_decl(self): localctx = ASLParser.Output_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 36, self.RULE_output_path_decl) try: - self.state = 401 + self.state = 403 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,9,self._ctx) if la_ == 1: localctx = ASLParser.Output_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 389 + self.state = 391 self.match(ASLParser.OUTPUTPATH) - self.state = 390 + self.state = 392 self.match(ASLParser.COLON) - self.state = 391 + self.state = 393 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Output_path_decl_path_context_objectContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 392 + self.state = 394 self.match(ASLParser.OUTPUTPATH) - self.state = 393 + self.state = 395 self.match(ASLParser.COLON) - self.state = 394 + self.state = 396 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass elif la_ == 3: localctx = ASLParser.Output_path_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 395 + self.state = 397 self.match(ASLParser.OUTPUTPATH) - self.state = 396 + self.state = 398 self.match(ASLParser.COLON) - self.state = 399 + self.state = 401 self._errHandler.sync(self) token = self._input.LA(1) if token in [9]: - self.state = 397 + self.state = 399 self.match(ASLParser.NULL) pass - elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157]: - self.state = 398 + elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159]: + self.state = 400 self.keyword_or_string() pass else: @@ -2834,11 +2848,11 @@ def end_decl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 403 + self.state = 405 self.match(ASLParser.END) - self.state = 404 + self.state = 406 self.match(ASLParser.COLON) - self.state = 405 + self.state = 407 _la = self._input.LA(1) if not(_la==7 or _la==8): self._errHandler.recoverInline(self) @@ -2897,11 +2911,11 @@ def default_decl(self): self.enterRule(localctx, 40, self.RULE_default_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 407 + self.state = 409 self.match(ASLParser.DEFAULT) - self.state = 408 + self.state = 410 self.match(ASLParser.COLON) - self.state = 409 + self.state = 411 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -2992,28 +3006,28 @@ def error_decl(self): localctx = ASLParser.Error_declContext(self, self._ctx, self.state) self.enterRule(localctx, 42, self.RULE_error_decl) try: - self.state = 417 + self.state = 419 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,10,self._ctx) if la_ == 1: localctx = ASLParser.Error_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 411 + self.state = 413 self.match(ASLParser.ERROR) - self.state = 412 + self.state = 414 self.match(ASLParser.COLON) - self.state = 413 + self.state = 415 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Error_stringContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 414 + self.state = 416 self.match(ASLParser.ERROR) - self.state = 415 + self.state = 417 self.match(ASLParser.COLON) - self.state = 416 + self.state = 418 self.keyword_or_string() pass @@ -3163,50 +3177,50 @@ def error_path_decl(self): localctx = ASLParser.Error_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 44, self.RULE_error_path_decl) try: - self.state = 431 + self.state = 433 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,11,self._ctx) if la_ == 1: localctx = ASLParser.Error_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 419 + self.state = 421 self.match(ASLParser.ERRORPATH) - self.state = 420 + self.state = 422 self.match(ASLParser.COLON) - self.state = 421 + self.state = 423 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Error_path_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 422 + self.state = 424 self.match(ASLParser.ERRORPATH) - self.state = 423 + self.state = 425 self.match(ASLParser.COLON) - self.state = 424 + self.state = 426 self.match(ASLParser.STRINGPATH) pass elif la_ == 3: localctx = ASLParser.Error_path_decl_contextContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 425 + self.state = 427 self.match(ASLParser.ERRORPATH) - self.state = 426 + self.state = 428 self.match(ASLParser.COLON) - self.state = 427 + self.state = 429 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass elif la_ == 4: localctx = ASLParser.Error_path_decl_intrinsicContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 428 + self.state = 430 self.match(ASLParser.ERRORPATH) - self.state = 429 + self.state = 431 self.match(ASLParser.COLON) - self.state = 430 + self.state = 432 self.match(ASLParser.STRINGINTRINSICFUNC) pass @@ -3300,28 +3314,28 @@ def cause_decl(self): localctx = ASLParser.Cause_declContext(self, self._ctx, self.state) self.enterRule(localctx, 46, self.RULE_cause_decl) try: - self.state = 439 + self.state = 441 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,12,self._ctx) if la_ == 1: localctx = ASLParser.Cause_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 433 + self.state = 435 self.match(ASLParser.CAUSE) - self.state = 434 + self.state = 436 self.match(ASLParser.COLON) - self.state = 435 + self.state = 437 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Cause_stringContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 436 + self.state = 438 self.match(ASLParser.CAUSE) - self.state = 437 + self.state = 439 self.match(ASLParser.COLON) - self.state = 438 + self.state = 440 self.keyword_or_string() pass @@ -3471,50 +3485,50 @@ def cause_path_decl(self): localctx = ASLParser.Cause_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 48, self.RULE_cause_path_decl) try: - self.state = 453 + self.state = 455 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,13,self._ctx) if la_ == 1: localctx = ASLParser.Cause_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 441 + self.state = 443 self.match(ASLParser.CAUSEPATH) - self.state = 442 + self.state = 444 self.match(ASLParser.COLON) - self.state = 443 + self.state = 445 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Cause_path_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 444 + self.state = 446 self.match(ASLParser.CAUSEPATH) - self.state = 445 + self.state = 447 self.match(ASLParser.COLON) - self.state = 446 + self.state = 448 self.match(ASLParser.STRINGPATH) pass elif la_ == 3: localctx = ASLParser.Cause_path_decl_contextContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 447 + self.state = 449 self.match(ASLParser.CAUSEPATH) - self.state = 448 + self.state = 450 self.match(ASLParser.COLON) - self.state = 449 + self.state = 451 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass elif la_ == 4: localctx = ASLParser.Cause_path_decl_intrinsicContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 450 + self.state = 452 self.match(ASLParser.CAUSEPATH) - self.state = 451 + self.state = 453 self.match(ASLParser.COLON) - self.state = 452 + self.state = 454 self.match(ASLParser.STRINGINTRINSICFUNC) pass @@ -3607,28 +3621,28 @@ def seconds_decl(self): localctx = ASLParser.Seconds_declContext(self, self._ctx, self.state) self.enterRule(localctx, 50, self.RULE_seconds_decl) try: - self.state = 461 + self.state = 463 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,14,self._ctx) if la_ == 1: localctx = ASLParser.Seconds_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 455 + self.state = 457 self.match(ASLParser.SECONDS) - self.state = 456 + self.state = 458 self.match(ASLParser.COLON) - self.state = 457 + self.state = 459 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Seconds_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 458 + self.state = 460 self.match(ASLParser.SECONDS) - self.state = 459 + self.state = 461 self.match(ASLParser.COLON) - self.state = 460 + self.state = 462 self.match(ASLParser.INT) pass @@ -3723,28 +3737,28 @@ def seconds_path_decl(self): localctx = ASLParser.Seconds_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 52, self.RULE_seconds_path_decl) try: - self.state = 469 + self.state = 471 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,15,self._ctx) if la_ == 1: localctx = ASLParser.Seconds_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 463 + self.state = 465 self.match(ASLParser.SECONDSPATH) - self.state = 464 + self.state = 466 self.match(ASLParser.COLON) - self.state = 465 + self.state = 467 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Seconds_path_decl_valueContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 466 + self.state = 468 self.match(ASLParser.SECONDSPATH) - self.state = 467 + self.state = 469 self.match(ASLParser.COLON) - self.state = 468 + self.state = 470 self.keyword_or_string() pass @@ -3838,28 +3852,28 @@ def timestamp_decl(self): localctx = ASLParser.Timestamp_declContext(self, self._ctx, self.state) self.enterRule(localctx, 54, self.RULE_timestamp_decl) try: - self.state = 477 + self.state = 479 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,16,self._ctx) if la_ == 1: localctx = ASLParser.Timestamp_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 471 + self.state = 473 self.match(ASLParser.TIMESTAMP) - self.state = 472 + self.state = 474 self.match(ASLParser.COLON) - self.state = 473 + self.state = 475 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Timestamp_stringContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 474 + self.state = 476 self.match(ASLParser.TIMESTAMP) - self.state = 475 + self.state = 477 self.match(ASLParser.COLON) - self.state = 476 + self.state = 478 self.keyword_or_string() pass @@ -3954,28 +3968,28 @@ def timestamp_path_decl(self): localctx = ASLParser.Timestamp_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 56, self.RULE_timestamp_path_decl) try: - self.state = 485 + self.state = 487 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,17,self._ctx) if la_ == 1: localctx = ASLParser.Timestamp_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 479 + self.state = 481 self.match(ASLParser.TIMESTAMPPATH) - self.state = 480 + self.state = 482 self.match(ASLParser.COLON) - self.state = 481 + self.state = 483 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Timestamp_path_decl_valueContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 482 + self.state = 484 self.match(ASLParser.TIMESTAMPPATH) - self.state = 483 + self.state = 485 self.match(ASLParser.COLON) - self.state = 484 + self.state = 486 self.keyword_or_string() pass @@ -4069,28 +4083,28 @@ def items_decl(self): localctx = ASLParser.Items_declContext(self, self._ctx, self.state) self.enterRule(localctx, 58, self.RULE_items_decl) try: - self.state = 493 + self.state = 495 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,18,self._ctx) if la_ == 1: localctx = ASLParser.Items_arrayContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 487 + self.state = 489 self.match(ASLParser.ITEMS) - self.state = 488 + self.state = 490 self.match(ASLParser.COLON) - self.state = 489 + self.state = 491 self.jsonata_template_value_array() pass elif la_ == 2: localctx = ASLParser.Items_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 490 + self.state = 492 self.match(ASLParser.ITEMS) - self.state = 491 + self.state = 493 self.match(ASLParser.COLON) - self.state = 492 + self.state = 494 self.match(ASLParser.STRINGJSONATA) pass @@ -4213,39 +4227,39 @@ def items_path_decl(self): localctx = ASLParser.Items_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 60, self.RULE_items_path_decl) try: - self.state = 504 + self.state = 506 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,19,self._ctx) if la_ == 1: localctx = ASLParser.Items_path_decl_path_context_objectContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 495 + self.state = 497 self.match(ASLParser.ITEMSPATH) - self.state = 496 + self.state = 498 self.match(ASLParser.COLON) - self.state = 497 + self.state = 499 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass elif la_ == 2: localctx = ASLParser.Items_path_decl_path_varContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 498 + self.state = 500 self.match(ASLParser.ITEMSPATH) - self.state = 499 + self.state = 501 self.match(ASLParser.COLON) - self.state = 500 + self.state = 502 self.variable_sample() pass elif la_ == 3: localctx = ASLParser.Items_path_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 501 + self.state = 503 self.match(ASLParser.ITEMSPATH) - self.state = 502 + self.state = 504 self.match(ASLParser.COLON) - self.state = 503 + self.state = 505 self.keyword_or_string() pass @@ -4338,28 +4352,28 @@ def max_concurrency_decl(self): localctx = ASLParser.Max_concurrency_declContext(self, self._ctx, self.state) self.enterRule(localctx, 62, self.RULE_max_concurrency_decl) try: - self.state = 512 + self.state = 514 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,20,self._ctx) if la_ == 1: localctx = ASLParser.Max_concurrency_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 506 + self.state = 508 self.match(ASLParser.MAXCONCURRENCY) - self.state = 507 + self.state = 509 self.match(ASLParser.COLON) - self.state = 508 + self.state = 510 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Max_concurrency_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 509 + self.state = 511 self.match(ASLParser.MAXCONCURRENCY) - self.state = 510 + self.state = 512 self.match(ASLParser.COLON) - self.state = 511 + self.state = 513 self.match(ASLParser.INT) pass @@ -4453,28 +4467,28 @@ def max_concurrency_path_decl(self): localctx = ASLParser.Max_concurrency_path_declContext(self, self._ctx, self.state) self.enterRule(localctx, 64, self.RULE_max_concurrency_path_decl) try: - self.state = 520 + self.state = 522 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,21,self._ctx) if la_ == 1: localctx = ASLParser.Max_concurrency_path_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 514 + self.state = 516 self.match(ASLParser.MAXCONCURRENCYPATH) - self.state = 515 + self.state = 517 self.match(ASLParser.COLON) - self.state = 516 + self.state = 518 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Max_concurrency_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 517 + self.state = 519 self.match(ASLParser.MAXCONCURRENCYPATH) - self.state = 518 + self.state = 520 self.match(ASLParser.COLON) - self.state = 519 + self.state = 521 self.match(ASLParser.STRINGPATH) pass @@ -4531,11 +4545,11 @@ def parameters_decl(self): self.enterRule(localctx, 66, self.RULE_parameters_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 522 + self.state = 524 self.match(ASLParser.PARAMETERS) - self.state = 523 + self.state = 525 self.match(ASLParser.COLON) - self.state = 524 + self.state = 526 self.payload_tmpl_decl() except RecognitionException as re: localctx.exception = re @@ -4559,42 +4573,324 @@ def CREDENTIALS(self): def COLON(self): return self.getToken(ASLParser.COLON, 0) - def payload_tmpl_decl(self): - return self.getTypedRuleContext(ASLParser.Payload_tmpl_declContext,0) + def LBRACE(self): + return self.getToken(ASLParser.LBRACE, 0) + + def role_arn_decl(self): + return self.getTypedRuleContext(ASLParser.Role_arn_declContext,0) - def getRuleIndex(self): - return ASLParser.RULE_credentials_decl + def RBRACE(self): + return self.getToken(ASLParser.RBRACE, 0) + + def getRuleIndex(self): + return ASLParser.RULE_credentials_decl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCredentials_decl" ): + listener.enterCredentials_decl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCredentials_decl" ): + listener.exitCredentials_decl(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitCredentials_decl" ): + return visitor.visitCredentials_decl(self) + else: + return visitor.visitChildren(self) + + + + + def credentials_decl(self): + + localctx = ASLParser.Credentials_declContext(self, self._ctx, self.state) + self.enterRule(localctx, 68, self.RULE_credentials_decl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 528 + self.match(ASLParser.CREDENTIALS) + self.state = 529 + self.match(ASLParser.COLON) + self.state = 530 + self.match(ASLParser.LBRACE) + self.state = 531 + self.role_arn_decl() + self.state = 532 + self.match(ASLParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class Role_arn_declContext(ParserRuleContext): + __slots__ = 'parser' + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return ASLParser.RULE_role_arn_decl + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class Role_arn_jsonataContext(Role_arn_declContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a ASLParser.Role_arn_declContext + super().__init__(parser) + self.copyFrom(ctx) + + def ROLEARN(self): + return self.getToken(ASLParser.ROLEARN, 0) + def COLON(self): + return self.getToken(ASLParser.COLON, 0) + def STRINGJSONATA(self): + return self.getToken(ASLParser.STRINGJSONATA, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRole_arn_jsonata" ): + listener.enterRole_arn_jsonata(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRole_arn_jsonata" ): + listener.exitRole_arn_jsonata(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitRole_arn_jsonata" ): + return visitor.visitRole_arn_jsonata(self) + else: + return visitor.visitChildren(self) + + + class Role_arn_path_context_objContext(Role_arn_declContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a ASLParser.Role_arn_declContext + super().__init__(parser) + self.copyFrom(ctx) + + def ROLEARNPATH(self): + return self.getToken(ASLParser.ROLEARNPATH, 0) + def COLON(self): + return self.getToken(ASLParser.COLON, 0) + def STRINGPATHCONTEXTOBJ(self): + return self.getToken(ASLParser.STRINGPATHCONTEXTOBJ, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRole_arn_path_context_obj" ): + listener.enterRole_arn_path_context_obj(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRole_arn_path_context_obj" ): + listener.exitRole_arn_path_context_obj(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitRole_arn_path_context_obj" ): + return visitor.visitRole_arn_path_context_obj(self) + else: + return visitor.visitChildren(self) + + + class Role_arn_pathContext(Role_arn_declContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a ASLParser.Role_arn_declContext + super().__init__(parser) + self.copyFrom(ctx) + + def ROLEARNPATH(self): + return self.getToken(ASLParser.ROLEARNPATH, 0) + def COLON(self): + return self.getToken(ASLParser.COLON, 0) + def STRINGPATH(self): + return self.getToken(ASLParser.STRINGPATH, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRole_arn_path" ): + listener.enterRole_arn_path(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRole_arn_path" ): + listener.exitRole_arn_path(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitRole_arn_path" ): + return visitor.visitRole_arn_path(self) + else: + return visitor.visitChildren(self) + + + class Role_arn_strContext(Role_arn_declContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a ASLParser.Role_arn_declContext + super().__init__(parser) + self.copyFrom(ctx) + + def ROLEARN(self): + return self.getToken(ASLParser.ROLEARN, 0) + def COLON(self): + return self.getToken(ASLParser.COLON, 0) + def keyword_or_string(self): + return self.getTypedRuleContext(ASLParser.Keyword_or_stringContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRole_arn_str" ): + listener.enterRole_arn_str(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRole_arn_str" ): + listener.exitRole_arn_str(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitRole_arn_str" ): + return visitor.visitRole_arn_str(self) + else: + return visitor.visitChildren(self) + + + class Role_arn_intrinsic_funcContext(Role_arn_declContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a ASLParser.Role_arn_declContext + super().__init__(parser) + self.copyFrom(ctx) + + def ROLEARNPATH(self): + return self.getToken(ASLParser.ROLEARNPATH, 0) + def COLON(self): + return self.getToken(ASLParser.COLON, 0) + def STRINGINTRINSICFUNC(self): + return self.getToken(ASLParser.STRINGINTRINSICFUNC, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRole_arn_intrinsic_func" ): + listener.enterRole_arn_intrinsic_func(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRole_arn_intrinsic_func" ): + listener.exitRole_arn_intrinsic_func(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitRole_arn_intrinsic_func" ): + return visitor.visitRole_arn_intrinsic_func(self) + else: + return visitor.visitChildren(self) + + + class Role_arn_varContext(Role_arn_declContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a ASLParser.Role_arn_declContext + super().__init__(parser) + self.copyFrom(ctx) + + def ROLEARNPATH(self): + return self.getToken(ASLParser.ROLEARNPATH, 0) + def COLON(self): + return self.getToken(ASLParser.COLON, 0) + def variable_sample(self): + return self.getTypedRuleContext(ASLParser.Variable_sampleContext,0) + def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCredentials_decl" ): - listener.enterCredentials_decl(self) + if hasattr( listener, "enterRole_arn_var" ): + listener.enterRole_arn_var(self) def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCredentials_decl" ): - listener.exitCredentials_decl(self) + if hasattr( listener, "exitRole_arn_var" ): + listener.exitRole_arn_var(self) def accept(self, visitor:ParseTreeVisitor): - if hasattr( visitor, "visitCredentials_decl" ): - return visitor.visitCredentials_decl(self) + if hasattr( visitor, "visitRole_arn_var" ): + return visitor.visitRole_arn_var(self) else: return visitor.visitChildren(self) + def role_arn_decl(self): - def credentials_decl(self): - - localctx = ASLParser.Credentials_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_credentials_decl) + localctx = ASLParser.Role_arn_declContext(self, self._ctx, self.state) + self.enterRule(localctx, 70, self.RULE_role_arn_decl) try: - self.enterOuterAlt(localctx, 1) - self.state = 526 - self.match(ASLParser.CREDENTIALS) - self.state = 527 - self.match(ASLParser.COLON) - self.state = 528 - self.payload_tmpl_decl() + self.state = 552 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,22,self._ctx) + if la_ == 1: + localctx = ASLParser.Role_arn_jsonataContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 534 + self.match(ASLParser.ROLEARN) + self.state = 535 + self.match(ASLParser.COLON) + self.state = 536 + self.match(ASLParser.STRINGJSONATA) + pass + + elif la_ == 2: + localctx = ASLParser.Role_arn_pathContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 537 + self.match(ASLParser.ROLEARNPATH) + self.state = 538 + self.match(ASLParser.COLON) + self.state = 539 + self.match(ASLParser.STRINGPATH) + pass + + elif la_ == 3: + localctx = ASLParser.Role_arn_path_context_objContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 540 + self.match(ASLParser.ROLEARNPATH) + self.state = 541 + self.match(ASLParser.COLON) + self.state = 542 + self.match(ASLParser.STRINGPATHCONTEXTOBJ) + pass + + elif la_ == 4: + localctx = ASLParser.Role_arn_intrinsic_funcContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 543 + self.match(ASLParser.ROLEARNPATH) + self.state = 544 + self.match(ASLParser.COLON) + self.state = 545 + self.match(ASLParser.STRINGINTRINSICFUNC) + pass + + elif la_ == 5: + localctx = ASLParser.Role_arn_varContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 546 + self.match(ASLParser.ROLEARNPATH) + self.state = 547 + self.match(ASLParser.COLON) + self.state = 548 + self.variable_sample() + pass + + elif la_ == 6: + localctx = ASLParser.Role_arn_strContext(self, localctx) + self.enterOuterAlt(localctx, 6) + self.state = 549 + self.match(ASLParser.ROLEARN) + self.state = 550 + self.match(ASLParser.COLON) + self.state = 551 + self.keyword_or_string() + pass + + except RecognitionException as re: localctx.exception = re self._errHandler.reportError(self, re) @@ -4681,30 +4977,30 @@ def accept(self, visitor:ParseTreeVisitor): def timeout_seconds_decl(self): localctx = ASLParser.Timeout_seconds_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_timeout_seconds_decl) + self.enterRule(localctx, 72, self.RULE_timeout_seconds_decl) try: - self.state = 536 + self.state = 560 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,22,self._ctx) + la_ = self._interp.adaptivePredict(self._input,23,self._ctx) if la_ == 1: localctx = ASLParser.Timeout_seconds_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 530 + self.state = 554 self.match(ASLParser.TIMEOUTSECONDS) - self.state = 531 + self.state = 555 self.match(ASLParser.COLON) - self.state = 532 + self.state = 556 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Timeout_seconds_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 533 + self.state = 557 self.match(ASLParser.TIMEOUTSECONDS) - self.state = 534 + self.state = 558 self.match(ASLParser.COLON) - self.state = 535 + self.state = 559 self.match(ASLParser.INT) pass @@ -4796,30 +5092,30 @@ def accept(self, visitor:ParseTreeVisitor): def timeout_seconds_path_decl(self): localctx = ASLParser.Timeout_seconds_path_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 72, self.RULE_timeout_seconds_path_decl) + self.enterRule(localctx, 74, self.RULE_timeout_seconds_path_decl) try: - self.state = 544 + self.state = 568 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,23,self._ctx) + la_ = self._interp.adaptivePredict(self._input,24,self._ctx) if la_ == 1: localctx = ASLParser.Timeout_seconds_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 538 + self.state = 562 self.match(ASLParser.TIMEOUTSECONDSPATH) - self.state = 539 + self.state = 563 self.match(ASLParser.COLON) - self.state = 540 + self.state = 564 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Timeout_seconds_path_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 541 + self.state = 565 self.match(ASLParser.TIMEOUTSECONDSPATH) - self.state = 542 + self.state = 566 self.match(ASLParser.COLON) - self.state = 543 + self.state = 567 self.match(ASLParser.STRINGPATH) pass @@ -4910,30 +5206,30 @@ def accept(self, visitor:ParseTreeVisitor): def heartbeat_seconds_decl(self): localctx = ASLParser.Heartbeat_seconds_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 74, self.RULE_heartbeat_seconds_decl) + self.enterRule(localctx, 76, self.RULE_heartbeat_seconds_decl) try: - self.state = 552 + self.state = 576 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,24,self._ctx) + la_ = self._interp.adaptivePredict(self._input,25,self._ctx) if la_ == 1: localctx = ASLParser.Heartbeat_seconds_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 546 + self.state = 570 self.match(ASLParser.HEARTBEATSECONDS) - self.state = 547 + self.state = 571 self.match(ASLParser.COLON) - self.state = 548 + self.state = 572 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Heartbeat_seconds_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 549 + self.state = 573 self.match(ASLParser.HEARTBEATSECONDS) - self.state = 550 + self.state = 574 self.match(ASLParser.COLON) - self.state = 551 + self.state = 575 self.match(ASLParser.INT) pass @@ -5025,30 +5321,30 @@ def accept(self, visitor:ParseTreeVisitor): def heartbeat_seconds_path_decl(self): localctx = ASLParser.Heartbeat_seconds_path_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 76, self.RULE_heartbeat_seconds_path_decl) + self.enterRule(localctx, 78, self.RULE_heartbeat_seconds_path_decl) try: - self.state = 560 + self.state = 584 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,25,self._ctx) + la_ = self._interp.adaptivePredict(self._input,26,self._ctx) if la_ == 1: localctx = ASLParser.Heartbeat_seconds_path_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 554 + self.state = 578 self.match(ASLParser.HEARTBEATSECONDSPATH) - self.state = 555 + self.state = 579 self.match(ASLParser.COLON) - self.state = 556 + self.state = 580 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Heartbeat_seconds_path_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 557 + self.state = 581 self.match(ASLParser.HEARTBEATSECONDSPATH) - self.state = 558 + self.state = 582 self.match(ASLParser.COLON) - self.state = 559 + self.state = 583 self.match(ASLParser.STRINGPATH) pass @@ -5095,10 +5391,10 @@ def accept(self, visitor:ParseTreeVisitor): def variable_sample(self): localctx = ASLParser.Variable_sampleContext(self, self._ctx, self.state) - self.enterRule(localctx, 78, self.RULE_variable_sample) + self.enterRule(localctx, 80, self.RULE_variable_sample) try: self.enterOuterAlt(localctx, 1) - self.state = 562 + self.state = 586 self.match(ASLParser.STRINGVAR) except RecognitionException as re: localctx.exception = re @@ -5158,39 +5454,39 @@ def accept(self, visitor:ParseTreeVisitor): def payload_tmpl_decl(self): localctx = ASLParser.Payload_tmpl_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 80, self.RULE_payload_tmpl_decl) + self.enterRule(localctx, 82, self.RULE_payload_tmpl_decl) self._la = 0 # Token type try: - self.state = 577 + self.state = 601 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,27,self._ctx) + la_ = self._interp.adaptivePredict(self._input,28,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 564 + self.state = 588 self.match(ASLParser.LBRACE) - self.state = 565 + self.state = 589 self.payload_binding() - self.state = 570 + self.state = 594 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 566 + self.state = 590 self.match(ASLParser.COMMA) - self.state = 567 + self.state = 591 self.payload_binding() - self.state = 572 + self.state = 596 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 573 + self.state = 597 self.match(ASLParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 575 + self.state = 599 self.match(ASLParser.LBRACE) - self.state = 576 + self.state = 600 self.match(ASLParser.RBRACE) pass @@ -5368,63 +5664,63 @@ def accept(self, visitor:ParseTreeVisitor): def payload_binding(self): localctx = ASLParser.Payload_bindingContext(self, self._ctx, self.state) - self.enterRule(localctx, 82, self.RULE_payload_binding) + self.enterRule(localctx, 84, self.RULE_payload_binding) try: - self.state = 595 + self.state = 619 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,28,self._ctx) + la_ = self._interp.adaptivePredict(self._input,29,self._ctx) if la_ == 1: localctx = ASLParser.Payload_binding_pathContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 579 + self.state = 603 self.match(ASLParser.STRINGDOLLAR) - self.state = 580 + self.state = 604 self.match(ASLParser.COLON) - self.state = 581 + self.state = 605 self.match(ASLParser.STRINGPATH) pass elif la_ == 2: localctx = ASLParser.Payload_binding_path_context_objContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 582 + self.state = 606 self.match(ASLParser.STRINGDOLLAR) - self.state = 583 + self.state = 607 self.match(ASLParser.COLON) - self.state = 584 + self.state = 608 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass elif la_ == 3: localctx = ASLParser.Payload_binding_intrinsic_funcContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 585 + self.state = 609 self.match(ASLParser.STRINGDOLLAR) - self.state = 586 + self.state = 610 self.match(ASLParser.COLON) - self.state = 587 + self.state = 611 self.match(ASLParser.STRINGINTRINSICFUNC) pass elif la_ == 4: localctx = ASLParser.Payload_binding_varContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 588 + self.state = 612 self.match(ASLParser.STRINGDOLLAR) - self.state = 589 + self.state = 613 self.match(ASLParser.COLON) - self.state = 590 + self.state = 614 self.variable_sample() pass elif la_ == 5: localctx = ASLParser.Payload_binding_valueContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 591 + self.state = 615 self.keyword_or_string() - self.state = 592 + self.state = 616 self.match(ASLParser.COLON) - self.state = 593 + self.state = 617 self.payload_value_decl() pass @@ -5487,39 +5783,39 @@ def accept(self, visitor:ParseTreeVisitor): def payload_arr_decl(self): localctx = ASLParser.Payload_arr_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 84, self.RULE_payload_arr_decl) + self.enterRule(localctx, 86, self.RULE_payload_arr_decl) self._la = 0 # Token type try: - self.state = 610 + self.state = 634 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,30,self._ctx) + la_ = self._interp.adaptivePredict(self._input,31,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 597 + self.state = 621 self.match(ASLParser.LBRACK) - self.state = 598 + self.state = 622 self.payload_value_decl() - self.state = 603 + self.state = 627 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 599 + self.state = 623 self.match(ASLParser.COMMA) - self.state = 600 + self.state = 624 self.payload_value_decl() - self.state = 605 + self.state = 629 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 606 + self.state = 630 self.match(ASLParser.RBRACK) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 608 + self.state = 632 self.match(ASLParser.LBRACK) - self.state = 609 + self.state = 633 self.match(ASLParser.RBRACK) pass @@ -5575,24 +5871,24 @@ def accept(self, visitor:ParseTreeVisitor): def payload_value_decl(self): localctx = ASLParser.Payload_value_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 86, self.RULE_payload_value_decl) + self.enterRule(localctx, 88, self.RULE_payload_value_decl) try: - self.state = 615 + self.state = 639 self._errHandler.sync(self) token = self._input.LA(1) if token in [3]: self.enterOuterAlt(localctx, 1) - self.state = 612 + self.state = 636 self.payload_arr_decl() pass elif token in [5]: self.enterOuterAlt(localctx, 2) - self.state = 613 + self.state = 637 self.payload_tmpl_decl() pass - elif token in [7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159]: + elif token in [7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161]: self.enterOuterAlt(localctx, 3) - self.state = 614 + self.state = 638 self.payload_value_lit() pass else: @@ -5751,28 +6047,28 @@ def accept(self, visitor:ParseTreeVisitor): def payload_value_lit(self): localctx = ASLParser.Payload_value_litContext(self, self._ctx, self.state) - self.enterRule(localctx, 88, self.RULE_payload_value_lit) + self.enterRule(localctx, 90, self.RULE_payload_value_lit) self._la = 0 # Token type try: - self.state = 622 + self.state = 646 self._errHandler.sync(self) token = self._input.LA(1) - if token in [159]: + if token in [161]: localctx = ASLParser.Payload_value_floatContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 617 + self.state = 641 self.match(ASLParser.NUMBER) pass - elif token in [158]: + elif token in [160]: localctx = ASLParser.Payload_value_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 618 + self.state = 642 self.match(ASLParser.INT) pass elif token in [7, 8]: localctx = ASLParser.Payload_value_boolContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 619 + self.state = 643 _la = self._input.LA(1) if not(_la==7 or _la==8): self._errHandler.recoverInline(self) @@ -5783,13 +6079,13 @@ def payload_value_lit(self): elif token in [9]: localctx = ASLParser.Payload_value_nullContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 620 + self.state = 644 self.match(ASLParser.NULL) pass - elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157]: + elif token in [10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159]: localctx = ASLParser.Payload_value_strContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 621 + self.state = 645 self.keyword_or_string() pass else: @@ -5844,14 +6140,14 @@ def accept(self, visitor:ParseTreeVisitor): def assign_decl(self): localctx = ASLParser.Assign_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 90, self.RULE_assign_decl) + self.enterRule(localctx, 92, self.RULE_assign_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 624 + self.state = 648 self.match(ASLParser.ASSIGN) - self.state = 625 + self.state = 649 self.match(ASLParser.COLON) - self.state = 626 + self.state = 650 self.assign_decl_body() except RecognitionException as re: localctx.exception = re @@ -5911,39 +6207,39 @@ def accept(self, visitor:ParseTreeVisitor): def assign_decl_body(self): localctx = ASLParser.Assign_decl_bodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 92, self.RULE_assign_decl_body) + self.enterRule(localctx, 94, self.RULE_assign_decl_body) self._la = 0 # Token type try: - self.state = 641 + self.state = 665 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,34,self._ctx) + la_ = self._interp.adaptivePredict(self._input,35,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 628 + self.state = 652 self.match(ASLParser.LBRACE) - self.state = 629 + self.state = 653 self.match(ASLParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 630 + self.state = 654 self.match(ASLParser.LBRACE) - self.state = 631 + self.state = 655 self.assign_decl_binding() - self.state = 636 + self.state = 660 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 632 + self.state = 656 self.match(ASLParser.COMMA) - self.state = 633 + self.state = 657 self.assign_decl_binding() - self.state = 638 + self.state = 662 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 639 + self.state = 663 self.match(ASLParser.RBRACE) pass @@ -5991,10 +6287,10 @@ def accept(self, visitor:ParseTreeVisitor): def assign_decl_binding(self): localctx = ASLParser.Assign_decl_bindingContext(self, self._ctx, self.state) - self.enterRule(localctx, 94, self.RULE_assign_decl_binding) + self.enterRule(localctx, 96, self.RULE_assign_decl_binding) try: self.enterOuterAlt(localctx, 1) - self.state = 643 + self.state = 667 self.assign_template_binding() except RecognitionException as re: localctx.exception = re @@ -6054,39 +6350,39 @@ def accept(self, visitor:ParseTreeVisitor): def assign_template_value_object(self): localctx = ASLParser.Assign_template_value_objectContext(self, self._ctx, self.state) - self.enterRule(localctx, 96, self.RULE_assign_template_value_object) + self.enterRule(localctx, 98, self.RULE_assign_template_value_object) self._la = 0 # Token type try: - self.state = 658 + self.state = 682 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,36,self._ctx) + la_ = self._interp.adaptivePredict(self._input,37,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 645 + self.state = 669 self.match(ASLParser.LBRACE) - self.state = 646 + self.state = 670 self.match(ASLParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 647 + self.state = 671 self.match(ASLParser.LBRACE) - self.state = 648 + self.state = 672 self.assign_template_binding() - self.state = 653 + self.state = 677 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 649 + self.state = 673 self.match(ASLParser.COMMA) - self.state = 650 + self.state = 674 self.assign_template_binding() - self.state = 655 + self.state = 679 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 656 + self.state = 680 self.match(ASLParser.RBRACE) pass @@ -6263,63 +6559,63 @@ def accept(self, visitor:ParseTreeVisitor): def assign_template_binding(self): localctx = ASLParser.Assign_template_bindingContext(self, self._ctx, self.state) - self.enterRule(localctx, 98, self.RULE_assign_template_binding) + self.enterRule(localctx, 100, self.RULE_assign_template_binding) try: - self.state = 675 + self.state = 699 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,37,self._ctx) + la_ = self._interp.adaptivePredict(self._input,38,self._ctx) if la_ == 1: localctx = ASLParser.Assign_template_binding_pathContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 660 + self.state = 684 self.match(ASLParser.STRINGDOLLAR) - self.state = 661 + self.state = 685 self.match(ASLParser.COLON) - self.state = 662 + self.state = 686 self.match(ASLParser.STRINGPATH) pass elif la_ == 2: localctx = ASLParser.Assign_template_binding_path_contextContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 663 + self.state = 687 self.match(ASLParser.STRINGDOLLAR) - self.state = 664 + self.state = 688 self.match(ASLParser.COLON) - self.state = 665 + self.state = 689 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass elif la_ == 3: localctx = ASLParser.Assign_template_binding_varContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 666 + self.state = 690 self.match(ASLParser.STRINGDOLLAR) - self.state = 667 + self.state = 691 self.match(ASLParser.COLON) - self.state = 668 + self.state = 692 self.variable_sample() pass elif la_ == 4: localctx = ASLParser.Assign_template_binding_intrinsic_funcContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 669 + self.state = 693 self.match(ASLParser.STRINGDOLLAR) - self.state = 670 + self.state = 694 self.match(ASLParser.COLON) - self.state = 671 + self.state = 695 self.match(ASLParser.STRINGINTRINSICFUNC) pass elif la_ == 5: localctx = ASLParser.Assign_template_binding_assign_valueContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 672 + self.state = 696 self.match(ASLParser.STRING) - self.state = 673 + self.state = 697 self.match(ASLParser.COLON) - self.state = 674 + self.state = 698 self.assign_template_value() pass @@ -6375,24 +6671,24 @@ def accept(self, visitor:ParseTreeVisitor): def assign_template_value(self): localctx = ASLParser.Assign_template_valueContext(self, self._ctx, self.state) - self.enterRule(localctx, 100, self.RULE_assign_template_value) + self.enterRule(localctx, 102, self.RULE_assign_template_value) try: - self.state = 680 + self.state = 704 self._errHandler.sync(self) token = self._input.LA(1) if token in [5]: self.enterOuterAlt(localctx, 1) - self.state = 677 + self.state = 701 self.assign_template_value_object() pass elif token in [3]: self.enterOuterAlt(localctx, 2) - self.state = 678 + self.state = 702 self.assign_template_value_array() pass - elif token in [7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159]: + elif token in [7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161]: self.enterOuterAlt(localctx, 3) - self.state = 679 + self.state = 703 self.assign_template_value_terminal() pass else: @@ -6456,39 +6752,39 @@ def accept(self, visitor:ParseTreeVisitor): def assign_template_value_array(self): localctx = ASLParser.Assign_template_value_arrayContext(self, self._ctx, self.state) - self.enterRule(localctx, 102, self.RULE_assign_template_value_array) + self.enterRule(localctx, 104, self.RULE_assign_template_value_array) self._la = 0 # Token type try: - self.state = 695 + self.state = 719 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,40,self._ctx) + la_ = self._interp.adaptivePredict(self._input,41,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 682 + self.state = 706 self.match(ASLParser.LBRACK) - self.state = 683 + self.state = 707 self.match(ASLParser.RBRACK) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 684 + self.state = 708 self.match(ASLParser.LBRACK) - self.state = 685 + self.state = 709 self.assign_template_value() - self.state = 690 + self.state = 714 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 686 + self.state = 710 self.match(ASLParser.COMMA) - self.state = 687 + self.state = 711 self.assign_template_value() - self.state = 692 + self.state = 716 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 693 + self.state = 717 self.match(ASLParser.RBRACK) pass @@ -6670,30 +6966,30 @@ def accept(self, visitor:ParseTreeVisitor): def assign_template_value_terminal(self): localctx = ASLParser.Assign_template_value_terminalContext(self, self._ctx, self.state) - self.enterRule(localctx, 104, self.RULE_assign_template_value_terminal) + self.enterRule(localctx, 106, self.RULE_assign_template_value_terminal) self._la = 0 # Token type try: - self.state = 703 + self.state = 727 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,41,self._ctx) + la_ = self._interp.adaptivePredict(self._input,42,self._ctx) if la_ == 1: localctx = ASLParser.Assign_template_value_terminal_floatContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 697 + self.state = 721 self.match(ASLParser.NUMBER) pass elif la_ == 2: localctx = ASLParser.Assign_template_value_terminal_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 698 + self.state = 722 self.match(ASLParser.INT) pass elif la_ == 3: localctx = ASLParser.Assign_template_value_terminal_boolContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 699 + self.state = 723 _la = self._input.LA(1) if not(_la==7 or _la==8): self._errHandler.recoverInline(self) @@ -6705,21 +7001,21 @@ def assign_template_value_terminal(self): elif la_ == 4: localctx = ASLParser.Assign_template_value_terminal_nullContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 700 + self.state = 724 self.match(ASLParser.NULL) pass elif la_ == 5: localctx = ASLParser.Assign_template_value_terminal_expressionContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 701 + self.state = 725 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 6: localctx = ASLParser.Assign_template_value_terminal_strContext(self, localctx) self.enterOuterAlt(localctx, 6) - self.state = 702 + self.state = 726 self.keyword_or_string() pass @@ -6811,30 +7107,30 @@ def accept(self, visitor:ParseTreeVisitor): def arguments_decl(self): localctx = ASLParser.Arguments_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 106, self.RULE_arguments_decl) + self.enterRule(localctx, 108, self.RULE_arguments_decl) try: - self.state = 711 + self.state = 735 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,42,self._ctx) + la_ = self._interp.adaptivePredict(self._input,43,self._ctx) if la_ == 1: localctx = ASLParser.Arguments_objectContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 705 + self.state = 729 self.match(ASLParser.ARGUMENTS) - self.state = 706 + self.state = 730 self.match(ASLParser.COLON) - self.state = 707 + self.state = 731 self.jsonata_template_value_object() pass elif la_ == 2: localctx = ASLParser.Arguments_exprContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 708 + self.state = 732 self.match(ASLParser.ARGUMENTS) - self.state = 709 + self.state = 733 self.match(ASLParser.COLON) - self.state = 710 + self.state = 734 self.match(ASLParser.STRINGJSONATA) pass @@ -6888,14 +7184,14 @@ def accept(self, visitor:ParseTreeVisitor): def output_decl(self): localctx = ASLParser.Output_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 108, self.RULE_output_decl) + self.enterRule(localctx, 110, self.RULE_output_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 713 + self.state = 737 self.match(ASLParser.OUTPUT) - self.state = 714 + self.state = 738 self.match(ASLParser.COLON) - self.state = 715 + self.state = 739 self.jsonata_template_value() except RecognitionException as re: localctx.exception = re @@ -6955,39 +7251,39 @@ def accept(self, visitor:ParseTreeVisitor): def jsonata_template_value_object(self): localctx = ASLParser.Jsonata_template_value_objectContext(self, self._ctx, self.state) - self.enterRule(localctx, 110, self.RULE_jsonata_template_value_object) + self.enterRule(localctx, 112, self.RULE_jsonata_template_value_object) self._la = 0 # Token type try: - self.state = 730 + self.state = 754 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,44,self._ctx) + la_ = self._interp.adaptivePredict(self._input,45,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 717 + self.state = 741 self.match(ASLParser.LBRACE) - self.state = 718 + self.state = 742 self.match(ASLParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 719 + self.state = 743 self.match(ASLParser.LBRACE) - self.state = 720 + self.state = 744 self.jsonata_template_binding() - self.state = 725 + self.state = 749 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 721 + self.state = 745 self.match(ASLParser.COMMA) - self.state = 722 + self.state = 746 self.jsonata_template_binding() - self.state = 727 + self.state = 751 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 728 + self.state = 752 self.match(ASLParser.RBRACE) pass @@ -7042,14 +7338,14 @@ def accept(self, visitor:ParseTreeVisitor): def jsonata_template_binding(self): localctx = ASLParser.Jsonata_template_bindingContext(self, self._ctx, self.state) - self.enterRule(localctx, 112, self.RULE_jsonata_template_binding) + self.enterRule(localctx, 114, self.RULE_jsonata_template_binding) try: self.enterOuterAlt(localctx, 1) - self.state = 732 + self.state = 756 self.keyword_or_string() - self.state = 733 + self.state = 757 self.match(ASLParser.COLON) - self.state = 734 + self.state = 758 self.jsonata_template_value() except RecognitionException as re: localctx.exception = re @@ -7102,24 +7398,24 @@ def accept(self, visitor:ParseTreeVisitor): def jsonata_template_value(self): localctx = ASLParser.Jsonata_template_valueContext(self, self._ctx, self.state) - self.enterRule(localctx, 114, self.RULE_jsonata_template_value) + self.enterRule(localctx, 116, self.RULE_jsonata_template_value) try: - self.state = 739 + self.state = 763 self._errHandler.sync(self) token = self._input.LA(1) if token in [5]: self.enterOuterAlt(localctx, 1) - self.state = 736 + self.state = 760 self.jsonata_template_value_object() pass elif token in [3]: self.enterOuterAlt(localctx, 2) - self.state = 737 + self.state = 761 self.jsonata_template_value_array() pass - elif token in [7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159]: + elif token in [7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161]: self.enterOuterAlt(localctx, 3) - self.state = 738 + self.state = 762 self.jsonata_template_value_terminal() pass else: @@ -7183,39 +7479,39 @@ def accept(self, visitor:ParseTreeVisitor): def jsonata_template_value_array(self): localctx = ASLParser.Jsonata_template_value_arrayContext(self, self._ctx, self.state) - self.enterRule(localctx, 116, self.RULE_jsonata_template_value_array) + self.enterRule(localctx, 118, self.RULE_jsonata_template_value_array) self._la = 0 # Token type try: - self.state = 754 + self.state = 778 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,47,self._ctx) + la_ = self._interp.adaptivePredict(self._input,48,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 741 + self.state = 765 self.match(ASLParser.LBRACK) - self.state = 742 + self.state = 766 self.match(ASLParser.RBRACK) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 743 + self.state = 767 self.match(ASLParser.LBRACK) - self.state = 744 + self.state = 768 self.jsonata_template_value() - self.state = 749 + self.state = 773 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 745 + self.state = 769 self.match(ASLParser.COMMA) - self.state = 746 + self.state = 770 self.jsonata_template_value() - self.state = 751 + self.state = 775 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 752 + self.state = 776 self.match(ASLParser.RBRACK) pass @@ -7397,30 +7693,30 @@ def accept(self, visitor:ParseTreeVisitor): def jsonata_template_value_terminal(self): localctx = ASLParser.Jsonata_template_value_terminalContext(self, self._ctx, self.state) - self.enterRule(localctx, 118, self.RULE_jsonata_template_value_terminal) + self.enterRule(localctx, 120, self.RULE_jsonata_template_value_terminal) self._la = 0 # Token type try: - self.state = 762 + self.state = 786 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,48,self._ctx) + la_ = self._interp.adaptivePredict(self._input,49,self._ctx) if la_ == 1: localctx = ASLParser.Jsonata_template_value_terminal_floatContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 756 + self.state = 780 self.match(ASLParser.NUMBER) pass elif la_ == 2: localctx = ASLParser.Jsonata_template_value_terminal_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 757 + self.state = 781 self.match(ASLParser.INT) pass elif la_ == 3: localctx = ASLParser.Jsonata_template_value_terminal_boolContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 758 + self.state = 782 _la = self._input.LA(1) if not(_la==7 or _la==8): self._errHandler.recoverInline(self) @@ -7432,21 +7728,21 @@ def jsonata_template_value_terminal(self): elif la_ == 4: localctx = ASLParser.Jsonata_template_value_terminal_nullContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 759 + self.state = 783 self.match(ASLParser.NULL) pass elif la_ == 5: localctx = ASLParser.Jsonata_template_value_terminal_expressionContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 760 + self.state = 784 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 6: localctx = ASLParser.Jsonata_template_value_terminal_strContext(self, localctx) self.enterOuterAlt(localctx, 6) - self.state = 761 + self.state = 785 self.keyword_or_string() pass @@ -7500,14 +7796,14 @@ def accept(self, visitor:ParseTreeVisitor): def result_selector_decl(self): localctx = ASLParser.Result_selector_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 120, self.RULE_result_selector_decl) + self.enterRule(localctx, 122, self.RULE_result_selector_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 764 + self.state = 788 self.match(ASLParser.RESULTSELECTOR) - self.state = 765 + self.state = 789 self.match(ASLParser.COLON) - self.state = 766 + self.state = 790 self.payload_tmpl_decl() except RecognitionException as re: localctx.exception = re @@ -7572,11 +7868,11 @@ def accept(self, visitor:ParseTreeVisitor): def state_type(self): localctx = ASLParser.State_typeContext(self, self._ctx, self.state) - self.enterRule(localctx, 122, self.RULE_state_type) + self.enterRule(localctx, 124, self.RULE_state_type) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 768 + self.state = 792 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 16711680) != 0)): self._errHandler.recoverInline(self) @@ -7647,31 +7943,31 @@ def accept(self, visitor:ParseTreeVisitor): def choices_decl(self): localctx = ASLParser.Choices_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 124, self.RULE_choices_decl) + self.enterRule(localctx, 126, self.RULE_choices_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 770 + self.state = 794 self.match(ASLParser.CHOICES) - self.state = 771 + self.state = 795 self.match(ASLParser.COLON) - self.state = 772 + self.state = 796 self.match(ASLParser.LBRACK) - self.state = 773 + self.state = 797 self.choice_rule() - self.state = 778 + self.state = 802 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 774 + self.state = 798 self.match(ASLParser.COMMA) - self.state = 775 + self.state = 799 self.choice_rule() - self.state = 780 + self.state = 804 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 781 + self.state = 805 self.match(ASLParser.RBRACK) except RecognitionException as re: localctx.exception = re @@ -7777,57 +8073,57 @@ def accept(self, visitor:ParseTreeVisitor): def choice_rule(self): localctx = ASLParser.Choice_ruleContext(self, self._ctx, self.state) - self.enterRule(localctx, 126, self.RULE_choice_rule) + self.enterRule(localctx, 128, self.RULE_choice_rule) self._la = 0 # Token type try: - self.state = 804 + self.state = 828 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,52,self._ctx) + la_ = self._interp.adaptivePredict(self._input,53,self._ctx) if la_ == 1: localctx = ASLParser.Choice_rule_comparison_variableContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 783 + self.state = 807 self.match(ASLParser.LBRACE) - self.state = 784 + self.state = 808 self.comparison_variable_stmt() - self.state = 787 + self.state = 811 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 785 + self.state = 809 self.match(ASLParser.COMMA) - self.state = 786 + self.state = 810 self.comparison_variable_stmt() - self.state = 789 + self.state = 813 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==1): break - self.state = 791 + self.state = 815 self.match(ASLParser.RBRACE) pass elif la_ == 2: localctx = ASLParser.Choice_rule_comparison_compositeContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 793 + self.state = 817 self.match(ASLParser.LBRACE) - self.state = 794 + self.state = 818 self.comparison_composite_stmt() - self.state = 799 + self.state = 823 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 795 + self.state = 819 self.match(ASLParser.COMMA) - self.state = 796 + self.state = 820 self.comparison_composite_stmt() - self.state = 801 + self.state = 825 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 802 + self.state = 826 self.match(ASLParser.RBRACE) pass @@ -7891,34 +8187,34 @@ def accept(self, visitor:ParseTreeVisitor): def comparison_variable_stmt(self): localctx = ASLParser.Comparison_variable_stmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 128, self.RULE_comparison_variable_stmt) + self.enterRule(localctx, 130, self.RULE_comparison_variable_stmt) try: - self.state = 811 + self.state = 835 self._errHandler.sync(self) token = self._input.LA(1) if token in [26]: self.enterOuterAlt(localctx, 1) - self.state = 806 + self.state = 830 self.variable_decl() pass elif token in [25, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]: self.enterOuterAlt(localctx, 2) - self.state = 807 + self.state = 831 self.comparison_func() pass - elif token in [113]: + elif token in [115]: self.enterOuterAlt(localctx, 3) - self.state = 808 + self.state = 832 self.next_decl() pass - elif token in [132]: + elif token in [134]: self.enterOuterAlt(localctx, 4) - self.state = 809 + self.state = 833 self.assign_decl() pass elif token in [10]: self.enterOuterAlt(localctx, 5) - self.state = 810 + self.state = 834 self.comment_decl() pass else: @@ -7979,29 +8275,29 @@ def accept(self, visitor:ParseTreeVisitor): def comparison_composite_stmt(self): localctx = ASLParser.Comparison_composite_stmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 130, self.RULE_comparison_composite_stmt) + self.enterRule(localctx, 132, self.RULE_comparison_composite_stmt) try: - self.state = 817 + self.state = 841 self._errHandler.sync(self) token = self._input.LA(1) if token in [29, 38, 49]: self.enterOuterAlt(localctx, 1) - self.state = 813 + self.state = 837 self.comparison_composite() pass - elif token in [113]: + elif token in [115]: self.enterOuterAlt(localctx, 2) - self.state = 814 + self.state = 838 self.next_decl() pass - elif token in [132]: + elif token in [134]: self.enterOuterAlt(localctx, 3) - self.state = 815 + self.state = 839 self.assign_decl() pass elif token in [10]: self.enterOuterAlt(localctx, 4) - self.state = 816 + self.state = 840 self.comment_decl() pass else: @@ -8072,39 +8368,39 @@ def accept(self, visitor:ParseTreeVisitor): def comparison_composite(self): localctx = ASLParser.Comparison_compositeContext(self, self._ctx, self.state) - self.enterRule(localctx, 132, self.RULE_comparison_composite) + self.enterRule(localctx, 134, self.RULE_comparison_composite) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 819 + self.state = 843 self.choice_operator() - self.state = 820 + self.state = 844 self.match(ASLParser.COLON) - self.state = 833 + self.state = 857 self._errHandler.sync(self) token = self._input.LA(1) if token in [5]: - self.state = 821 + self.state = 845 self.choice_rule() pass elif token in [3]: - self.state = 822 + self.state = 846 self.match(ASLParser.LBRACK) - self.state = 823 + self.state = 847 self.choice_rule() - self.state = 828 + self.state = 852 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 824 + self.state = 848 self.match(ASLParser.COMMA) - self.state = 825 + self.state = 849 self.choice_rule() - self.state = 830 + self.state = 854 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 831 + self.state = 855 self.match(ASLParser.RBRACK) pass else: @@ -8225,41 +8521,41 @@ def accept(self, visitor:ParseTreeVisitor): def variable_decl(self): localctx = ASLParser.Variable_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 134, self.RULE_variable_decl) + self.enterRule(localctx, 136, self.RULE_variable_decl) try: - self.state = 844 + self.state = 868 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,57,self._ctx) + la_ = self._interp.adaptivePredict(self._input,58,self._ctx) if la_ == 1: localctx = ASLParser.Variable_decl_pathContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 835 + self.state = 859 self.match(ASLParser.VARIABLE) - self.state = 836 + self.state = 860 self.match(ASLParser.COLON) - self.state = 837 + self.state = 861 self.match(ASLParser.STRINGPATH) pass elif la_ == 2: localctx = ASLParser.Variable_decl_varContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 838 + self.state = 862 self.match(ASLParser.VARIABLE) - self.state = 839 + self.state = 863 self.match(ASLParser.COLON) - self.state = 840 + self.state = 864 self.variable_sample() pass elif la_ == 3: localctx = ASLParser.Variable_decl_path_context_objectContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 841 + self.state = 865 self.match(ASLParser.VARIABLE) - self.state = 842 + self.state = 866 self.match(ASLParser.COLON) - self.state = 843 + self.state = 867 self.match(ASLParser.STRINGPATHCONTEXTOBJ) pass @@ -8412,20 +8708,20 @@ def accept(self, visitor:ParseTreeVisitor): def comparison_func(self): localctx = ASLParser.Comparison_funcContext(self, self._ctx, self.state) - self.enterRule(localctx, 136, self.RULE_comparison_func) + self.enterRule(localctx, 138, self.RULE_comparison_func) self._la = 0 # Token type try: - self.state = 860 + self.state = 884 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,58,self._ctx) + la_ = self._interp.adaptivePredict(self._input,59,self._ctx) if la_ == 1: localctx = ASLParser.Condition_litContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 846 + self.state = 870 self.match(ASLParser.CONDITION) - self.state = 847 + self.state = 871 self.match(ASLParser.COLON) - self.state = 848 + self.state = 872 _la = self._input.LA(1) if not(_la==7 or _la==8): self._errHandler.recoverInline(self) @@ -8437,33 +8733,33 @@ def comparison_func(self): elif la_ == 2: localctx = ASLParser.Condition_exprContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 849 + self.state = 873 self.match(ASLParser.CONDITION) - self.state = 850 + self.state = 874 self.match(ASLParser.COLON) - self.state = 851 + self.state = 875 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 3: localctx = ASLParser.Comparison_func_varContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 852 + self.state = 876 self.comparison_op() - self.state = 853 + self.state = 877 self.match(ASLParser.COLON) - self.state = 854 + self.state = 878 self.variable_sample() pass elif la_ == 4: localctx = ASLParser.Comparison_func_valueContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 856 + self.state = 880 self.comparison_op() - self.state = 857 + self.state = 881 self.match(ASLParser.COLON) - self.state = 858 + self.state = 882 self.json_value_decl() pass @@ -8532,31 +8828,31 @@ def accept(self, visitor:ParseTreeVisitor): def branches_decl(self): localctx = ASLParser.Branches_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 138, self.RULE_branches_decl) + self.enterRule(localctx, 140, self.RULE_branches_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 862 + self.state = 886 self.match(ASLParser.BRANCHES) - self.state = 863 + self.state = 887 self.match(ASLParser.COLON) - self.state = 864 + self.state = 888 self.match(ASLParser.LBRACK) - self.state = 865 + self.state = 889 self.program_decl() - self.state = 870 + self.state = 894 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 866 + self.state = 890 self.match(ASLParser.COMMA) - self.state = 867 + self.state = 891 self.program_decl() - self.state = 872 + self.state = 896 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 873 + self.state = 897 self.match(ASLParser.RBRACK) except RecognitionException as re: localctx.exception = re @@ -8622,31 +8918,31 @@ def accept(self, visitor:ParseTreeVisitor): def item_processor_decl(self): localctx = ASLParser.Item_processor_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 140, self.RULE_item_processor_decl) + self.enterRule(localctx, 142, self.RULE_item_processor_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 875 + self.state = 899 self.match(ASLParser.ITEMPROCESSOR) - self.state = 876 + self.state = 900 self.match(ASLParser.COLON) - self.state = 877 + self.state = 901 self.match(ASLParser.LBRACE) - self.state = 878 + self.state = 902 self.item_processor_item() - self.state = 883 + self.state = 907 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 879 + self.state = 903 self.match(ASLParser.COMMA) - self.state = 880 + self.state = 904 self.item_processor_item() - self.state = 885 + self.state = 909 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 886 + self.state = 910 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -8703,29 +8999,29 @@ def accept(self, visitor:ParseTreeVisitor): def item_processor_item(self): localctx = ASLParser.Item_processor_itemContext(self, self._ctx, self.state) - self.enterRule(localctx, 142, self.RULE_item_processor_item) + self.enterRule(localctx, 144, self.RULE_item_processor_item) try: - self.state = 892 + self.state = 916 self._errHandler.sync(self) token = self._input.LA(1) if token in [79]: self.enterOuterAlt(localctx, 1) - self.state = 888 + self.state = 912 self.processor_config_decl() pass elif token in [12]: self.enterOuterAlt(localctx, 2) - self.state = 889 + self.state = 913 self.startat_decl() pass elif token in [11]: self.enterOuterAlt(localctx, 3) - self.state = 890 + self.state = 914 self.states_decl() pass elif token in [10]: self.enterOuterAlt(localctx, 4) - self.state = 891 + self.state = 915 self.comment_decl() pass else: @@ -8795,31 +9091,31 @@ def accept(self, visitor:ParseTreeVisitor): def processor_config_decl(self): localctx = ASLParser.Processor_config_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 144, self.RULE_processor_config_decl) + self.enterRule(localctx, 146, self.RULE_processor_config_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 894 + self.state = 918 self.match(ASLParser.PROCESSORCONFIG) - self.state = 895 + self.state = 919 self.match(ASLParser.COLON) - self.state = 896 + self.state = 920 self.match(ASLParser.LBRACE) - self.state = 897 + self.state = 921 self.processor_config_field() - self.state = 902 + self.state = 926 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 898 + self.state = 922 self.match(ASLParser.COMMA) - self.state = 899 + self.state = 923 self.processor_config_field() - self.state = 904 + self.state = 928 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 905 + self.state = 929 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -8868,19 +9164,19 @@ def accept(self, visitor:ParseTreeVisitor): def processor_config_field(self): localctx = ASLParser.Processor_config_fieldContext(self, self._ctx, self.state) - self.enterRule(localctx, 146, self.RULE_processor_config_field) + self.enterRule(localctx, 148, self.RULE_processor_config_field) try: - self.state = 909 + self.state = 933 self._errHandler.sync(self) token = self._input.LA(1) if token in [80]: self.enterOuterAlt(localctx, 1) - self.state = 907 + self.state = 931 self.mode_decl() pass elif token in [83]: self.enterOuterAlt(localctx, 2) - self.state = 908 + self.state = 932 self.execution_decl() pass else: @@ -8935,14 +9231,14 @@ def accept(self, visitor:ParseTreeVisitor): def mode_decl(self): localctx = ASLParser.Mode_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 148, self.RULE_mode_decl) + self.enterRule(localctx, 150, self.RULE_mode_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 911 + self.state = 935 self.match(ASLParser.MODE) - self.state = 912 + self.state = 936 self.match(ASLParser.COLON) - self.state = 913 + self.state = 937 self.mode_type() except RecognitionException as re: localctx.exception = re @@ -8989,11 +9285,11 @@ def accept(self, visitor:ParseTreeVisitor): def mode_type(self): localctx = ASLParser.Mode_typeContext(self, self._ctx, self.state) - self.enterRule(localctx, 150, self.RULE_mode_type) + self.enterRule(localctx, 152, self.RULE_mode_type) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 915 + self.state = 939 _la = self._input.LA(1) if not(_la==81 or _la==82): self._errHandler.recoverInline(self) @@ -9049,14 +9345,14 @@ def accept(self, visitor:ParseTreeVisitor): def execution_decl(self): localctx = ASLParser.Execution_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 152, self.RULE_execution_decl) + self.enterRule(localctx, 154, self.RULE_execution_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 917 + self.state = 941 self.match(ASLParser.EXECUTIONTYPE) - self.state = 918 + self.state = 942 self.match(ASLParser.COLON) - self.state = 919 + self.state = 943 self.execution_type() except RecognitionException as re: localctx.exception = re @@ -9100,10 +9396,10 @@ def accept(self, visitor:ParseTreeVisitor): def execution_type(self): localctx = ASLParser.Execution_typeContext(self, self._ctx, self.state) - self.enterRule(localctx, 154, self.RULE_execution_type) + self.enterRule(localctx, 156, self.RULE_execution_type) try: self.enterOuterAlt(localctx, 1) - self.state = 921 + self.state = 945 self.match(ASLParser.STANDARD) except RecognitionException as re: localctx.exception = re @@ -9169,31 +9465,31 @@ def accept(self, visitor:ParseTreeVisitor): def iterator_decl(self): localctx = ASLParser.Iterator_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 156, self.RULE_iterator_decl) + self.enterRule(localctx, 158, self.RULE_iterator_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 923 + self.state = 947 self.match(ASLParser.ITERATOR) - self.state = 924 + self.state = 948 self.match(ASLParser.COLON) - self.state = 925 + self.state = 949 self.match(ASLParser.LBRACE) - self.state = 926 + self.state = 950 self.iterator_decl_item() - self.state = 931 + self.state = 955 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 927 + self.state = 951 self.match(ASLParser.COMMA) - self.state = 928 + self.state = 952 self.iterator_decl_item() - self.state = 933 + self.state = 957 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 934 + self.state = 958 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -9250,29 +9546,29 @@ def accept(self, visitor:ParseTreeVisitor): def iterator_decl_item(self): localctx = ASLParser.Iterator_decl_itemContext(self, self._ctx, self.state) - self.enterRule(localctx, 158, self.RULE_iterator_decl_item) + self.enterRule(localctx, 160, self.RULE_iterator_decl_item) try: - self.state = 940 + self.state = 964 self._errHandler.sync(self) token = self._input.LA(1) if token in [12]: self.enterOuterAlt(localctx, 1) - self.state = 936 + self.state = 960 self.startat_decl() pass elif token in [11]: self.enterOuterAlt(localctx, 2) - self.state = 937 + self.state = 961 self.states_decl() pass elif token in [10]: self.enterOuterAlt(localctx, 3) - self.state = 938 + self.state = 962 self.comment_decl() pass elif token in [79]: self.enterOuterAlt(localctx, 4) - self.state = 939 + self.state = 963 self.processor_config_decl() pass else: @@ -9327,14 +9623,14 @@ def accept(self, visitor:ParseTreeVisitor): def item_selector_decl(self): localctx = ASLParser.Item_selector_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 160, self.RULE_item_selector_decl) + self.enterRule(localctx, 162, self.RULE_item_selector_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 942 + self.state = 966 self.match(ASLParser.ITEMSELECTOR) - self.state = 943 + self.state = 967 self.match(ASLParser.COLON) - self.state = 944 + self.state = 968 self.payload_tmpl_decl() except RecognitionException as re: localctx.exception = re @@ -9400,31 +9696,31 @@ def accept(self, visitor:ParseTreeVisitor): def item_reader_decl(self): localctx = ASLParser.Item_reader_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 162, self.RULE_item_reader_decl) + self.enterRule(localctx, 164, self.RULE_item_reader_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 946 + self.state = 970 self.match(ASLParser.ITEMREADER) - self.state = 947 + self.state = 971 self.match(ASLParser.COLON) - self.state = 948 + self.state = 972 self.match(ASLParser.LBRACE) - self.state = 949 + self.state = 973 self.items_reader_field() - self.state = 954 + self.state = 978 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 950 + self.state = 974 self.match(ASLParser.COMMA) - self.state = 951 + self.state = 975 self.items_reader_field() - self.state = 956 + self.state = 980 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 957 + self.state = 981 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -9481,29 +9777,29 @@ def accept(self, visitor:ParseTreeVisitor): def items_reader_field(self): localctx = ASLParser.Items_reader_fieldContext(self, self._ctx, self.state) - self.enterRule(localctx, 164, self.RULE_items_reader_field) + self.enterRule(localctx, 166, self.RULE_items_reader_field) try: - self.state = 963 + self.state = 987 self._errHandler.sync(self) token = self._input.LA(1) if token in [90]: self.enterOuterAlt(localctx, 1) - self.state = 959 + self.state = 983 self.resource_decl() pass - elif token in [101]: + elif token in [103]: self.enterOuterAlt(localctx, 2) - self.state = 960 + self.state = 984 self.reader_config_decl() pass elif token in [97]: self.enterOuterAlt(localctx, 3) - self.state = 961 + self.state = 985 self.parameters_decl() pass - elif token in [134]: + elif token in [136]: self.enterOuterAlt(localctx, 4) - self.state = 962 + self.state = 986 self.arguments_decl() pass else: @@ -9573,31 +9869,31 @@ def accept(self, visitor:ParseTreeVisitor): def reader_config_decl(self): localctx = ASLParser.Reader_config_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 166, self.RULE_reader_config_decl) + self.enterRule(localctx, 168, self.RULE_reader_config_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 965 + self.state = 989 self.match(ASLParser.READERCONFIG) - self.state = 966 + self.state = 990 self.match(ASLParser.COLON) - self.state = 967 + self.state = 991 self.match(ASLParser.LBRACE) - self.state = 968 + self.state = 992 self.reader_config_field() - self.state = 973 + self.state = 997 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 969 + self.state = 993 self.match(ASLParser.COMMA) - self.state = 970 + self.state = 994 self.reader_config_field() - self.state = 975 + self.state = 999 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 976 + self.state = 1000 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -9658,34 +9954,34 @@ def accept(self, visitor:ParseTreeVisitor): def reader_config_field(self): localctx = ASLParser.Reader_config_fieldContext(self, self._ctx, self.state) - self.enterRule(localctx, 168, self.RULE_reader_config_field) + self.enterRule(localctx, 170, self.RULE_reader_config_field) try: - self.state = 983 + self.state = 1007 self._errHandler.sync(self) token = self._input.LA(1) - if token in [102]: + if token in [104]: self.enterOuterAlt(localctx, 1) - self.state = 978 + self.state = 1002 self.input_type_decl() pass - elif token in [103]: + elif token in [105]: self.enterOuterAlt(localctx, 2) - self.state = 979 + self.state = 1003 self.csv_header_location_decl() pass - elif token in [104]: + elif token in [106]: self.enterOuterAlt(localctx, 3) - self.state = 980 + self.state = 1004 self.csv_headers_decl() pass - elif token in [105]: + elif token in [107]: self.enterOuterAlt(localctx, 4) - self.state = 981 + self.state = 1005 self.max_items_decl() pass - elif token in [106]: + elif token in [108]: self.enterOuterAlt(localctx, 5) - self.state = 982 + self.state = 1006 self.max_items_path_decl() pass else: @@ -9740,14 +10036,14 @@ def accept(self, visitor:ParseTreeVisitor): def input_type_decl(self): localctx = ASLParser.Input_type_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 170, self.RULE_input_type_decl) + self.enterRule(localctx, 172, self.RULE_input_type_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 985 + self.state = 1009 self.match(ASLParser.INPUTTYPE) - self.state = 986 + self.state = 1010 self.match(ASLParser.COLON) - self.state = 987 + self.state = 1011 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -9798,14 +10094,14 @@ def accept(self, visitor:ParseTreeVisitor): def csv_header_location_decl(self): localctx = ASLParser.Csv_header_location_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 172, self.RULE_csv_header_location_decl) + self.enterRule(localctx, 174, self.RULE_csv_header_location_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 989 + self.state = 1013 self.match(ASLParser.CSVHEADERLOCATION) - self.state = 990 + self.state = 1014 self.match(ASLParser.COLON) - self.state = 991 + self.state = 1015 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -9871,31 +10167,31 @@ def accept(self, visitor:ParseTreeVisitor): def csv_headers_decl(self): localctx = ASLParser.Csv_headers_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 174, self.RULE_csv_headers_decl) + self.enterRule(localctx, 176, self.RULE_csv_headers_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 993 + self.state = 1017 self.match(ASLParser.CSVHEADERS) - self.state = 994 + self.state = 1018 self.match(ASLParser.COLON) - self.state = 995 + self.state = 1019 self.match(ASLParser.LBRACK) - self.state = 996 + self.state = 1020 self.keyword_or_string() - self.state = 1001 + self.state = 1025 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 997 + self.state = 1021 self.match(ASLParser.COMMA) - self.state = 998 + self.state = 1022 self.keyword_or_string() - self.state = 1003 + self.state = 1027 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1004 + self.state = 1028 self.match(ASLParser.RBRACK) except RecognitionException as re: localctx.exception = re @@ -9983,30 +10279,30 @@ def accept(self, visitor:ParseTreeVisitor): def max_items_decl(self): localctx = ASLParser.Max_items_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 176, self.RULE_max_items_decl) + self.enterRule(localctx, 178, self.RULE_max_items_decl) try: - self.state = 1012 + self.state = 1036 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,71,self._ctx) + la_ = self._interp.adaptivePredict(self._input,72,self._ctx) if la_ == 1: localctx = ASLParser.Max_items_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1006 + self.state = 1030 self.match(ASLParser.MAXITEMS) - self.state = 1007 + self.state = 1031 self.match(ASLParser.COLON) - self.state = 1008 + self.state = 1032 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Max_items_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1009 + self.state = 1033 self.match(ASLParser.MAXITEMS) - self.state = 1010 + self.state = 1034 self.match(ASLParser.COLON) - self.state = 1011 + self.state = 1035 self.match(ASLParser.INT) pass @@ -10098,30 +10394,30 @@ def accept(self, visitor:ParseTreeVisitor): def max_items_path_decl(self): localctx = ASLParser.Max_items_path_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 178, self.RULE_max_items_path_decl) + self.enterRule(localctx, 180, self.RULE_max_items_path_decl) try: - self.state = 1020 + self.state = 1044 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,72,self._ctx) + la_ = self._interp.adaptivePredict(self._input,73,self._ctx) if la_ == 1: localctx = ASLParser.Max_items_path_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1014 + self.state = 1038 self.match(ASLParser.MAXITEMSPATH) - self.state = 1015 + self.state = 1039 self.match(ASLParser.COLON) - self.state = 1016 + self.state = 1040 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Max_items_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1017 + self.state = 1041 self.match(ASLParser.MAXITEMSPATH) - self.state = 1018 + self.state = 1042 self.match(ASLParser.COLON) - self.state = 1019 + self.state = 1043 self.match(ASLParser.STRINGPATH) pass @@ -10212,30 +10508,30 @@ def accept(self, visitor:ParseTreeVisitor): def tolerated_failure_count_decl(self): localctx = ASLParser.Tolerated_failure_count_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 180, self.RULE_tolerated_failure_count_decl) + self.enterRule(localctx, 182, self.RULE_tolerated_failure_count_decl) try: - self.state = 1028 + self.state = 1052 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,73,self._ctx) + la_ = self._interp.adaptivePredict(self._input,74,self._ctx) if la_ == 1: localctx = ASLParser.Tolerated_failure_count_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1022 + self.state = 1046 self.match(ASLParser.TOLERATEDFAILURECOUNT) - self.state = 1023 + self.state = 1047 self.match(ASLParser.COLON) - self.state = 1024 + self.state = 1048 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Tolerated_failure_count_intContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1025 + self.state = 1049 self.match(ASLParser.TOLERATEDFAILURECOUNT) - self.state = 1026 + self.state = 1050 self.match(ASLParser.COLON) - self.state = 1027 + self.state = 1051 self.match(ASLParser.INT) pass @@ -10327,30 +10623,30 @@ def accept(self, visitor:ParseTreeVisitor): def tolerated_failure_count_path_decl(self): localctx = ASLParser.Tolerated_failure_count_path_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 182, self.RULE_tolerated_failure_count_path_decl) + self.enterRule(localctx, 184, self.RULE_tolerated_failure_count_path_decl) try: - self.state = 1036 + self.state = 1060 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,74,self._ctx) + la_ = self._interp.adaptivePredict(self._input,75,self._ctx) if la_ == 1: localctx = ASLParser.Tolerated_failure_count_path_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1030 + self.state = 1054 self.match(ASLParser.TOLERATEDFAILURECOUNTPATH) - self.state = 1031 + self.state = 1055 self.match(ASLParser.COLON) - self.state = 1032 + self.state = 1056 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Tolerated_failure_count_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1033 + self.state = 1057 self.match(ASLParser.TOLERATEDFAILURECOUNTPATH) - self.state = 1034 + self.state = 1058 self.match(ASLParser.COLON) - self.state = 1035 + self.state = 1059 self.match(ASLParser.STRINGPATH) pass @@ -10441,30 +10737,30 @@ def accept(self, visitor:ParseTreeVisitor): def tolerated_failure_percentage_decl(self): localctx = ASLParser.Tolerated_failure_percentage_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 184, self.RULE_tolerated_failure_percentage_decl) + self.enterRule(localctx, 186, self.RULE_tolerated_failure_percentage_decl) try: - self.state = 1044 + self.state = 1068 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,75,self._ctx) + la_ = self._interp.adaptivePredict(self._input,76,self._ctx) if la_ == 1: localctx = ASLParser.Tolerated_failure_percentage_jsonataContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1038 + self.state = 1062 self.match(ASLParser.TOLERATEDFAILUREPERCENTAGE) - self.state = 1039 + self.state = 1063 self.match(ASLParser.COLON) - self.state = 1040 + self.state = 1064 self.match(ASLParser.STRINGJSONATA) pass elif la_ == 2: localctx = ASLParser.Tolerated_failure_percentage_numberContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1041 + self.state = 1065 self.match(ASLParser.TOLERATEDFAILUREPERCENTAGE) - self.state = 1042 + self.state = 1066 self.match(ASLParser.COLON) - self.state = 1043 + self.state = 1067 self.match(ASLParser.NUMBER) pass @@ -10556,30 +10852,30 @@ def accept(self, visitor:ParseTreeVisitor): def tolerated_failure_percentage_path_decl(self): localctx = ASLParser.Tolerated_failure_percentage_path_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 186, self.RULE_tolerated_failure_percentage_path_decl) + self.enterRule(localctx, 188, self.RULE_tolerated_failure_percentage_path_decl) try: - self.state = 1052 + self.state = 1076 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,76,self._ctx) + la_ = self._interp.adaptivePredict(self._input,77,self._ctx) if la_ == 1: localctx = ASLParser.Tolerated_failure_percentage_path_varContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1046 + self.state = 1070 self.match(ASLParser.TOLERATEDFAILUREPERCENTAGEPATH) - self.state = 1047 + self.state = 1071 self.match(ASLParser.COLON) - self.state = 1048 + self.state = 1072 self.variable_sample() pass elif la_ == 2: localctx = ASLParser.Tolerated_failure_percentage_pathContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1049 + self.state = 1073 self.match(ASLParser.TOLERATEDFAILUREPERCENTAGEPATH) - self.state = 1050 + self.state = 1074 self.match(ASLParser.COLON) - self.state = 1051 + self.state = 1075 self.match(ASLParser.STRINGPATH) pass @@ -10633,14 +10929,14 @@ def accept(self, visitor:ParseTreeVisitor): def label_decl(self): localctx = ASLParser.Label_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 188, self.RULE_label_decl) + self.enterRule(localctx, 190, self.RULE_label_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 1054 + self.state = 1078 self.match(ASLParser.LABEL) - self.state = 1055 + self.state = 1079 self.match(ASLParser.COLON) - self.state = 1056 + self.state = 1080 self.keyword_or_string() except RecognitionException as re: localctx.exception = re @@ -10706,31 +11002,31 @@ def accept(self, visitor:ParseTreeVisitor): def result_writer_decl(self): localctx = ASLParser.Result_writer_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 190, self.RULE_result_writer_decl) + self.enterRule(localctx, 192, self.RULE_result_writer_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1058 + self.state = 1082 self.match(ASLParser.RESULTWRITER) - self.state = 1059 + self.state = 1083 self.match(ASLParser.COLON) - self.state = 1060 + self.state = 1084 self.match(ASLParser.LBRACE) - self.state = 1061 + self.state = 1085 self.result_writer_field() - self.state = 1066 + self.state = 1090 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1062 + self.state = 1086 self.match(ASLParser.COMMA) - self.state = 1063 + self.state = 1087 self.result_writer_field() - self.state = 1068 + self.state = 1092 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1069 + self.state = 1093 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -10779,19 +11075,19 @@ def accept(self, visitor:ParseTreeVisitor): def result_writer_field(self): localctx = ASLParser.Result_writer_fieldContext(self, self._ctx, self.state) - self.enterRule(localctx, 192, self.RULE_result_writer_field) + self.enterRule(localctx, 194, self.RULE_result_writer_field) try: - self.state = 1073 + self.state = 1097 self._errHandler.sync(self) token = self._input.LA(1) if token in [90]: self.enterOuterAlt(localctx, 1) - self.state = 1071 + self.state = 1095 self.resource_decl() pass elif token in [97]: self.enterOuterAlt(localctx, 2) - self.state = 1072 + self.state = 1096 self.parameters_decl() pass else: @@ -10861,37 +11157,37 @@ def accept(self, visitor:ParseTreeVisitor): def retry_decl(self): localctx = ASLParser.Retry_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 194, self.RULE_retry_decl) + self.enterRule(localctx, 196, self.RULE_retry_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1075 + self.state = 1099 self.match(ASLParser.RETRY) - self.state = 1076 + self.state = 1100 self.match(ASLParser.COLON) - self.state = 1077 + self.state = 1101 self.match(ASLParser.LBRACK) - self.state = 1086 + self.state = 1110 self._errHandler.sync(self) _la = self._input.LA(1) if _la==5: - self.state = 1078 + self.state = 1102 self.retrier_decl() - self.state = 1083 + self.state = 1107 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1079 + self.state = 1103 self.match(ASLParser.COMMA) - self.state = 1080 + self.state = 1104 self.retrier_decl() - self.state = 1085 + self.state = 1109 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1088 + self.state = 1112 self.match(ASLParser.RBRACK) except RecognitionException as re: localctx.exception = re @@ -10951,27 +11247,27 @@ def accept(self, visitor:ParseTreeVisitor): def retrier_decl(self): localctx = ASLParser.Retrier_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 196, self.RULE_retrier_decl) + self.enterRule(localctx, 198, self.RULE_retrier_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1090 + self.state = 1114 self.match(ASLParser.LBRACE) - self.state = 1091 + self.state = 1115 self.retrier_stmt() - self.state = 1096 + self.state = 1120 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1092 + self.state = 1116 self.match(ASLParser.COMMA) - self.state = 1093 + self.state = 1117 self.retrier_stmt() - self.state = 1098 + self.state = 1122 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1099 + self.state = 1123 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -11040,44 +11336,44 @@ def accept(self, visitor:ParseTreeVisitor): def retrier_stmt(self): localctx = ASLParser.Retrier_stmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 198, self.RULE_retrier_stmt) + self.enterRule(localctx, 200, self.RULE_retrier_stmt) try: - self.state = 1108 + self.state = 1132 self._errHandler.sync(self) token = self._input.LA(1) - if token in [120]: + if token in [122]: self.enterOuterAlt(localctx, 1) - self.state = 1101 + self.state = 1125 self.error_equals_decl() pass - elif token in [121]: + elif token in [123]: self.enterOuterAlt(localctx, 2) - self.state = 1102 + self.state = 1126 self.interval_seconds_decl() pass - elif token in [122]: + elif token in [124]: self.enterOuterAlt(localctx, 3) - self.state = 1103 + self.state = 1127 self.max_attempts_decl() pass - elif token in [123]: + elif token in [125]: self.enterOuterAlt(localctx, 4) - self.state = 1104 + self.state = 1128 self.backoff_rate_decl() pass - elif token in [124]: + elif token in [126]: self.enterOuterAlt(localctx, 5) - self.state = 1105 + self.state = 1129 self.max_delay_seconds_decl() pass - elif token in [125]: + elif token in [127]: self.enterOuterAlt(localctx, 6) - self.state = 1106 + self.state = 1130 self.jitter_strategy_decl() pass elif token in [10]: self.enterOuterAlt(localctx, 7) - self.state = 1107 + self.state = 1131 self.comment_decl() pass else: @@ -11147,31 +11443,31 @@ def accept(self, visitor:ParseTreeVisitor): def error_equals_decl(self): localctx = ASLParser.Error_equals_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 200, self.RULE_error_equals_decl) + self.enterRule(localctx, 202, self.RULE_error_equals_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1110 + self.state = 1134 self.match(ASLParser.ERROREQUALS) - self.state = 1111 + self.state = 1135 self.match(ASLParser.COLON) - self.state = 1112 + self.state = 1136 self.match(ASLParser.LBRACK) - self.state = 1113 + self.state = 1137 self.error_name() - self.state = 1118 + self.state = 1142 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1114 + self.state = 1138 self.match(ASLParser.COMMA) - self.state = 1115 + self.state = 1139 self.error_name() - self.state = 1120 + self.state = 1144 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1121 + self.state = 1145 self.match(ASLParser.RBRACK) except RecognitionException as re: localctx.exception = re @@ -11221,14 +11517,14 @@ def accept(self, visitor:ParseTreeVisitor): def interval_seconds_decl(self): localctx = ASLParser.Interval_seconds_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 202, self.RULE_interval_seconds_decl) + self.enterRule(localctx, 204, self.RULE_interval_seconds_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 1123 + self.state = 1147 self.match(ASLParser.INTERVALSECONDS) - self.state = 1124 + self.state = 1148 self.match(ASLParser.COLON) - self.state = 1125 + self.state = 1149 self.match(ASLParser.INT) except RecognitionException as re: localctx.exception = re @@ -11278,14 +11574,14 @@ def accept(self, visitor:ParseTreeVisitor): def max_attempts_decl(self): localctx = ASLParser.Max_attempts_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 204, self.RULE_max_attempts_decl) + self.enterRule(localctx, 206, self.RULE_max_attempts_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 1127 + self.state = 1151 self.match(ASLParser.MAXATTEMPTS) - self.state = 1128 + self.state = 1152 self.match(ASLParser.COLON) - self.state = 1129 + self.state = 1153 self.match(ASLParser.INT) except RecognitionException as re: localctx.exception = re @@ -11338,17 +11634,17 @@ def accept(self, visitor:ParseTreeVisitor): def backoff_rate_decl(self): localctx = ASLParser.Backoff_rate_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 206, self.RULE_backoff_rate_decl) + self.enterRule(localctx, 208, self.RULE_backoff_rate_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1131 + self.state = 1155 self.match(ASLParser.BACKOFFRATE) - self.state = 1132 + self.state = 1156 self.match(ASLParser.COLON) - self.state = 1133 + self.state = 1157 _la = self._input.LA(1) - if not(_la==158 or _la==159): + if not(_la==160 or _la==161): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -11401,14 +11697,14 @@ def accept(self, visitor:ParseTreeVisitor): def max_delay_seconds_decl(self): localctx = ASLParser.Max_delay_seconds_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 208, self.RULE_max_delay_seconds_decl) + self.enterRule(localctx, 210, self.RULE_max_delay_seconds_decl) try: self.enterOuterAlt(localctx, 1) - self.state = 1135 + self.state = 1159 self.match(ASLParser.MAXDELAYSECONDS) - self.state = 1136 + self.state = 1160 self.match(ASLParser.COLON) - self.state = 1137 + self.state = 1161 self.match(ASLParser.INT) except RecognitionException as re: localctx.exception = re @@ -11461,17 +11757,17 @@ def accept(self, visitor:ParseTreeVisitor): def jitter_strategy_decl(self): localctx = ASLParser.Jitter_strategy_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 210, self.RULE_jitter_strategy_decl) + self.enterRule(localctx, 212, self.RULE_jitter_strategy_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1139 + self.state = 1163 self.match(ASLParser.JITTERSTRATEGY) - self.state = 1140 + self.state = 1164 self.match(ASLParser.COLON) - self.state = 1141 + self.state = 1165 _la = self._input.LA(1) - if not(_la==126 or _la==127): + if not(_la==128 or _la==129): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -11540,37 +11836,37 @@ def accept(self, visitor:ParseTreeVisitor): def catch_decl(self): localctx = ASLParser.Catch_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 212, self.RULE_catch_decl) + self.enterRule(localctx, 214, self.RULE_catch_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1143 + self.state = 1167 self.match(ASLParser.CATCH) - self.state = 1144 + self.state = 1168 self.match(ASLParser.COLON) - self.state = 1145 + self.state = 1169 self.match(ASLParser.LBRACK) - self.state = 1154 + self.state = 1178 self._errHandler.sync(self) _la = self._input.LA(1) if _la==5: - self.state = 1146 + self.state = 1170 self.catcher_decl() - self.state = 1151 + self.state = 1175 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1147 + self.state = 1171 self.match(ASLParser.COMMA) - self.state = 1148 + self.state = 1172 self.catcher_decl() - self.state = 1153 + self.state = 1177 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1156 + self.state = 1180 self.match(ASLParser.RBRACK) except RecognitionException as re: localctx.exception = re @@ -11630,27 +11926,27 @@ def accept(self, visitor:ParseTreeVisitor): def catcher_decl(self): localctx = ASLParser.Catcher_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 214, self.RULE_catcher_decl) + self.enterRule(localctx, 216, self.RULE_catcher_decl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1158 + self.state = 1182 self.match(ASLParser.LBRACE) - self.state = 1159 + self.state = 1183 self.catcher_stmt() - self.state = 1164 + self.state = 1188 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1160 + self.state = 1184 self.match(ASLParser.COMMA) - self.state = 1161 + self.state = 1185 self.catcher_stmt() - self.state = 1166 + self.state = 1190 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1167 + self.state = 1191 self.match(ASLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -11715,39 +12011,39 @@ def accept(self, visitor:ParseTreeVisitor): def catcher_stmt(self): localctx = ASLParser.Catcher_stmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 216, self.RULE_catcher_stmt) + self.enterRule(localctx, 218, self.RULE_catcher_stmt) try: - self.state = 1175 + self.state = 1199 self._errHandler.sync(self) token = self._input.LA(1) - if token in [120]: + if token in [122]: self.enterOuterAlt(localctx, 1) - self.state = 1169 + self.state = 1193 self.error_equals_decl() pass elif token in [95]: self.enterOuterAlt(localctx, 2) - self.state = 1170 + self.state = 1194 self.result_path_decl() pass - elif token in [113]: + elif token in [115]: self.enterOuterAlt(localctx, 3) - self.state = 1171 + self.state = 1195 self.next_decl() pass - elif token in [132]: + elif token in [134]: self.enterOuterAlt(localctx, 4) - self.state = 1172 + self.state = 1196 self.assign_decl() pass - elif token in [133]: + elif token in [135]: self.enterOuterAlt(localctx, 5) - self.state = 1173 + self.state = 1197 self.output_decl() pass elif token in [10]: self.enterOuterAlt(localctx, 6) - self.state = 1174 + self.state = 1198 self.comment_decl() pass else: @@ -11909,11 +12205,11 @@ def accept(self, visitor:ParseTreeVisitor): def comparison_op(self): localctx = ASLParser.Comparison_opContext(self, self._ctx, self.state) - self.enterRule(localctx, 218, self.RULE_comparison_op) + self.enterRule(localctx, 220, self.RULE_comparison_op) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1177 + self.state = 1201 _la = self._input.LA(1) if not(((((_la - 30)) & ~0x3f) == 0 and ((1 << (_la - 30)) & 2199022731007) != 0)): self._errHandler.recoverInline(self) @@ -11968,11 +12264,11 @@ def accept(self, visitor:ParseTreeVisitor): def choice_operator(self): localctx = ASLParser.Choice_operatorContext(self, self._ctx, self.state) - self.enterRule(localctx, 220, self.RULE_choice_operator) + self.enterRule(localctx, 222, self.RULE_choice_operator) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1179 + self.state = 1203 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 563225368199168) != 0)): self._errHandler.recoverInline(self) @@ -12066,13 +12362,13 @@ def accept(self, visitor:ParseTreeVisitor): def states_error_name(self): localctx = ASLParser.States_error_nameContext(self, self._ctx, self.state) - self.enterRule(localctx, 222, self.RULE_states_error_name) + self.enterRule(localctx, 224, self.RULE_states_error_name) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1181 + self.state = 1205 _la = self._input.LA(1) - if not(((((_la - 135)) & ~0x3f) == 0 and ((1 << (_la - 135)) & 65535) != 0)): + if not(((((_la - 137)) & ~0x3f) == 0 and ((1 << (_la - 137)) & 65535) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -12124,20 +12420,20 @@ def accept(self, visitor:ParseTreeVisitor): def error_name(self): localctx = ASLParser.Error_nameContext(self, self._ctx, self.state) - self.enterRule(localctx, 224, self.RULE_error_name) + self.enterRule(localctx, 226, self.RULE_error_name) try: - self.state = 1185 + self.state = 1209 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,88,self._ctx) + la_ = self._interp.adaptivePredict(self._input,89,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 1183 + self.state = 1207 self.states_error_name() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 1184 + self.state = 1208 self.keyword_or_string() pass @@ -12200,39 +12496,39 @@ def accept(self, visitor:ParseTreeVisitor): def json_obj_decl(self): localctx = ASLParser.Json_obj_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 226, self.RULE_json_obj_decl) + self.enterRule(localctx, 228, self.RULE_json_obj_decl) self._la = 0 # Token type try: - self.state = 1200 + self.state = 1224 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,90,self._ctx) + la_ = self._interp.adaptivePredict(self._input,91,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 1187 + self.state = 1211 self.match(ASLParser.LBRACE) - self.state = 1188 + self.state = 1212 self.json_binding() - self.state = 1193 + self.state = 1217 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1189 + self.state = 1213 self.match(ASLParser.COMMA) - self.state = 1190 + self.state = 1214 self.json_binding() - self.state = 1195 + self.state = 1219 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1196 + self.state = 1220 self.match(ASLParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 1198 + self.state = 1222 self.match(ASLParser.LBRACE) - self.state = 1199 + self.state = 1223 self.match(ASLParser.RBRACE) pass @@ -12287,14 +12583,14 @@ def accept(self, visitor:ParseTreeVisitor): def json_binding(self): localctx = ASLParser.Json_bindingContext(self, self._ctx, self.state) - self.enterRule(localctx, 228, self.RULE_json_binding) + self.enterRule(localctx, 230, self.RULE_json_binding) try: self.enterOuterAlt(localctx, 1) - self.state = 1202 + self.state = 1226 self.keyword_or_string() - self.state = 1203 + self.state = 1227 self.match(ASLParser.COLON) - self.state = 1204 + self.state = 1228 self.json_value_decl() except RecognitionException as re: localctx.exception = re @@ -12354,39 +12650,39 @@ def accept(self, visitor:ParseTreeVisitor): def json_arr_decl(self): localctx = ASLParser.Json_arr_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 230, self.RULE_json_arr_decl) + self.enterRule(localctx, 232, self.RULE_json_arr_decl) self._la = 0 # Token type try: - self.state = 1219 + self.state = 1243 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,92,self._ctx) + la_ = self._interp.adaptivePredict(self._input,93,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 1206 + self.state = 1230 self.match(ASLParser.LBRACK) - self.state = 1207 + self.state = 1231 self.json_value_decl() - self.state = 1212 + self.state = 1236 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1: - self.state = 1208 + self.state = 1232 self.match(ASLParser.COMMA) - self.state = 1209 + self.state = 1233 self.json_value_decl() - self.state = 1214 + self.state = 1238 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1215 + self.state = 1239 self.match(ASLParser.RBRACK) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 1217 + self.state = 1241 self.match(ASLParser.LBRACK) - self.state = 1218 + self.state = 1242 self.match(ASLParser.RBRACK) pass @@ -12461,62 +12757,62 @@ def accept(self, visitor:ParseTreeVisitor): def json_value_decl(self): localctx = ASLParser.Json_value_declContext(self, self._ctx, self.state) - self.enterRule(localctx, 232, self.RULE_json_value_decl) + self.enterRule(localctx, 234, self.RULE_json_value_decl) try: - self.state = 1230 + self.state = 1254 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,93,self._ctx) + la_ = self._interp.adaptivePredict(self._input,94,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 1221 + self.state = 1245 self.match(ASLParser.NUMBER) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 1222 + self.state = 1246 self.match(ASLParser.INT) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 1223 + self.state = 1247 self.match(ASLParser.TRUE) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 1224 + self.state = 1248 self.match(ASLParser.FALSE) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 1225 + self.state = 1249 self.match(ASLParser.NULL) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 1226 + self.state = 1250 self.json_binding() pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 1227 + self.state = 1251 self.json_arr_decl() pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 1228 + self.state = 1252 self.json_obj_decl() pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 1229 + self.state = 1253 self.keyword_or_string() pass @@ -12834,6 +13130,12 @@ def PARAMETERS(self): def CREDENTIALS(self): return self.getToken(ASLParser.CREDENTIALS, 0) + def ROLEARN(self): + return self.getToken(ASLParser.ROLEARN, 0) + + def ROLEARNPATH(self): + return self.getToken(ASLParser.ROLEARNPATH, 0) + def RESULTSELECTOR(self): return self.getToken(ASLParser.RESULTSELECTOR, 0) @@ -12986,13 +13288,13 @@ def accept(self, visitor:ParseTreeVisitor): def keyword_or_string(self): localctx = ASLParser.Keyword_or_stringContext(self, self._ctx, self.state) - self.enterRule(localctx, 234, self.RULE_keyword_or_string) + self.enterRule(localctx, 236, self.RULE_keyword_or_string) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1232 + self.state = 1256 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -17408) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & -22517998136852481) != 0) or ((((_la - 128)) & ~0x3f) == 0 and ((1 << (_la - 128)) & 1073741555) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -17408) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & -90071992547409921) != 0) or ((((_la - 128)) & ~0x3f) == 0 and ((1 << (_la - 128)) & 4294966223) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) diff --git a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserListener.py b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserListener.py index 75043f5729912..14733b9f265dc 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserListener.py +++ b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserListener.py @@ -512,6 +512,60 @@ def exitCredentials_decl(self, ctx:ASLParser.Credentials_declContext): pass + # Enter a parse tree produced by ASLParser#role_arn_jsonata. + def enterRole_arn_jsonata(self, ctx:ASLParser.Role_arn_jsonataContext): + pass + + # Exit a parse tree produced by ASLParser#role_arn_jsonata. + def exitRole_arn_jsonata(self, ctx:ASLParser.Role_arn_jsonataContext): + pass + + + # Enter a parse tree produced by ASLParser#role_arn_path. + def enterRole_arn_path(self, ctx:ASLParser.Role_arn_pathContext): + pass + + # Exit a parse tree produced by ASLParser#role_arn_path. + def exitRole_arn_path(self, ctx:ASLParser.Role_arn_pathContext): + pass + + + # Enter a parse tree produced by ASLParser#role_arn_path_context_obj. + def enterRole_arn_path_context_obj(self, ctx:ASLParser.Role_arn_path_context_objContext): + pass + + # Exit a parse tree produced by ASLParser#role_arn_path_context_obj. + def exitRole_arn_path_context_obj(self, ctx:ASLParser.Role_arn_path_context_objContext): + pass + + + # Enter a parse tree produced by ASLParser#role_arn_intrinsic_func. + def enterRole_arn_intrinsic_func(self, ctx:ASLParser.Role_arn_intrinsic_funcContext): + pass + + # Exit a parse tree produced by ASLParser#role_arn_intrinsic_func. + def exitRole_arn_intrinsic_func(self, ctx:ASLParser.Role_arn_intrinsic_funcContext): + pass + + + # Enter a parse tree produced by ASLParser#role_arn_var. + def enterRole_arn_var(self, ctx:ASLParser.Role_arn_varContext): + pass + + # Exit a parse tree produced by ASLParser#role_arn_var. + def exitRole_arn_var(self, ctx:ASLParser.Role_arn_varContext): + pass + + + # Enter a parse tree produced by ASLParser#role_arn_str. + def enterRole_arn_str(self, ctx:ASLParser.Role_arn_strContext): + pass + + # Exit a parse tree produced by ASLParser#role_arn_str. + def exitRole_arn_str(self, ctx:ASLParser.Role_arn_strContext): + pass + + # Enter a parse tree produced by ASLParser#timeout_seconds_jsonata. def enterTimeout_seconds_jsonata(self, ctx:ASLParser.Timeout_seconds_jsonataContext): pass diff --git a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserVisitor.py b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserVisitor.py index a776510996f69..9ec17c746a3d4 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserVisitor.py +++ b/localstack-core/localstack/services/stepfunctions/asl/antlr/runtime/ASLParserVisitor.py @@ -289,6 +289,36 @@ def visitCredentials_decl(self, ctx:ASLParser.Credentials_declContext): return self.visitChildren(ctx) + # Visit a parse tree produced by ASLParser#role_arn_jsonata. + def visitRole_arn_jsonata(self, ctx:ASLParser.Role_arn_jsonataContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by ASLParser#role_arn_path. + def visitRole_arn_path(self, ctx:ASLParser.Role_arn_pathContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by ASLParser#role_arn_path_context_obj. + def visitRole_arn_path_context_obj(self, ctx:ASLParser.Role_arn_path_context_objContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by ASLParser#role_arn_intrinsic_func. + def visitRole_arn_intrinsic_func(self, ctx:ASLParser.Role_arn_intrinsic_funcContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by ASLParser#role_arn_var. + def visitRole_arn_var(self, ctx:ASLParser.Role_arn_varContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by ASLParser#role_arn_str. + def visitRole_arn_str(self, ctx:ASLParser.Role_arn_strContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ASLParser#timeout_seconds_jsonata. def visitTimeout_seconds_jsonata(self, ctx:ASLParser.Timeout_seconds_jsonataContext): return self.visitChildren(ctx) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/credentials.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/credentials.py index 3528f5d423a1e..076811b9559ad 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/credentials.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/credentials.py @@ -1,17 +1,93 @@ -from typing import Final +import abc +import copy +from typing import Final, Optional -from localstack.services.stepfunctions.asl.component.common.payload.payloadvalue.payloadtmpl.payload_tmpl import ( - PayloadTmpl, +from localstack.services.stepfunctions.asl.component.common.jsonata.jsonata_template_value_terminal import ( + JSONataTemplateValueTerminalExpression, ) +from localstack.services.stepfunctions.asl.component.common.variable_sample import VariableSample from localstack.services.stepfunctions.asl.component.eval_component import EvalComponent +from localstack.services.stepfunctions.asl.component.intrinsic.function.function import Function from localstack.services.stepfunctions.asl.eval.environment import Environment +from localstack.services.stepfunctions.asl.parse.intrinsic.intrinsic_parser import IntrinsicParser +from localstack.services.stepfunctions.asl.utils.json_path import extract_json + +_CREDENTIALS_ROLE_ARN_KEY: Final[str] = "RoleArn" +ComputedCredentials = dict + + +class RoleArn(EvalComponent, abc.ABC): ... + + +class RoleArnConst(RoleArn): + value: Final[str] + + def __init__(self, value: str): + self.value = value + + def _eval_body(self, env: Environment) -> None: + env.stack.append(self.value) + + +class RoleArnJSONata(RoleArn): + jsonata_template_value_terminal_expression: Final[JSONataTemplateValueTerminalExpression] + + def __init__( + self, jsonata_template_value_terminal_expression: JSONataTemplateValueTerminalExpression + ): + super().__init__() + self.jsonata_template_value_terminal_expression = jsonata_template_value_terminal_expression + + def _eval_body(self, env: Environment) -> None: + self.jsonata_template_value_terminal_expression.eval(env=env) + + +class RoleArnVar(RoleArn): + variable_sample: Final[VariableSample] + + def __init__(self, variable_sample: VariableSample): + self.variable_sample = variable_sample + + def _eval_body(self, env: Environment) -> None: + self.variable_sample.eval(env=env) + + +class RoleArnPath(RoleArnConst): + def _eval_body(self, env: Environment) -> None: + current_output = env.stack[-1] + arn = extract_json(self.value, current_output) + env.stack.append(arn) + + +class RoleArnContextObject(RoleArnConst): + def _eval_body(self, env: Environment) -> None: + value = extract_json(self.value, env.states.context_object.context_object_data) + env.stack.append(copy.deepcopy(value)) + + +class RoleArnIntrinsicFunction(RoleArnConst): + function: Final[Function] + + def __init__(self, value: str) -> None: + super().__init__(value=value) + self.function, _ = IntrinsicParser.parse(value) + + def _eval_body(self, env: Environment) -> None: + self.function.eval(env=env) class Credentials(EvalComponent): - payload_template: Final[PayloadTmpl] + role_arn: Final[RoleArn] + + def __init__(self, role_arn: RoleArn): + self.role_arn = role_arn - def __init__(self, payload_template: PayloadTmpl): - self.payload_template = payload_template + @staticmethod + def get_role_arn_from(computed_credentials: ComputedCredentials) -> Optional[str]: + return computed_credentials.get(_CREDENTIALS_ROLE_ARN_KEY) def _eval_body(self, env: Environment) -> None: - self.payload_template.eval(env=env) + self.role_arn.eval(env=env) + role_arn = env.stack.pop() + computes_credentials: ComputedCredentials = {_CREDENTIALS_ROLE_ARN_KEY: role_arn} + env.stack.append(computes_credentials) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py index 265e97eeb77ed..cd09c8a841c95 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py @@ -3,6 +3,9 @@ from typing import IO, Any, Final, Optional, Union from localstack.aws.api.lambda_ import InvocationResponse +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.eval.environment import Environment from localstack.services.stepfunctions.asl.utils.boto_client import boto_client_for from localstack.services.stepfunctions.asl.utils.encoding import to_json_str @@ -35,8 +38,12 @@ def _from_payload(payload_streaming_body: IO[bytes]) -> Union[json, str]: return decoded_data -def exec_lambda_function(env: Environment, parameters: dict, region: str, account: str) -> None: - lambda_client = boto_client_for(region=region, account=account, service="lambda") +def exec_lambda_function( + env: Environment, parameters: dict, region: str, account: str, credentials: ComputedCredentials +) -> None: + lambda_client = boto_client_for( + region=region, account=account, service="lambda", credentials=credentials + ) invocation_resp: InvocationResponse = lambda_client.invoke(**parameters) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py index d2c8f364acb0b..da96e0d6a18a1 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py @@ -11,6 +11,7 @@ from localstack.aws.api.stepfunctions import ( HistoryEventExecutionDataDetails, HistoryEventType, + TaskCredentials, TaskFailedEventDetails, TaskScheduledEventDetails, TaskStartedEventDetails, @@ -28,6 +29,10 @@ from localstack.services.stepfunctions.asl.component.common.error_name.states_error_name_type import ( StatesErrorNameType, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, + Credentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceRuntimePart, ServiceResource, @@ -231,11 +236,15 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): ... def _before_eval_execution( - self, env: Environment, resource_runtime_part: ResourceRuntimePart, raw_parameters: dict + self, + env: Environment, + resource_runtime_part: ResourceRuntimePart, + raw_parameters: dict, + task_credentials: TaskCredentials, ) -> None: parameters_str = to_json_str(raw_parameters) @@ -253,6 +262,10 @@ def _before_eval_execution( self.heartbeat.eval(env=env) heartbeat_seconds = env.stack.pop() scheduled_event_details["heartbeatInSeconds"] = heartbeat_seconds + if self.credentials: + scheduled_event_details["taskCredentials"] = TaskCredentials( + roleArn=Credentials.get_role_arn_from(computed_credentials=task_credentials) + ) env.event_manager.add_event( context=env.event_history_context, event_type=HistoryEventType.TaskScheduled, @@ -274,6 +287,7 @@ def _after_eval_execution( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> None: output = env.stack[-1] self._verify_size_quota(env=env, value=output) @@ -295,16 +309,18 @@ def _eval_execution(self, env: Environment) -> None: resource_runtime_part: ResourceRuntimePart = env.stack.pop() raw_parameters = self._eval_parameters(env=env) + task_credentials = self._eval_credentials(env=env) self._before_eval_execution( - env=env, resource_runtime_part=resource_runtime_part, raw_parameters=raw_parameters + env=env, + resource_runtime_part=resource_runtime_part, + raw_parameters=raw_parameters, + task_credentials=task_credentials, ) normalised_parameters = copy.deepcopy(raw_parameters) self._normalise_parameters(normalised_parameters) - task_credentials = self._eval_credentials(env=env) - self._eval_service_task( env=env, resource_runtime_part=resource_runtime_part, @@ -319,4 +335,5 @@ def _eval_execution(self, env: Environment) -> None: env=env, resource_runtime_part=resource_runtime_part, normalised_parameters=normalised_parameters, + task_credentials=task_credentials, ) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py index 7e0e3a5c23200..7140cca4c6d23 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py @@ -23,6 +23,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.failure_event import ( FailureEvent, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -291,8 +294,10 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): + # TODO: add support for task credentials + task_parameters: TaskParameters = select_from_typed_dict( typed_dict=TaskParameters, obj=normalised_parameters ) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py index 578e51482ff3f..984a9ecc4d7e9 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py @@ -14,6 +14,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.states_error_name_type import ( StatesErrorNameType, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -125,7 +128,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): service_name = self._get_boto_service_name() api_action = self._get_boto_service_action() @@ -133,6 +136,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(api_client, api_action)(**normalised_parameters) or dict() if response: diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py index 72501ef8023ac..1b6edcb03621e 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py @@ -17,6 +17,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.states_error_name_type import ( StatesErrorNameType, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -83,12 +86,19 @@ def _attach_aws_environment_variables(parameters: dict) -> None: ) def _before_eval_execution( - self, env: Environment, resource_runtime_part: ResourceRuntimePart, raw_parameters: dict + self, + env: Environment, + resource_runtime_part: ResourceRuntimePart, + raw_parameters: dict, + task_credentials: ComputedCredentials, ) -> None: if self.resource.condition == ResourceCondition.Sync: self._attach_aws_environment_variables(parameters=raw_parameters) super()._before_eval_execution( - env=env, resource_runtime_part=resource_runtime_part, raw_parameters=raw_parameters + env=env, + resource_runtime_part=resource_runtime_part, + raw_parameters=raw_parameters, + task_credentials=task_credentials, ) def _from_error(self, env: Environment, ex: Exception) -> FailureEvent: @@ -128,6 +138,7 @@ def _build_sync_resolver( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: batch_client = boto_client_for( region=resource_runtime_part.region, @@ -175,7 +186,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): service_name = self._get_boto_service_name() api_action = self._get_boto_service_action() @@ -183,6 +194,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(batch_client, api_action)(**normalised_parameters) response.pop("ResponseMetadata", None) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py index d678b8a6e24dc..16db8a97f21e8 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py @@ -16,6 +16,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.failure_event import ( FailureEvent, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -63,6 +66,7 @@ def _build_sync_resolver( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: raise RuntimeError( f"Unsupported .sync callback procedure in resource {self.resource.resource_arn}" @@ -73,6 +77,7 @@ def _build_sync2_resolver( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: raise RuntimeError( f"Unsupported .sync2 callback procedure in resource {self.resource.resource_arn}" @@ -99,14 +104,15 @@ def _eval_wait_for_task_token( def _eval_sync( self, env: Environment, - timeout_seconds: int, - callback_endpoint: CallbackEndpoint, - heartbeat_endpoint: Optional[HeartbeatEndpoint], sync_resolver: Callable[[], Optional[Any]], + timeout_seconds: Optional[int], + callback_endpoint: Optional[CallbackEndpoint], + heartbeat_endpoint: Optional[HeartbeatEndpoint], ) -> CallbackOutcome | Any: callback_output: Optional[CallbackOutcome] = None - if ResourceCondition.WaitForTaskToken in self._supported_integration_patterns: + # Listen for WaitForTaskToken signals if an endpoint is provided. + if callback_endpoint is not None: def _local_update_wait_for_task_token(): nonlocal callback_output @@ -128,27 +134,30 @@ def _local_update_wait_for_task_token(): # an exception in this thread will invalidate env, and therefore the worker thread. # hence why here there are no explicit stopping logic for thread_wait_for_task_token. - sync_result: Optional[Any] = None - while env.is_running(): - sync_result = sync_resolver() - if callback_output or sync_result: - break - else: - time.sleep(_DELAY_SECONDS_SYNC_CONDITION_CHECK) + sync_result: Optional[Any] = None + while env.is_running(): + sync_result = sync_resolver() + if callback_output or sync_result: + break + else: + time.sleep(_DELAY_SECONDS_SYNC_CONDITION_CHECK) - return callback_output or sync_result + return callback_output or sync_result def _eval_integration_pattern( self, env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> None: task_output = env.stack.pop() - # Initialise the Callback endpoint for this task. - callback_id = env.states.context_object.context_object_data["Task"]["Token"] - callback_endpoint = env.callback_pool_manager.get(callback_id) + # Initialise the waitForTaskToken Callback endpoint for this task if supported. + callback_endpoint: Optional[CallbackEndpoint] = None + if ResourceCondition.WaitForTaskToken in self._supported_integration_patterns: + callback_id = env.states.context_object.context_object_data["Task"]["Token"] + callback_endpoint = env.callback_pool_manager.get(callback_id) # Setup resources for timeout control. self.timeout.eval(env=env) @@ -181,6 +190,7 @@ def _eval_integration_pattern( env=env, resource_runtime_part=resource_runtime_part, normalised_parameters=normalised_parameters, + task_credentials=task_credentials, ) else: # The condition checks about the resource's condition is exhaustive leaving @@ -189,6 +199,7 @@ def _eval_integration_pattern( env=env, resource_runtime_part=resource_runtime_part, normalised_parameters=normalised_parameters, + task_credentials=task_credentials, ) outcome = self._eval_sync( @@ -315,6 +326,7 @@ def _after_eval_execution( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> None: if self._is_integration_pattern(): output = env.stack[-1] @@ -334,10 +346,12 @@ def _after_eval_execution( env=env, resource_runtime_part=resource_runtime_part, normalised_parameters=normalised_parameters, + task_credentials=task_credentials, ) super()._after_eval_execution( env=env, resource_runtime_part=resource_runtime_part, normalised_parameters=normalised_parameters, + task_credentials=task_credentials, ) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py index 49ae9f66936cd..329d358596796 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py @@ -9,6 +9,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.failure_event import ( FailureEvent, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceRuntimePart, ) @@ -130,7 +133,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): service_name = self._get_boto_service_name() api_action = self._get_boto_service_action() @@ -138,6 +141,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(dynamodb_client, api_action)(**normalised_parameters) response.pop("ResponseMetadata", None) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py index 6af2f11e64d23..64b064350a557 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py @@ -1,5 +1,8 @@ from typing import Any, Callable, Final, Optional +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -43,12 +46,19 @@ def _get_supported_parameters(self) -> Optional[set[str]]: return _SUPPORTED_API_PARAM_BINDINGS.get(self.resource.api_action.lower()) def _before_eval_execution( - self, env: Environment, resource_runtime_part: ResourceRuntimePart, raw_parameters: dict + self, + env: Environment, + resource_runtime_part: ResourceRuntimePart, + raw_parameters: dict, + task_credentials: ComputedCredentials, ) -> None: if self.resource.condition == ResourceCondition.Sync: raw_parameters[_STARTED_BY_PARAMETER_RAW_KEY] = _STARTED_BY_PARAMETER_VALUE super()._before_eval_execution( - env=env, resource_runtime_part=resource_runtime_part, raw_parameters=raw_parameters + env=env, + resource_runtime_part=resource_runtime_part, + raw_parameters=raw_parameters, + task_credentials=task_credentials, ) def _eval_service_task( @@ -56,7 +66,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): service_name = self._get_boto_service_name() api_action = self._get_boto_service_action() @@ -64,6 +74,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(ecs_client, api_action)(**normalised_parameters) response.pop("ResponseMetadata", None) @@ -91,11 +102,13 @@ def _build_sync_resolver( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: ecs_client = boto_client_for( region=resource_runtime_part.region, account=resource_runtime_part.account, service="ecs", + credentials=task_credentials, ) submission_output: dict = env.stack.pop() task_arn: str = submission_output["Tasks"][0]["TaskArn"] diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py index 0b8c12bbd6b36..d086ac1c98f5f 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py @@ -9,6 +9,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.failure_event import ( FailureEvent, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -84,7 +87,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): self._normalised_request_parameters(env=env, parameters=normalised_parameters) service_name = self._get_boto_service_name() @@ -93,6 +96,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(events_client, api_action)(**normalised_parameters) response.pop("ResponseMetadata", None) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py index 1a87f29a18383..49c5664c8d484 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py @@ -17,6 +17,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.states_error_name_type import ( StatesErrorNameType, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -48,10 +51,12 @@ # The sync handler function name prefix for StateTaskServiceGlue objects. _SYNC_HANDLER_REFLECTION_PREFIX: Final[str] = "_sync_to_" # The type of (sync)handler function for StateTaskServiceGlue objects. -_API_ACTION_HANDLER_TYPE = Callable[[Environment, ResourceRuntimePart, dict], None] +_API_ACTION_HANDLER_TYPE = Callable[ + [Environment, ResourceRuntimePart, dict, ComputedCredentials], None +] # The type of (sync)handler builder function for StateTaskServiceGlue objects. _API_ACTION_HANDLER_BUILDER_TYPE = Callable[ - [Environment, ResourceRuntimePart, dict], Callable[[], Optional[Any]] + [Environment, ResourceRuntimePart, dict, ComputedCredentials], Callable[[], Optional[Any]] ] @@ -76,11 +81,14 @@ def _get_api_action_sync_builder_handler(self) -> _API_ACTION_HANDLER_BUILDER_TY return resolver_handler @staticmethod - def _get_glue_client(resource_runtime_part: ResourceRuntimePart) -> boto3.client: + def _get_glue_client( + resource_runtime_part: ResourceRuntimePart, task_credentials: ComputedCredentials + ) -> boto3.client: return boto_client_for( region=resource_runtime_part.region, account=resource_runtime_part.account, service="glue", + credentials=task_credentials, ) def _from_error(self, env: Environment, ex: Exception) -> FailureEvent: @@ -117,8 +125,11 @@ def _handle_start_job_run( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + computed_credentials: ComputedCredentials, ): - glue_client = self._get_glue_client(resource_runtime_part=resource_runtime_part) + glue_client = self._get_glue_client( + resource_runtime_part=resource_runtime_part, task_credentials=computed_credentials + ) response = glue_client.start_job_run(**normalised_parameters) response.pop("ResponseMetadata", None) # AWS StepFunctions extracts the JobName from the request and inserts it into the response, which @@ -132,17 +143,18 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): # Source the action handler and delegate the evaluation. api_action_handler = self._get_api_action_handler() - api_action_handler(env, resource_runtime_part, normalised_parameters) + api_action_handler(env, resource_runtime_part, normalised_parameters, task_credentials) def _sync_to_start_job_run( self, env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: # Poll the job run state from glue, using GetJobRun until the job has terminated. Hence, append the output # of GetJobRun to the state. @@ -153,7 +165,9 @@ def _sync_to_start_job_run( job_name: str = start_job_run_output["JobName"] job_run_id: str = start_job_run_output["JobRunId"] - glue_client = self._get_glue_client(resource_runtime_part=resource_runtime_part) + glue_client = self._get_glue_client( + resource_runtime_part=resource_runtime_part, task_credentials=task_credentials + ) def _sync_resolver() -> Optional[Any]: # Sample GetJobRun until completion. @@ -198,7 +212,10 @@ def _build_sync_resolver( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: sync_resolver_builder = self._get_api_action_sync_builder_handler() - sync_resolver = sync_resolver_builder(env, resource_runtime_part, normalised_parameters) + sync_resolver = sync_resolver_builder( + env, resource_runtime_part, normalised_parameters, task_credentials + ) return sync_resolver diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py index 88e7b6b5e20b3..3bce9a43c828e 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py @@ -14,6 +14,9 @@ from localstack.services.stepfunctions.asl.component.state.state_execution.state_task import ( lambda_eval_utils, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -119,11 +122,12 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): lambda_eval_utils.exec_lambda_function( env=env, parameters=normalised_parameters, region=resource_runtime_part.region, account=resource_runtime_part.account, + credentials=task_credentials, ) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py index 50564c136ee19..a3a3326c23212 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py @@ -22,6 +22,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.states_error_name_type import ( StatesErrorNameType, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -111,11 +114,13 @@ def _build_sync_resolver( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: sfn_client = boto_client_for( region=resource_runtime_part.region, account=resource_runtime_part.account, service="stepfunctions", + credentials=task_credentials, ) submission_output: dict = env.stack.pop() execution_arn: str = submission_output["ExecutionArn"] @@ -171,11 +176,13 @@ def _build_sync2_resolver( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, + task_credentials: ComputedCredentials, ) -> Callable[[], Optional[Any]]: sfn_client = boto_client_for( region=resource_runtime_part.region, account=resource_runtime_part.account, service="stepfunctions", + credentials=task_credentials, ) submission_output: dict = env.stack.pop() execution_arn: str = submission_output["ExecutionArn"] @@ -220,7 +227,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): service_name = self._get_boto_service_name() api_action = self._get_boto_service_action() @@ -228,6 +235,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(sfn_client, api_action)(**normalised_parameters) response.pop("ResponseMetadata", None) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py index ccdca0f019bcd..7c19e01c13ddc 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py @@ -9,6 +9,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.failure_event import ( FailureEvent, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -87,7 +90,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): service_name = self._get_boto_service_name() api_action = self._get_boto_service_action() @@ -95,6 +98,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) # Optimised integration automatically stringifies diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py index 48884ac32ba6f..c2a2c281907ed 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py @@ -9,6 +9,9 @@ from localstack.services.stepfunctions.asl.component.common.error_name.failure_event import ( FailureEvent, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -89,7 +92,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): # TODO: Stepfunctions automatically dumps to json MessageBody's definitions. # Are these other similar scenarios? @@ -104,6 +107,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(sqs_client, api_action)(**normalised_parameters) response.pop("ResponseMetadata", None) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_unsupported.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_unsupported.py index 7027bba17d355..6b972c2af374b 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_unsupported.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_unsupported.py @@ -1,6 +1,9 @@ import logging from typing import Final +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( ResourceCondition, ResourceRuntimePart, @@ -39,7 +42,7 @@ def _eval_service_task( env: Environment, resource_runtime_part: ResourceRuntimePart, normalised_parameters: dict, - task_credentials: dict, + task_credentials: ComputedCredentials, ): # Logs that the evaluation of this optimised service integration is not supported # and relays the call to the target service with the computed parameters. @@ -50,6 +53,7 @@ def _eval_service_task( region=resource_runtime_part.region, account=resource_runtime_part.account, service=service_name, + credentials=task_credentials, ) response = getattr(boto_client, boto_action)(**normalised_parameters) response.pop("ResponseMetadata", None) diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py index f9d2784c1309f..1fc2441d8e5b3 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py @@ -18,6 +18,7 @@ ExecutionState, ) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, Credentials, ) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( @@ -68,7 +69,7 @@ def _eval_parameters(self, env: Environment) -> dict: return parameters - def _eval_credentials(self, env: Environment) -> dict: + def _eval_credentials(self, env: Environment) -> ComputedCredentials: if not self.credentials: task_credentials = dict() else: diff --git a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py index fbf02ad80621a..ee584ed39423b 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +++ b/localstack-core/localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py @@ -12,6 +12,7 @@ LambdaFunctionScheduledEventDetails, LambdaFunctionSucceededEventDetails, LambdaFunctionTimedOutEventDetails, + TaskCredentials, ) from localstack.services.stepfunctions.asl.component.common.error_name.custom_error_name import ( CustomErrorName, @@ -29,6 +30,9 @@ from localstack.services.stepfunctions.asl.component.state.state_execution.state_task import ( lambda_eval_utils, ) +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + Credentials, +) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( LambdaResource, ResourceRuntimePart, @@ -130,6 +134,7 @@ def _eval_parameters(self, env: Environment) -> dict: def _eval_execution(self, env: Environment) -> None: parameters = self._eval_parameters(env=env) + task_credentials = self._eval_credentials(env=env) payload = parameters["Payload"] scheduled_event_details = LambdaFunctionScheduledEventDetails( @@ -143,6 +148,10 @@ def _eval_execution(self, env: Environment) -> None: self.timeout.eval(env=env) timeout_seconds = env.stack.pop() scheduled_event_details["timeoutInSeconds"] = timeout_seconds + if self.credentials: + scheduled_event_details["taskCredentials"] = TaskCredentials( + roleArn=Credentials.get_role_arn_from(computed_credentials=task_credentials) + ) env.event_manager.add_event( context=env.event_history_context, event_type=HistoryEventType.LambdaFunctionScheduled, @@ -163,6 +172,7 @@ def _eval_execution(self, env: Environment) -> None: parameters=parameters, region=resource_runtime_part.region, account=resource_runtime_part.account, + credentials=task_credentials, ) # In lambda invocations, only payload is passed on as output. diff --git a/localstack-core/localstack/services/stepfunctions/asl/parse/preprocessor.py b/localstack-core/localstack/services/stepfunctions/asl/parse/preprocessor.py index a92e78ebf9cf9..13bf9a1445cbe 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/parse/preprocessor.py +++ b/localstack-core/localstack/services/stepfunctions/asl/parse/preprocessor.py @@ -298,6 +298,13 @@ ) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( Credentials, + RoleArn, + RoleArnConst, + RoleArnContextObject, + RoleArnIntrinsicFunction, + RoleArnJSONata, + RoleArnPath, + RoleArnVar, ) from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.service.resource import ( Resource, @@ -545,10 +552,6 @@ def visitParameters_decl(self, ctx: ASLParser.Parameters_declContext) -> Paramet payload_tmpl: PayloadTmpl = self.visit(ctx.payload_tmpl_decl()) return Parameters(payload_tmpl=payload_tmpl) - def visitCredentials_decl(self, ctx: ASLParser.Credentials_declContext) -> Credentials: - payload_template: PayloadTmpl = self.visit(ctx.payload_tmpl_decl()) - return Credentials(payload_template=payload_template) - def visitTimeout_seconds_int(self, ctx: ASLParser.Timeout_seconds_intContext) -> TimeoutSeconds: seconds = int(ctx.INT().getText()) return TimeoutSeconds(timeout_seconds=seconds) @@ -937,6 +940,53 @@ def visitCause_path_decl_intrinsic( intrinsic_func: str = self._inner_string_of(parse_tree=ctx.STRINGINTRINSICFUNC()) return CausePathIntrinsicFunction(value=intrinsic_func) + def visitRole_arn_str(self, ctx: ASLParser.Role_arn_strContext) -> RoleArn: + role_arn = self._inner_string_of(parse_tree=ctx.keyword_or_string()) + return RoleArnConst(role_arn) + + def visitRole_arn_path(self, ctx: ASLParser.Role_arn_pathContext) -> RoleArn: + self._raise_if_query_language_is_not( + query_language_mode=QueryLanguageMode.JSONPath, ctx=ctx + ) + ctx.STRINGPATH() + path = self._inner_string_of(parse_tree=ctx.STRINGPATH()) + return RoleArnPath(path) + + def visitRole_arn_path_context_obj( + self, ctx: ASLParser.Role_arn_path_context_objContext + ) -> RoleArn: + self._raise_if_query_language_is_not( + query_language_mode=QueryLanguageMode.JSONPath, ctx=ctx + ) + path = self._inner_string_of(parse_tree=ctx.STRINGPATHCONTEXTOBJ()) + path_tail = path[1:] + return RoleArnContextObject(path_tail) + + def visitRole_arn_intrinsic_func( + self, ctx: ASLParser.Role_arn_intrinsic_funcContext + ) -> RoleArn: + self._raise_if_query_language_is_not( + query_language_mode=QueryLanguageMode.JSONPath, ctx=ctx + ) + intrinsic_func: str = self._inner_string_of(parse_tree=ctx.STRINGINTRINSICFUNC()) + return RoleArnIntrinsicFunction(value=intrinsic_func) + + def visitRole_arn_var(self, ctx: ASLParser.Role_arn_varContext) -> RoleArn: + self._raise_if_query_language_is_not( + query_language_mode=QueryLanguageMode.JSONPath, ctx=ctx + ) + variable_sample: VariableSample = self.visit(ctx.variable_sample()) + return RoleArnVar(variable_sample=variable_sample) + + def visitRole_arn_jsonata(self, ctx: ASLParser.Role_arn_jsonataContext) -> RoleArn: + expression: str = self._inner_jsonata_expr(ctx=ctx.STRINGJSONATA()) + ja_terminal_expr = JSONataTemplateValueTerminalExpression(expression=expression) + return RoleArnJSONata(jsonata_template_value_terminal_expression=ja_terminal_expr) + + def visitCredentials_decl(self, ctx: ASLParser.Credentials_declContext) -> Credentials: + role_arn: RoleArn = self.visit(ctx.role_arn_decl()) + return Credentials(role_arn=role_arn) + def visitSeconds_int(self, ctx: ASLParser.Seconds_intContext) -> Seconds: return Seconds(seconds=int(ctx.INT().getText())) diff --git a/localstack-core/localstack/services/stepfunctions/asl/utils/boto_client.py b/localstack-core/localstack/services/stepfunctions/asl/utils/boto_client.py index f89643ffcf4e2..021ca28425ac8 100644 --- a/localstack-core/localstack/services/stepfunctions/asl/utils/boto_client.py +++ b/localstack-core/localstack/services/stepfunctions/asl/utils/boto_client.py @@ -1,19 +1,43 @@ +from typing import Optional + from botocore.client import BaseClient from botocore.config import Config from localstack.aws.connect import connect_to from localstack.services.stepfunctions.asl.component.common.timeouts.timeout import TimeoutSeconds +from localstack.services.stepfunctions.asl.component.state.state_execution.state_task.credentials import ( + ComputedCredentials, + Credentials, +) +from localstack.utils.aws.client_types import ServicePrincipal + +_BOTO_CLIENT_CONFIG = config = Config( + parameter_validation=False, + retries={"total_max_attempts": 1}, + connect_timeout=TimeoutSeconds.DEFAULT_TIMEOUT_SECONDS, + read_timeout=TimeoutSeconds.DEFAULT_TIMEOUT_SECONDS, + tcp_keepalive=True, +) -def boto_client_for(region: str, account: str, service: str) -> BaseClient: +def boto_client_for( + region: str, account: str, service: str, credentials: Optional[ComputedCredentials] = None +) -> BaseClient: + if credentials: + assume_role_arn: Optional[str] = Credentials.get_role_arn_from( + computed_credentials=credentials + ) + if assume_role_arn is not None: + client_factory = connect_to.with_assumed_role( + role_arn=assume_role_arn, + service_principal=ServicePrincipal.states, + region_name=region, + config=_BOTO_CLIENT_CONFIG, + ) + return client_factory.get_client(service=service) return connect_to.get_client( aws_access_key_id=account, region_name=region, service_name=service, - config=Config( - parameter_validation=False, - retries={"max_attempts": 0, "total_max_attempts": 1}, - connect_timeout=TimeoutSeconds.DEFAULT_TIMEOUT_SECONDS, - read_timeout=TimeoutSeconds.DEFAULT_TIMEOUT_SECONDS, - ), + config=_BOTO_CLIENT_CONFIG, ) diff --git a/localstack-core/localstack/testing/pytest/stepfunctions/fixtures.py b/localstack-core/localstack/testing/pytest/stepfunctions/fixtures.py index e600a5a6d625c..e1152072da49d 100644 --- a/localstack-core/localstack/testing/pytest/stepfunctions/fixtures.py +++ b/localstack-core/localstack/testing/pytest/stepfunctions/fixtures.py @@ -138,26 +138,18 @@ def sfn_ecs_snapshot(sfn_snapshot): @pytest.fixture -def stepfunctions_client_test_state(aws_client_factory): - # For TestState calls, boto will prepend "sync-" to the endpoint string. As we operate on localhost, - # this function creates a new stepfunctions client with that functionality disabled. - # Using this client only for test_state calls forces future occurrences to handle this issue explicitly. - return aws_client_factory(config=Config(inject_host_prefix=is_aws_cloud())).stepfunctions +def aws_client_no_sync_prefix(aws_client_factory): + # For StartSyncExecution and TestState calls, boto will prepend "sync-" to the endpoint string. + # As we operate on localhost, this function creates a new stepfunctions client with that functionality disabled. + return aws_client_factory(config=Config(inject_host_prefix=is_aws_cloud())) @pytest.fixture -def stepfunctions_client_sync_executions(aws_client_factory): - # For StartSyncExecution calls, boto will prepend "sync-" to the endpoint string. As we operate on localhost, - # this function creates a new stepfunctions client with that functionality disabled. - return aws_client_factory(config=Config(inject_host_prefix=is_aws_cloud())).stepfunctions +def create_state_machine_iam_role(cleanups, create_state_machine): + def _create(target_aws_client): + iam_client = target_aws_client.iam + stepfunctions_client = target_aws_client.stepfunctions - -@pytest.fixture -def create_iam_role_for_sfn(aws_client, cleanups, create_state_machine): - iam_client = aws_client.iam - stepfunctions_client = aws_client.stepfunctions - - def _create(): role_name = f"test-sfn-role-{short_uid()}" policy_name = f"test-sfn-policy-{short_uid()}" role = iam_client.create_role( @@ -223,7 +215,7 @@ def _wait_sfn_can_assume_role(): }, } creation_resp = create_state_machine( - name=sm_name, definition=json.dumps(sm_def), roleArn=role_arn + target_aws_client, name=sm_name, definition=json.dumps(sm_def), roleArn=role_arn ) state_machine_arn = creation_resp["stateMachineArn"] @@ -247,36 +239,31 @@ def _wait_sfn_can_assume_role(): @pytest.fixture -def create_state_machine(aws_client): - # The following stores the ARNs of create state machines and whether these are STANDARD or not. - _state_machine_arn_and_standard_flag: Final[list[tuple[str, bool]]] = list() +def create_state_machine(): + created_state_machine_references = list() - def _create_state_machine(**kwargs): - create_output = aws_client.stepfunctions.create_state_machine(**kwargs) + def _create_state_machine(target_aws_client, **kwargs): + sfn_client = target_aws_client.stepfunctions + create_output = sfn_client.create_state_machine(**kwargs) create_output_arn = create_output["stateMachineArn"] - - is_standard_flag = ( - kwargs.get("type", StateMachineType.STANDARD) == StateMachineType.STANDARD + created_state_machine_references.append( + (create_output_arn, kwargs.get("type", StateMachineType.STANDARD), sfn_client) ) - _state_machine_arn_and_standard_flag.append((create_output_arn, is_standard_flag)) - return create_output yield _create_state_machine # Delete all state machine, attempting to stop all running executions of STANDARD state machines, # as other types, such as EXPRESS, cannot be manually stopped. - for state_machine_arn, is_standard in _state_machine_arn_and_standard_flag: + for arn, typ, client in created_state_machine_references: try: - if is_standard: - executions = aws_client.stepfunctions.list_executions( - stateMachineArn=state_machine_arn - ) + if typ == StateMachineType.STANDARD: + executions = client.list_executions(stateMachineArn=arn) for execution in executions["executions"]: - aws_client.stepfunctions.stop_execution(executionArn=execution["executionArn"]) - aws_client.stepfunctions.delete_state_machine(stateMachineArn=state_machine_arn) - except Exception: - LOG.debug("Unable to delete state machine '%s' during cleanup.", state_machine_arn) + client.stop_execution(executionArn=execution["executionArn"]) + client.delete_state_machine(stateMachineArn=arn) + except Exception as ex: + LOG.debug("Unable to delete state machine '%s' during cleanup: %s", arn, ex) @pytest.fixture @@ -299,9 +286,11 @@ def _create_activity(**kwargs): @pytest.fixture -def sqs_send_task_success_state_machine(aws_client, create_state_machine, create_iam_role_for_sfn): +def sqs_send_task_success_state_machine( + aws_client, create_state_machine, create_state_machine_iam_role +): def _create_state_machine(sqs_queue_url): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sm_name: str = f"sqs_send_task_success_state_machine_{short_uid()}" template = { @@ -375,7 +364,7 @@ def _create_state_machine(sqs_queue_url): } creation_resp = create_state_machine( - name=sm_name, definition=json.dumps(template), roleArn=snf_role_arn + aws_client, name=sm_name, definition=json.dumps(template), roleArn=snf_role_arn ) state_machine_arn = creation_resp["stateMachineArn"] @@ -388,9 +377,11 @@ def _create_state_machine(sqs_queue_url): @pytest.fixture -def sqs_send_task_failure_state_machine(aws_client, create_state_machine, create_iam_role_for_sfn): +def sqs_send_task_failure_state_machine( + aws_client, create_state_machine, create_state_machine_iam_role +): def _create_state_machine(sqs_queue_url): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sm_name: str = f"sqs_send_task_failure_state_machine_{short_uid()}" template = { @@ -465,7 +456,7 @@ def _create_state_machine(sqs_queue_url): } creation_resp = create_state_machine( - name=sm_name, definition=json.dumps(template), roleArn=snf_role_arn + aws_client, name=sm_name, definition=json.dumps(template), roleArn=snf_role_arn ) state_machine_arn = creation_resp["stateMachineArn"] @@ -479,10 +470,10 @@ def _create_state_machine(sqs_queue_url): @pytest.fixture def sqs_send_heartbeat_and_task_success_state_machine( - aws_client, create_state_machine, create_iam_role_for_sfn + aws_client, create_state_machine, create_state_machine_iam_role ): def _create_state_machine(sqs_queue_url): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sm_name: str = f"sqs_send_heartbeat_and_task_success_state_machine_{short_uid()}" template = { @@ -568,7 +559,7 @@ def _create_state_machine(sqs_queue_url): } creation_resp = create_state_machine( - name=sm_name, definition=json.dumps(template), roleArn=snf_role_arn + aws_client, name=sm_name, definition=json.dumps(template), roleArn=snf_role_arn ) state_machine_arn = creation_resp["stateMachineArn"] @@ -581,14 +572,14 @@ def _create_state_machine(sqs_queue_url): @pytest.fixture -def sfn_activity_consumer(aws_client, create_state_machine, create_iam_role_for_sfn): +def sfn_activity_consumer(aws_client, create_state_machine, create_state_machine_iam_role): def _create_state_machine(template, activity_arn): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sm_name: str = f"activity_send_task_failure_on_task_{short_uid()}" definition = json.dumps(template) creation_resp = create_state_machine( - name=sm_name, definition=definition, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition, roleArn=snf_role_arn ) state_machine_arn = creation_resp["stateMachineArn"] @@ -727,3 +718,96 @@ def _create() -> str: aws_client.logs.delete_log_group(logGroupName=log_group_name) except Exception: LOG.debug("Cannot delete log group %s", log_group_name) + + +@pytest.fixture +def create_cross_account_admin_role_and_policy(create_state_machine, create_state_machine_iam_role): + created = list() + + def _create_role_and_policy(trusting_aws_client, trusted_aws_client, trusted_account_id) -> str: + trusting_iam_client = trusting_aws_client.iam + + role_name = f"admin-test-role-cross-account-{short_uid()}" + policy_name = f"admin-test-policy-cross-account-{short_uid()}" + + trust_policy = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": {"AWS": f"arn:aws:iam::{trusted_account_id}:root"}, + "Action": "sts:AssumeRole", + } + ], + } + + create_role_response = trusting_iam_client.create_role( + RoleName=role_name, + AssumeRolePolicyDocument=json.dumps(trust_policy), + ) + role_arn = create_role_response["Role"]["Arn"] + + policy_document = { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "*", + "Resource": "*", + } + ], + } + + trusting_iam_client.put_role_policy( + RoleName=role_name, PolicyName=policy_name, PolicyDocument=json.dumps(policy_document) + ) + + def _wait_sfn_can_assume_admin_role(): + trusted_stepfunctions_client = trusted_aws_client.stepfunctions + sm_name = f"test-wait-sfn-can-assume-cross-account-admin-role-{short_uid()}" + sm_role = create_state_machine_iam_role(trusted_aws_client) + sm_def = { + "StartAt": "PullAssumeRole", + "States": { + "PullAssumeRole": { + "Type": "Task", + "Parameters": {}, + "Resource": "arn:aws:states:::aws-sdk:s3:listBuckets", + "Credentials": {"RoleArn": role_arn}, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "IntervalSeconds": 2, + "MaxAttempts": 60, + } + ], + "End": True, + } + }, + } + creation_response = create_state_machine( + trusted_aws_client, name=sm_name, definition=json.dumps(sm_def), roleArn=sm_role + ) + state_machine_arn = creation_response["stateMachineArn"] + + exec_resp = trusted_stepfunctions_client.start_execution( + stateMachineArn=state_machine_arn, input="{}" + ) + execution_arn = exec_resp["executionArn"] + + await_execution_success( + stepfunctions_client=trusted_stepfunctions_client, execution_arn=execution_arn + ) + + trusted_stepfunctions_client.delete_state_machine(stateMachineArn=state_machine_arn) + + if is_aws_cloud(): + _wait_sfn_can_assume_admin_role() + + return role_arn + + yield _create_role_and_policy + + for aws_client, role_name, policy_name in created: + aws_client.iam.delete_role_policy(RoleName=role_name, PolicyName=policy_name) + aws_client.iam.delete_role(RoleName=role_name) diff --git a/localstack-core/localstack/testing/pytest/stepfunctions/utils.py b/localstack-core/localstack/testing/pytest/stepfunctions/utils.py index eb7436d1d755d..ed34cbc6ea4e7 100644 --- a/localstack-core/localstack/testing/pytest/stepfunctions/utils.py +++ b/localstack-core/localstack/testing/pytest/stepfunctions/utils.py @@ -274,8 +274,8 @@ def _validation_function(log_events: list) -> bool: return _validation_function -def _await_on_execution_log_stream_created(aws_client, log_group_name: str) -> str: - logs_client = aws_client.logs +def _await_on_execution_log_stream_created(target_aws_client, log_group_name: str) -> str: + logs_client = target_aws_client.logs log_stream_name = str() def _run_check(): @@ -303,13 +303,13 @@ def _run_check(): def await_on_execution_logs( - aws_client, + target_aws_client, log_group_name: str, validation_function: Callable[[HistoryEventList], bool] = None, ) -> HistoryEventList: - log_stream_name = _await_on_execution_log_stream_created(aws_client, log_group_name) + log_stream_name = _await_on_execution_log_stream_created(target_aws_client, log_group_name) - logs_client = aws_client.logs + logs_client = target_aws_client.logs events: HistoryEventList = list() def _run_check(): @@ -330,14 +330,15 @@ def _run_check(): return events -def create( - create_iam_role_for_sfn, +def create_state_machine_with_iam_role( + target_aws_client, + create_state_machine_iam_role, create_state_machine, snapshot, definition: Definition, logging_configuration: Optional[LoggingConfiguration] = None, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(target_aws_client=target_aws_client) snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) snapshot.add_transformer( RegexTransformer( @@ -357,19 +358,20 @@ def create( } if logging_configuration is not None: create_arguments["loggingConfiguration"] = logging_configuration - creation_resp = create_state_machine(**create_arguments) + creation_resp = create_state_machine(target_aws_client, **create_arguments) snapshot.add_transformer(snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] return state_machine_arn def launch_and_record_execution( - stepfunctions_client, + target_aws_client, sfn_snapshot, state_machine_arn, execution_input, verify_execution_description=False, ) -> LongArn: + stepfunctions_client = target_aws_client.stepfunctions exec_resp = stepfunctions_client.start_execution( stateMachineArn=state_machine_arn, input=execution_input ) @@ -403,7 +405,7 @@ def launch_and_record_execution( def launch_and_record_logs( - aws_client, + target_aws_client, state_machine_arn, execution_input, log_level, @@ -411,13 +413,13 @@ def launch_and_record_logs( sfn_snapshot, ): execution_arn = launch_and_record_execution( - aws_client.stepfunctions, + target_aws_client, sfn_snapshot, state_machine_arn, execution_input, ) expected_events = get_expected_execution_logs( - aws_client.stepfunctions, log_level, execution_arn + target_aws_client.stepfunctions, log_level, execution_arn ) if log_level == LogLevel.OFF or not expected_events: @@ -426,7 +428,7 @@ def launch_and_record_logs( logs_validation_function = is_execution_logs_list_complete(expected_events) logged_execution_events = await_on_execution_logs( - aws_client, log_group_name, logs_validation_function + target_aws_client, log_group_name, logs_validation_function ) sfn_snapshot.add_transformer( @@ -441,19 +443,23 @@ def launch_and_record_logs( # TODO: make this return the execution ARN for manual assertions def create_and_record_execution( - stepfunctions_client, - create_iam_role_for_sfn, + target_aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, execution_input, verify_execution_description=False, ): - state_machine_arn = create( - create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition + state_machine_arn = create_state_machine_with_iam_role( + target_aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, ) launch_and_record_execution( - stepfunctions_client, + target_aws_client, sfn_snapshot, state_machine_arn, execution_input, @@ -462,8 +468,8 @@ def create_and_record_execution( def create_and_record_logs( - aws_client, - create_iam_role_for_sfn, + target_aws_client, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -472,12 +478,16 @@ def create_and_record_logs( log_level: LogLevel, include_execution_data: bool, ): - state_machine_arn = create( - create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition + state_machine_arn = create_state_machine_with_iam_role( + target_aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, ) log_group_name = sfn_create_log_group() - log_group_arn = aws_client.logs.describe_log_groups(logGroupNamePrefix=log_group_name)[ + log_group_arn = target_aws_client.logs.describe_log_groups(logGroupNamePrefix=log_group_name)[ "logGroups" ][0]["arn"] logging_configuration = LoggingConfiguration( @@ -489,22 +499,27 @@ def create_and_record_logs( ), ], ) - aws_client.stepfunctions.update_state_machine( + target_aws_client.stepfunctions.update_state_machine( stateMachineArn=state_machine_arn, loggingConfiguration=logging_configuration ) launch_and_record_logs( - aws_client, state_machine_arn, execution_input, log_level, log_group_name, sfn_snapshot + target_aws_client, + state_machine_arn, + execution_input, + log_level, + log_group_name, + sfn_snapshot, ) def launch_and_record_sync_execution( - stepfunctions_client, + target_aws_client, sfn_snapshot, state_machine_arn, execution_input, ): - exec_resp = stepfunctions_client.start_sync_execution( + exec_resp = target_aws_client.stepfunctions.start_sync_execution( stateMachineArn=state_machine_arn, input=execution_input, ) @@ -513,17 +528,18 @@ def launch_and_record_sync_execution( def create_and_record_express_sync_execution( - stepfunctions_client, - create_iam_role_for_sfn, + target_aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, execution_input, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(target_aws_client=target_aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "sfn_role_arn")) creation_response = create_state_machine( + target_aws_client, name=f"express_statemachine_{short_uid()}", definition=definition, roleArn=snf_role_arn, @@ -534,7 +550,7 @@ def create_and_record_express_sync_execution( sfn_snapshot.match("creation_response", creation_response) launch_and_record_sync_execution( - stepfunctions_client, + target_aws_client, sfn_snapshot, state_machine_arn, execution_input, @@ -542,20 +558,20 @@ def create_and_record_express_sync_execution( def launch_and_record_express_async_execution( - aws_client, + target_aws_client, sfn_snapshot, state_machine_arn, log_group_name, execution_input, ): - start_execution = aws_client.stepfunctions.start_execution( + start_execution = target_aws_client.stepfunctions.start_execution( stateMachineArn=state_machine_arn, input=execution_input ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_express_exec_arn(start_execution, 0)) execution_arn = start_execution["executionArn"] event_list = await_on_execution_logs( - aws_client, log_group_name, validation_function=_is_last_history_event_terminal + target_aws_client, log_group_name, validation_function=_is_last_history_event_terminal ) # Snapshot only the end event, as AWS StepFunctions implements a flaky approach to logging previous events. end_event = event_list[-1] @@ -565,8 +581,8 @@ def launch_and_record_express_async_execution( def create_and_record_express_async_execution( - aws_client, - create_iam_role_for_sfn, + target_aws_client, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -574,11 +590,11 @@ def create_and_record_express_async_execution( execution_input, include_execution_data: bool = True, ) -> tuple[LongArn, LongArn]: - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(target_aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "sfn_role_arn")) log_group_name = sfn_create_log_group() - log_group_arn = aws_client.logs.describe_log_groups(logGroupNamePrefix=log_group_name)[ + log_group_arn = target_aws_client.logs.describe_log_groups(logGroupNamePrefix=log_group_name)[ "logGroups" ][0]["arn"] logging_configuration = LoggingConfiguration( @@ -592,6 +608,7 @@ def create_and_record_express_async_execution( ) creation_response = create_state_machine( + target_aws_client, name=f"express_statemachine_{short_uid()}", definition=definition, roleArn=snf_role_arn, @@ -603,7 +620,7 @@ def create_and_record_express_async_execution( sfn_snapshot.match("creation_response", creation_response) execution_arn = launch_and_record_express_async_execution( - aws_client, + target_aws_client, sfn_snapshot, state_machine_arn, log_group_name, @@ -613,10 +630,10 @@ def create_and_record_express_async_execution( def create_and_record_events( - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_events_to_sqs_queue, - aws_client, + target_aws_client, sfn_snapshot, definition, execution_input, @@ -642,8 +659,9 @@ def create_and_record_events( ] ) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(target_aws_client) create_output: CreateStateMachineOutput = create_state_machine( + target_aws_client, name=f"test_event_bridge_events-{short_uid()}", definition=definition, roleArn=snf_role_arn, @@ -652,18 +670,18 @@ def create_and_record_events( queue_url = sfn_events_to_sqs_queue(state_machine_arn=state_machine_arn) - start_execution = aws_client.stepfunctions.start_execution( + start_execution = target_aws_client.stepfunctions.start_execution( stateMachineArn=state_machine_arn, input=execution_input ) execution_arn = start_execution["executionArn"] await_execution_terminated( - stepfunctions_client=aws_client.stepfunctions, execution_arn=execution_arn + stepfunctions_client=target_aws_client.stepfunctions, execution_arn=execution_arn ) stepfunctions_events = list() def _get_events(): - received = aws_client.sqs.receive_message(QueueUrl=queue_url) + received = target_aws_client.sqs.receive_message(QueueUrl=queue_url) for message in received.get("Messages", []): body = json.loads(message["Body"]) stepfunctions_events.append(body) @@ -675,11 +693,11 @@ def _get_events(): sfn_snapshot.match("stepfunctions_events", stepfunctions_events) -def record_sqs_events(aws_client, queue_url, sfn_snapshot, num_events): +def record_sqs_events(target_aws_client, queue_url, sfn_snapshot, num_events): stepfunctions_events = list() def _get_events(): - received = aws_client.sqs.receive_message(QueueUrl=queue_url) + received = target_aws_client.sqs.receive_message(QueueUrl=queue_url) for message in received.get("Messages", []): body = json.loads(message["Body"]) stepfunctions_events.append(body) diff --git a/localstack-core/localstack/utils/aws/client_types.py b/localstack-core/localstack/utils/aws/client_types.py index 3df4095c78ef3..17f0a85d81f33 100644 --- a/localstack-core/localstack/utils/aws/client_types.py +++ b/localstack-core/localstack/utils/aws/client_types.py @@ -274,3 +274,4 @@ class ServicePrincipal(str): s3 = "s3" sns = "sns" sqs = "sqs" + states = "states" diff --git a/tests/aws/services/stepfunctions/templates/credentials/__init__.py b/tests/aws/services/stepfunctions/templates/credentials/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tests/aws/services/stepfunctions/templates/credentials/credentials_templates.py b/tests/aws/services/stepfunctions/templates/credentials/credentials_templates.py new file mode 100644 index 0000000000000..2c02d6c2df823 --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/credentials_templates.py @@ -0,0 +1,37 @@ +import os +from typing import Final + +from tests.aws.services.stepfunctions.templates.template_loader import TemplateLoader + +_THIS_FOLDER: Final[str] = os.path.dirname(os.path.realpath(__file__)) + + +class CredentialsTemplates(TemplateLoader): + EMPTY_CREDENTIALS: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/empty_credentials.json5" + ) + INVALID_CREDENTIALS_FIELD: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/invalid_credentials_field.json5" + ) + LAMBDA_TASK: Final[str] = os.path.join(_THIS_FOLDER, "statemachines/lambda_task.json5") + SERVICE_LAMBDA_INVOKE: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/service_lambda_invoke.json5" + ) + SERVICE_LAMBDA_INVOKE_RETRY: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/service_lambda_invoke_retry.json5" + ) + SFN_START_EXECUTION_SYNC_ROLE_ARN_JSONATA: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/sfn_start_execution_sync_role_arn_jsonata.json5" + ) + SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/sfn_start_execution_sync_role_arn_path.json5" + ) + SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH_CONTEXT: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/sfn_start_execution_sync_role_arn_path_context.json5" + ) + SFN_START_EXECUTION_SYNC_ROLE_ARN_VARIABLE: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/sfn_start_execution_sync_role_arn_variable.json5" + ) + SFN_START_EXECUTION_SYNC_ROLE_ARN_INTRINSIC: Final[str] = os.path.join( + _THIS_FOLDER, "statemachines/sfn_start_execution_sync_role_arn_intrinsic.json5" + ) diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/empty_credentials.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/empty_credentials.json5 new file mode 100644 index 0000000000000..722e807803286 --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/empty_credentials.json5 @@ -0,0 +1,13 @@ +{ + "StartAt": "State0", + "QueryLanguage": "JSONata", + "States": { + "State0": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "Arguments": "{% $state.input %}", + "Credentials": {}, + "End": true + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/invalid_credentials_field.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/invalid_credentials_field.json5 new file mode 100644 index 0000000000000..59ce6fdef611b --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/invalid_credentials_field.json5 @@ -0,0 +1,15 @@ +{ + "StartAt": "State0", + "QueryLanguage": "JSONata", + "States": { + "State0": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "Arguments": "{% $state.input %}", + "Credentials": { + "InvalidField": "invalid" + }, + "End": true + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/lambda_task.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/lambda_task.json5 new file mode 100644 index 0000000000000..c4e14524d7f2d --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/lambda_task.json5 @@ -0,0 +1,14 @@ +{ + "QueryLanguage": "JSONata", + "StartAt": "LambdaTask", + "States": { + "LambdaTask": { + "Type": "Task", + "Resource": "__tbd__", + "Credentials": { + "RoleArn": "{% $states.input.CredentialsRoleArn %}" + }, + "End": true + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/service_lambda_invoke.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/service_lambda_invoke.json5 new file mode 100644 index 0000000000000..6461e4af0c857 --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/service_lambda_invoke.json5 @@ -0,0 +1,18 @@ +{ + "QueryLanguage": "JSONata", + "StartAt": "InvokeLambda", + "States": { + "InvokeLambda": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "Arguments": { + "FunctionName": "{% $states.input.FunctionName %}", + "Payload": "{% $states.input.Payload %}", + }, + "Credentials": { + "RoleArn": "{% $states.input.CredentialsRoleArn %}" + }, + "End": true + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/service_lambda_invoke_retry.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/service_lambda_invoke_retry.json5 new file mode 100644 index 0000000000000..ccf84a6c2e54d --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/service_lambda_invoke_retry.json5 @@ -0,0 +1,24 @@ +{ + "QueryLanguage": "JSONata", + "StartAt": "InvokeLambda", + "States": { + "InvokeLambda": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "Arguments": { + "FunctionName": "{% $states.input.FunctionName %}", + "Payload": "{% $states.input.Payload %}", + }, + "Credentials": { + "RoleArn": "{% $states.input.CredentialsRoleArn %}" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "MaxAttempts": 2, + } + ], + "End": true + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_intrinsic.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_intrinsic.json5 new file mode 100644 index 0000000000000..f8cac57593648 --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_intrinsic.json5 @@ -0,0 +1,18 @@ +{ + "StartAt": "StartExecution", + "States": { + "StartExecution": { + "Type": "Task", + "Resource": "arn:aws:states:::states:startExecution.sync", + "Parameters": { + "StateMachineArn.$": "$.StateMachineArn", + "Input.$": "$.Input", + "Name.$": "$.Name", + }, + "Credentials": { + "RoleArn.$": "States.Format('{}', $.CredentialsRoleArn)" + }, + "End": true, + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_jsonata.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_jsonata.json5 new file mode 100644 index 0000000000000..038054abc4b47 --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_jsonata.json5 @@ -0,0 +1,19 @@ +{ + "QueryLanguage": "JSONata", + "StartAt": "StartExecution", + "States": { + "StartExecution": { + "Type": "Task", + "Resource": "arn:aws:states:::states:startExecution.sync", + "Arguments": { + "StateMachineArn": "{% $states.input.StateMachineArn %}", + "Input": "{% $states.input.Input %}", + "Name": "{% $states.input.Name %}", + }, + "Credentials": { + "RoleArn": "{% $states.input.CredentialsRoleArn %}", + }, + "End": true, + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_path.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_path.json5 new file mode 100644 index 0000000000000..07d30f77b274c --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_path.json5 @@ -0,0 +1,18 @@ +{ + "StartAt": "StartExecution", + "States": { + "StartExecution": { + "Type": "Task", + "Resource": "arn:aws:states:::states:startExecution.sync", + "Parameters": { + "StateMachineArn.$": "$.StateMachineArn", + "Input.$": "$.Input", + "Name.$": "$.Name", + }, + "Credentials": { + "RoleArn.$": "$.CredentialsRoleArn" + }, + "End": true, + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_path_context.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_path_context.json5 new file mode 100644 index 0000000000000..2427a00da1f2d --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_path_context.json5 @@ -0,0 +1,25 @@ +{ + "StartAt": "StartExecution", + "States": { + "StartExecution": { + "Type": "Pass", + "Assign": { + "roleArn.$": "$.CredentialsRoleArn" + }, + "Next": "RunTask" + }, + "RunTask": { + "Type": "Task", + "Resource": "arn:aws:states:::states:startExecution.sync", + "Parameters": { + "StateMachineArn.$": "$.StateMachineArn", + "Input.$": "$.Input", + "Name.$": "$.Name", + }, + "Credentials": { + "RoleArn.$": "$$.Execution.Input.CredentialsRoleArn" + }, + "End": true, + } + } +} diff --git a/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_variable.json5 b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_variable.json5 new file mode 100644 index 0000000000000..982d3807380e5 --- /dev/null +++ b/tests/aws/services/stepfunctions/templates/credentials/statemachines/sfn_start_execution_sync_role_arn_variable.json5 @@ -0,0 +1,25 @@ +{ + "StartAt": "StartExecution", + "States": { + "StartExecution": { + "Type": "Pass", + "Assign": { + "roleArn.$": "$.CredentialsRoleArn" + }, + "Next": "RunTask" + }, + "RunTask": { + "Type": "Task", + "Resource": "arn:aws:states:::states:startExecution.sync", + "Parameters": { + "StateMachineArn.$": "$.StateMachineArn", + "Input.$": "$.Input", + "Name.$": "$.Name", + }, + "Credentials": { + "RoleArn.$": "$roleArn" + }, + "End": true, + } + } +} diff --git a/tests/aws/services/stepfunctions/v2/activities/test_activities.py b/tests/aws/services/stepfunctions/v2/activities/test_activities.py index d2172c767fd24..342a9d2ea8b06 100644 --- a/tests/aws/services/stepfunctions/v2/activities/test_activities.py +++ b/tests/aws/services/stepfunctions/v2/activities/test_activities.py @@ -12,13 +12,12 @@ ) -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestActivities: @markers.aws.validated def test_activity_task( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_activity, sfn_activity_consumer, @@ -42,8 +41,8 @@ def test_activity_task( exec_input = json.dumps({"Value1": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -54,7 +53,7 @@ def test_activity_task( def test_activity_task_no_worker_name( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_activity, sfn_activity_consumer, @@ -79,8 +78,8 @@ def test_activity_task_no_worker_name( exec_input = json.dumps({"Value1": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -91,7 +90,7 @@ def test_activity_task_no_worker_name( def test_activity_task_on_deleted( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_activity, sfn_snapshot, @@ -111,8 +110,8 @@ def test_activity_task_on_deleted( exec_input = json.dumps({"Value1": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -123,7 +122,7 @@ def test_activity_task_on_deleted( def test_activity_task_failure( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_activity, sfn_activity_consumer, @@ -149,8 +148,8 @@ def test_activity_task_failure( exec_input = json.dumps({"Value1": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -161,7 +160,7 @@ def test_activity_task_failure( def test_activity_task_with_heartbeat( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_activity, sfn_activity_consumer, @@ -187,8 +186,8 @@ def test_activity_task_with_heartbeat( exec_input = json.dumps({"Value1": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -199,7 +198,7 @@ def test_activity_task_with_heartbeat( def test_activity_task_start_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_activity, sfn_activity_consumer, @@ -225,8 +224,8 @@ def test_activity_task_start_timeout( exec_input = json.dumps({"Value1": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/arguments/test_arguments.py b/tests/aws/services/stepfunctions/v2/arguments/test_arguments.py index c35b0aee61ac9..167917219bed9 100644 --- a/tests/aws/services/stepfunctions/v2/arguments/test_arguments.py +++ b/tests/aws/services/stepfunctions/v2/arguments/test_arguments.py @@ -19,7 +19,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..redriveCount", "$..redriveStatus", "$..RedriveCount", @@ -46,7 +45,7 @@ def test_base_cases( self, sfn_snapshot, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, template_path, @@ -64,8 +63,8 @@ def test_base_cases( definition = json.dumps(template) exec_input = json.dumps({"input_value": "string literal", "input_values": [1, 2, 3]}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, diff --git a/tests/aws/services/stepfunctions/v2/assign/test_assign_base.py b/tests/aws/services/stepfunctions/v2/assign/test_assign_base.py index 7f40f79238fc9..25c7f12b6afcb 100644 --- a/tests/aws/services/stepfunctions/v2/assign/test_assign_base.py +++ b/tests/aws/services/stepfunctions/v2/assign/test_assign_base.py @@ -12,7 +12,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..redriveCount", "$..redriveStatus", "$..RedriveCount", @@ -38,14 +37,19 @@ class TestAssignBase: ], ) def test_base_cases( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, template_path + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template_path, ): template = AssignTemplate.load_sfn_template(template_path) definition = json.dumps(template) exec_input = json.dumps({"input_value": "input_value_literal"}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -67,15 +71,20 @@ def test_base_cases( ids=["BASE_SCOPE_PARALLEL"], ) def test_base_parallel_cases( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, template_path + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template_path, ): sfn_snapshot.add_transformer(SfnNoneRecursiveParallelTransformer()) template = AssignTemplate.load_sfn_template(template_path) definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, diff --git a/tests/aws/services/stepfunctions/v2/assign/test_assign_reference_variables.py b/tests/aws/services/stepfunctions/v2/assign/test_assign_reference_variables.py index 10dcb76380150..95ba152a1cfb1 100644 --- a/tests/aws/services/stepfunctions/v2/assign/test_assign_reference_variables.py +++ b/tests/aws/services/stepfunctions/v2/assign/test_assign_reference_variables.py @@ -54,7 +54,7 @@ class TestAssignReferenceVariables: def test_reference_assign( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template_path, @@ -63,8 +63,8 @@ def test_reference_assign( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -112,7 +112,7 @@ def test_reference_assign( def test_undefined_reference( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, @@ -120,8 +120,8 @@ def test_undefined_reference( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -145,7 +145,7 @@ def test_undefined_reference( def test_assign_from_value( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template_path, @@ -154,8 +154,8 @@ def test_assign_from_value( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -176,7 +176,7 @@ def test_assign_from_value( def test_state_assign_evaluation_order( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template_path, @@ -185,8 +185,8 @@ def test_state_assign_evaluation_order( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -196,14 +196,19 @@ def test_state_assign_evaluation_order( @pytest.mark.parametrize("input_value", ["42", "0"], ids=["CORRECT", "INCORRECT"]) @markers.aws.validated def test_assign_in_choice_state( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, input_value + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + input_value, ): template = AT.load_sfn_template(AT.BASE_ASSIGN_IN_CHOICE) definition = json.dumps(template) exec_input = json.dumps({"input_value": input_value}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -212,14 +217,14 @@ def test_assign_in_choice_state( @markers.aws.validated def test_assign_in_wait_state( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot ): template = AT.load_sfn_template(AT.BASE_ASSIGN_IN_WAIT) definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -230,7 +235,7 @@ def test_assign_in_wait_state( def test_assign_in_catch_state( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_lambda_function, create_state_machine, sfn_snapshot, @@ -248,8 +253,8 @@ def test_assign_in_catch_state( definition = json.dumps(template) exec_input = json.dumps({"input_value": function_arn}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -271,7 +276,7 @@ def test_assign_in_catch_state( def test_variables_in_lambda_task( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, account_id, @@ -293,8 +298,8 @@ def test_variables_in_lambda_task( definition = json.dumps(template) exec_input = json.dumps({"FunctionName": function_arn, "AccountID": account_id}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -328,7 +333,7 @@ def test_variables_in_lambda_task( def test_reference_in_map_state( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, @@ -357,8 +362,8 @@ def _convert_output_to_json(snapshot_content: dict, *args) -> dict: definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -390,7 +395,7 @@ def test_reference_in_map_state_max_items_path( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, @@ -420,8 +425,8 @@ def test_reference_in_map_state_max_items_path( definition = json.dumps(template) exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/base/test_base.py b/tests/aws/services/stepfunctions/v2/base/test_base.py index 2ecd8972348b1..4987600684233 100644 --- a/tests/aws/services/stepfunctions/v2/base/test_base.py +++ b/tests/aws/services/stepfunctions/v2/base/test_base.py @@ -16,14 +16,13 @@ from tests.aws.services.stepfunctions.templates.base.base_templates import BaseTemplate -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestSnfBase: @markers.aws.validated @markers.snapshot.skip_snapshot_verify(paths=["$..redriveCount", "$..redriveStatus"]) def test_state_fail( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -32,8 +31,8 @@ def test_state_fail( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -45,7 +44,7 @@ def test_state_fail( def test_state_fail_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -54,8 +53,8 @@ def test_state_fail_path( exec_input = json.dumps({"Error": "error string", "Cause": "cause string"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -66,7 +65,7 @@ def test_state_fail_path( def test_state_fail_intrinsic( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -75,8 +74,8 @@ def test_state_fail_intrinsic( exec_input = json.dumps({"Error": "error string", "Cause": "cause string"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -88,7 +87,7 @@ def test_state_fail_intrinsic( def test_state_fail_empty( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -97,8 +96,8 @@ def test_state_fail_empty( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -110,7 +109,7 @@ def test_state_fail_empty( def test_state_pass_result( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -119,8 +118,8 @@ def test_state_pass_result( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -131,7 +130,7 @@ def test_state_pass_result( def test_state_pass_result_jsonpaths( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -144,8 +143,8 @@ def test_state_pass_result_jsonpaths( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -163,7 +162,7 @@ def test_state_pass_result_jsonpaths( ) def test_event_bridge_events_base( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, events_to_sqs_queue, sfn_events_to_sqs_queue, @@ -175,7 +174,7 @@ def test_event_bridge_events_base( definition = json.dumps(template) execution_input = json.dumps(dict()) create_and_record_events( - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_events_to_sqs_queue, aws_client, @@ -187,7 +186,7 @@ def test_event_bridge_events_base( @markers.aws.validated def test_decl_version_1_0( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, aws_client, sfn_snapshot, @@ -197,8 +196,8 @@ def test_decl_version_1_0( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -209,7 +208,7 @@ def test_decl_version_1_0( @markers.aws.needs_fixing def test_event_bridge_events_failure( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_events_to_sqs_queue, aws_client, @@ -221,7 +220,7 @@ def test_event_bridge_events_failure( exec_input = json.dumps({}) create_and_record_events( - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_events_to_sqs_queue, aws_client, @@ -234,7 +233,7 @@ def test_event_bridge_events_failure( @markers.snapshot.skip_snapshot_verify(paths=["$..RedriveCount"]) def test_query_context_object_values( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, aws_client, sfn_snapshot, @@ -265,8 +264,8 @@ def test_query_context_object_values( exec_input = json.dumps({"message": "TestMessage"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -277,7 +276,7 @@ def test_query_context_object_values( def test_state_pass_result_null_input_output_paths( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -286,8 +285,8 @@ def test_state_pass_result_null_input_output_paths( exec_input = json.dumps({"InputValue": 0}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -298,7 +297,7 @@ def test_state_pass_result_null_input_output_paths( def test_execution_dateformat( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, ): """ @@ -315,7 +314,10 @@ def test_execution_dateformat( sm_name = f"test-dateformat-machine-{short_uid()}" sm = create_state_machine( - name=sm_name, definition=definition, roleArn=create_iam_role_for_sfn() + aws_client, + name=sm_name, + definition=definition, + roleArn=create_state_machine_iam_role(aws_client), ) sm_arn = sm["stateMachineArn"] @@ -341,7 +343,7 @@ def test_execution_dateformat( def test_state_pass_regex_json_path_base( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -357,8 +359,8 @@ def test_state_pass_regex_json_path_base( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -370,7 +372,7 @@ def test_state_pass_regex_json_path_base( def test_state_pass_regex_json_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -389,8 +391,8 @@ def test_state_pass_regex_json_path( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -407,7 +409,7 @@ def test_state_pass_regex_json_path( def test_json_path_array_access( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, json_path_string, @@ -418,8 +420,8 @@ def test_json_path_array_access( exec_input = json.dumps({"items": [{"item_key": i} for i in range(11)]}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/base/test_wait.py b/tests/aws/services/stepfunctions/v2/base/test_wait.py index 18e96ceada8fb..43475c6dfee92 100644 --- a/tests/aws/services/stepfunctions/v2/base/test_wait.py +++ b/tests/aws/services/stepfunctions/v2/base/test_wait.py @@ -13,13 +13,12 @@ # TODO: add tests for seconds, secondspath, timestamp # TODO: add tests that actually validate waiting time (e.g. x minutes) BUT mark them accordingly and skip them by default! -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestSfnWait: @pytest.mark.skipif(condition=not is_aws_cloud(), reason="not implemented") @markers.aws.validated @pytest.mark.parametrize("days", [24855, 24856]) def test_timestamp_too_far_in_future_boundary( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, days + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot, days ): """ seems this seems to correlate with "2147483648" as the maximum integer value for the seconds stepfunctions internally uses to represent dates @@ -41,8 +40,8 @@ def test_timestamp_too_far_in_future_boundary( sfn_snapshot.add_transformer(sfn_snapshot.transform.regex(full_timestamp, "")) exec_input = json.dumps({"start_at": full_timestamp}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -65,7 +64,7 @@ def test_timestamp_too_far_in_future_boundary( def test_wait_timestamppath( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, timestamp_suffix, @@ -85,8 +84,8 @@ def test_wait_timestamppath( sfn_snapshot.add_transformer(sfn_snapshot.transform.regex(full_timestamp, "")) exec_input = json.dumps({"start_at": full_timestamp}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -97,7 +96,7 @@ def test_wait_timestamppath( @pytest.mark.parametrize("seconds_value", [-1, -1.5, 0, 1, 1.5]) def test_base_wait_seconds_path( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, aws_client, sfn_snapshot, @@ -107,8 +106,8 @@ def test_base_wait_seconds_path( definition = json.dumps(template) execution_input = json.dumps({"input": {"waitSeconds": seconds_value}}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/callback/test_callback.py b/tests/aws/services/stepfunctions/v2/callback/test_callback.py index f5624f5a78203..fbe49f4f902ca 100644 --- a/tests/aws/services/stepfunctions/v2/callback/test_callback.py +++ b/tests/aws/services/stepfunctions/v2/callback/test_callback.py @@ -9,8 +9,8 @@ from localstack.testing.pytest import markers from localstack.testing.pytest.stepfunctions.utils import ( await_execution_terminated, - create, create_and_record_execution, + create_state_machine_with_iam_role, ) from localstack.utils.strings import short_uid from localstack.utils.sync import retry @@ -52,7 +52,6 @@ def _get_message_body(): @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..SdkHttpMetadata", "$..SdkResponseMetadata", ] @@ -62,7 +61,7 @@ class TestCallback: def test_sqs_wait_for_task_token( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_success_state_machine, @@ -90,8 +89,8 @@ def test_sqs_wait_for_task_token( message_txt = "test_message_txt" exec_input = json.dumps({"QueueUrl": queue_url, "Message": message_txt}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -102,7 +101,7 @@ def test_sqs_wait_for_task_token( def test_sqs_wait_for_task_token_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_success_state_machine, @@ -128,8 +127,8 @@ def test_sqs_wait_for_task_token_timeout( message_txt = "test_message_txt" exec_input = json.dumps({"QueueUrl": queue_url, "Message": message_txt}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -140,7 +139,7 @@ def test_sqs_wait_for_task_token_timeout( def test_sqs_failure_in_wait_for_task_token( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_failure_state_machine, @@ -168,8 +167,8 @@ def test_sqs_failure_in_wait_for_task_token( message_txt = "test_message_txt" exec_input = json.dumps({"QueueUrl": queue_url, "Message": message_txt}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -180,7 +179,7 @@ def test_sqs_failure_in_wait_for_task_token( def test_sqs_wait_for_task_tok_with_heartbeat( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_heartbeat_and_task_success_state_machine, @@ -209,8 +208,8 @@ def test_sqs_wait_for_task_tok_with_heartbeat( message_txt = "test_message_txt" exec_input = json.dumps({"QueueUrl": queue_url, "Message": message_txt}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -221,7 +220,7 @@ def test_sqs_wait_for_task_tok_with_heartbeat( def test_sns_publish_wait_for_task_token( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_receive_num_messages, @@ -272,8 +271,8 @@ def record_messages_and_send_task_success(): ).start() create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -286,7 +285,7 @@ def record_messages_and_send_task_success(): def test_start_execution_sync( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -307,8 +306,9 @@ def test_start_execution_sync( template_target = BT.load_sfn_template(BT.BASE_PASS_RESULT) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -321,8 +321,8 @@ def test_start_execution_sync( {"StateMachineArn": state_machine_arn_target, "Input": None, "Name": "TestStartTarget"} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -333,7 +333,7 @@ def test_start_execution_sync( def test_start_execution_sync2( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -354,8 +354,9 @@ def test_start_execution_sync2( template_target = BT.load_sfn_template(BT.BASE_PASS_RESULT) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -368,8 +369,8 @@ def test_start_execution_sync2( {"StateMachineArn": state_machine_arn_target, "Input": None, "Name": "TestStartTarget"} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -380,7 +381,7 @@ def test_start_execution_sync2( def test_start_execution_sync_delegate_failure( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -408,8 +409,9 @@ def test_start_execution_sync_delegate_failure( template_target = BT.load_sfn_template(BT.BASE_RAISE_FAILURE) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -422,8 +424,8 @@ def test_start_execution_sync_delegate_failure( {"StateMachineArn": state_machine_arn_target, "Input": None, "Name": "TestStartTarget"} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -435,7 +437,7 @@ def test_start_execution_sync_delegate_timeout( self, aws_client, create_lambda_function, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -474,8 +476,9 @@ def test_start_execution_sync_delegate_timeout( template_target["States"]["Start"]["Resource"] = lambda_arn definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -492,8 +495,8 @@ def test_start_execution_sync_delegate_timeout( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -505,7 +508,7 @@ def test_start_execution_sync_delegate_timeout( def test_multiple_heartbeat_notifications( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, @@ -538,8 +541,8 @@ def test_multiple_heartbeat_notifications( {"QueueUrl": queue_url, "Message": "txt", "HeartbeatSecondsPath": 120} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -553,7 +556,7 @@ def test_multiple_heartbeat_notifications( def test_multiple_executions_and_heartbeat_notifications( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, @@ -579,7 +582,7 @@ def test_multiple_executions_and_heartbeat_notifications( sfn_snapshot.add_transformer(RegexTransformer(queue_url, "sqs_queue_url")) sfn_snapshot.add_transformer(RegexTransformer(queue_name, "sqs_queue_name")) - sfn_role_arn = create_iam_role_for_sfn() + sfn_role_arn = create_state_machine_iam_role(aws_client) template = CT.load_sfn_template( TT.SERVICE_SQS_SEND_AND_WAIT_FOR_TASK_TOKEN_WITH_HEARTBEAT_PATH @@ -587,7 +590,10 @@ def test_multiple_executions_and_heartbeat_notifications( definition = json.dumps(template) creation_response = create_state_machine( - name=f"state_machine_{short_uid()}", definition=definition, roleArn=sfn_role_arn + aws_client, + name=f"state_machine_{short_uid()}", + definition=definition, + roleArn=sfn_role_arn, ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_response, 0)) state_machine_arn = creation_response["stateMachineArn"] @@ -632,7 +638,7 @@ def _sqs_task_token_handler(): def test_sqs_wait_for_task_token_call_chain( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_success_state_machine, @@ -666,8 +672,8 @@ def test_sqs_wait_for_task_token_call_chain( exec_input = json.dumps({"QueueUrl": queue_url, "Message": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -678,7 +684,7 @@ def test_sqs_wait_for_task_token_call_chain( def test_sqs_wait_for_task_token_no_token_parameter( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_success_state_machine, @@ -696,8 +702,8 @@ def test_sqs_wait_for_task_token_no_token_parameter( exec_input = json.dumps({"QueueUrl": queue_url}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -713,7 +719,7 @@ def test_sqs_wait_for_task_token_no_token_parameter( def test_sqs_failure_in_wait_for_task_tok_no_error_field( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, @@ -769,8 +775,8 @@ def _get_message_body(): exec_input = json.dumps({"QueueUrl": queue_url, "Message": "test_message_txt"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -783,7 +789,7 @@ def test_sync_with_task_token( aws_client, sqs_create_queue, sqs_send_task_success_state_machine, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -833,8 +839,9 @@ def test_sync_with_task_token( # worker and simulates a long-lasting task by waiting. template_target = BT.load_sfn_template(ST.SQS_SEND_MESSAGE_AND_WAIT) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -855,8 +862,8 @@ def test_sync_with_task_token( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/choice_operators/test_boolean_equals.py b/tests/aws/services/stepfunctions/v2/choice_operators/test_boolean_equals.py index 2b860258dcab2..f7f4ec6ef80af 100644 --- a/tests/aws/services/stepfunctions/v2/choice_operators/test_boolean_equals.py +++ b/tests/aws/services/stepfunctions/v2/choice_operators/test_boolean_equals.py @@ -7,15 +7,14 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestBooleanEquals: @markers.aws.validated def test_boolean_equals( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "BooleanEquals", @@ -24,11 +23,11 @@ def test_boolean_equals( @markers.aws.validated def test_boolean_equals_path( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "BooleanEqualsPath", diff --git a/tests/aws/services/stepfunctions/v2/choice_operators/test_is_operators.py b/tests/aws/services/stepfunctions/v2/choice_operators/test_is_operators.py index d88b8fb3b11da..3c14efbaadbd0 100644 --- a/tests/aws/services/stepfunctions/v2/choice_operators/test_is_operators.py +++ b/tests/aws/services/stepfunctions/v2/choice_operators/test_is_operators.py @@ -10,15 +10,14 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestIsOperators: @markers.aws.validated def test_is_boolean( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "IsBoolean", @@ -26,10 +25,12 @@ def test_is_boolean( ) @markers.aws.validated - def test_is_null(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client): + def test_is_null( + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client + ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "IsNull", @@ -38,11 +39,11 @@ def test_is_null(self, create_iam_role_for_sfn, create_state_machine, sfn_snapsh @markers.aws.validated def test_is_numeric( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "IsNumeric", @@ -51,11 +52,11 @@ def test_is_numeric( @markers.aws.validated def test_is_present( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "IsPresent", @@ -64,11 +65,11 @@ def test_is_present( @markers.aws.validated def test_is_string( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "IsString", @@ -80,11 +81,11 @@ def test_is_string( ) @markers.aws.needs_fixing def test_is_timestamp( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "IsTimestamp", diff --git a/tests/aws/services/stepfunctions/v2/choice_operators/test_numeric.py b/tests/aws/services/stepfunctions/v2/choice_operators/test_numeric.py index fd3764846f4a2..70bd1954588db 100644 --- a/tests/aws/services/stepfunctions/v2/choice_operators/test_numeric.py +++ b/tests/aws/services/stepfunctions/v2/choice_operators/test_numeric.py @@ -24,13 +24,12 @@ ] -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestNumerics: @markers.aws.validated def test_numeric_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -42,8 +41,8 @@ def test_numeric_equals( type_equals.append((var, 1.0)) create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericEquals", @@ -54,7 +53,7 @@ def test_numeric_equals( def test_numeric_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -66,8 +65,8 @@ def test_numeric_equals_path( type_equals.append((var, 1.0)) create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericEqualsPath", @@ -79,13 +78,13 @@ def test_numeric_equals_path( def test_numeric_greater_than( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericGreaterThan", @@ -96,13 +95,13 @@ def test_numeric_greater_than( def test_numeric_greater_than_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericGreaterThanPath", @@ -114,13 +113,13 @@ def test_numeric_greater_than_path( def test_numeric_greater_than_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericGreaterThanEquals", @@ -131,13 +130,13 @@ def test_numeric_greater_than_equals( def test_numeric_greater_than_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericGreaterThanEqualsPath", @@ -149,13 +148,13 @@ def test_numeric_greater_than_equals_path( def test_numeric_less_than( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericLessThan", @@ -166,13 +165,13 @@ def test_numeric_less_than( def test_numeric_less_than_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericLessThanPath", @@ -184,13 +183,13 @@ def test_numeric_less_than_path( def test_numeric_less_than_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericLessThanEquals", @@ -201,13 +200,13 @@ def test_numeric_less_than_equals( def test_numeric_less_than_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "NumericLessThanEqualsPath", diff --git a/tests/aws/services/stepfunctions/v2/choice_operators/test_string_operators.py b/tests/aws/services/stepfunctions/v2/choice_operators/test_string_operators.py index 2d6fe8cdce344..0f7b05fb669b3 100644 --- a/tests/aws/services/stepfunctions/v2/choice_operators/test_string_operators.py +++ b/tests/aws/services/stepfunctions/v2/choice_operators/test_string_operators.py @@ -24,13 +24,12 @@ ] -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestStrings: @markers.aws.validated def test_string_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -39,8 +38,8 @@ def test_string_equals( type_equals.append((var, "HelloWorld")) create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringEquals", @@ -51,7 +50,7 @@ def test_string_equals( def test_string_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -63,8 +62,8 @@ def test_string_equals_path( type_equals.append((var, 1.0)) create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringEqualsPath", @@ -76,13 +75,13 @@ def test_string_equals_path( def test_string_greater_than( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringGreaterThan", @@ -93,13 +92,13 @@ def test_string_greater_than( def test_string_greater_than_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringGreaterThanPath", @@ -111,13 +110,13 @@ def test_string_greater_than_path( def test_string_greater_than_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringGreaterThanEquals", @@ -128,13 +127,13 @@ def test_string_greater_than_equals( def test_string_greater_than_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringGreaterThanEqualsPath", @@ -146,13 +145,13 @@ def test_string_greater_than_equals_path( def test_string_less_than( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringLessThan", @@ -163,13 +162,13 @@ def test_string_less_than( def test_string_less_than_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringLessThanPath", @@ -181,13 +180,13 @@ def test_string_less_than_path( def test_string_less_than_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringLessThanEquals", @@ -198,13 +197,13 @@ def test_string_less_than_equals( def test_string_less_than_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "StringLessThanEqualsPath", diff --git a/tests/aws/services/stepfunctions/v2/choice_operators/test_timestamp_operators.py b/tests/aws/services/stepfunctions/v2/choice_operators/test_timestamp_operators.py index cd10f2c52b608..859cd1d1d6467 100644 --- a/tests/aws/services/stepfunctions/v2/choice_operators/test_timestamp_operators.py +++ b/tests/aws/services/stepfunctions/v2/choice_operators/test_timestamp_operators.py @@ -29,13 +29,12 @@ BASE_COMPARISONS: Final[list[tuple[str, str]]] = [(T0, T0), (T0, T1), (T1, T0)] -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestTimestamps: @markers.aws.validated def test_timestamp_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -44,8 +43,8 @@ def test_timestamp_equals( type_equals.append((var, T0)) create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampEquals", @@ -56,13 +55,13 @@ def test_timestamp_equals( def test_timestamp_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampEqualsPath", @@ -74,13 +73,13 @@ def test_timestamp_equals_path( def test_timestamp_greater_than( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampGreaterThan", @@ -91,13 +90,13 @@ def test_timestamp_greater_than( def test_timestamp_greater_than_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampGreaterThanPath", @@ -109,13 +108,13 @@ def test_timestamp_greater_than_path( def test_timestamp_greater_than_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampGreaterThanEquals", @@ -126,13 +125,13 @@ def test_timestamp_greater_than_equals( def test_timestamp_greater_than_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampGreaterThanEqualsPath", @@ -144,13 +143,13 @@ def test_timestamp_greater_than_equals_path( def test_timestamp_less_than( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampLessThan", @@ -161,13 +160,13 @@ def test_timestamp_less_than( def test_timestamp_less_than_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampLessThanPath", @@ -179,13 +178,13 @@ def test_timestamp_less_than_path( def test_timestamp_less_than_equals( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampLessThanEquals", @@ -196,13 +195,13 @@ def test_timestamp_less_than_equals( def test_timestamp_less_than_equals_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): create_and_test_comparison_function( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, "TimestampLessThanEqualsPath", diff --git a/tests/aws/services/stepfunctions/v2/choice_operators/utils.py b/tests/aws/services/stepfunctions/v2/choice_operators/utils.py index 728839341b115..55d8830cc4c11 100644 --- a/tests/aws/services/stepfunctions/v2/choice_operators/utils.py +++ b/tests/aws/services/stepfunctions/v2/choice_operators/utils.py @@ -51,15 +51,16 @@ def create_and_test_comparison_function( - stepfunctions_client, - create_iam_role_for_sfn, + target_aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, comparison_func_name: str, comparisons: list[tuple[Any, Any]], add_literal_value: bool = True, ): - snf_role_arn = create_iam_role_for_sfn() + stepfunctions_client = target_aws_client.stepfunctions + snf_role_arn = create_state_machine_iam_role(target_aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) base_sm_name: str = f"statemachine_{short_uid()}" @@ -80,7 +81,10 @@ def create_and_test_comparison_function( new_definition_str = definition_str creation_resp = create_state_machine( - name=f"{base_sm_name}_{i}", definition=new_definition_str, roleArn=snf_role_arn + target_aws_client, + name=f"{base_sm_name}_{i}", + definition=new_definition_str, + roleArn=snf_role_arn, ) state_machine_arn = creation_resp["stateMachineArn"] diff --git a/tests/aws/services/stepfunctions/v2/comments/test_comments.py b/tests/aws/services/stepfunctions/v2/comments/test_comments.py index fcebcb9c68515..d7e447699f2fd 100644 --- a/tests/aws/services/stepfunctions/v2/comments/test_comments.py +++ b/tests/aws/services/stepfunctions/v2/comments/test_comments.py @@ -19,7 +19,7 @@ class TestComments: def test_comments_as_per_docs( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -40,8 +40,8 @@ def test_comments_as_per_docs( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -52,7 +52,7 @@ def test_comments_as_per_docs( def test_comment_in_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -61,8 +61,8 @@ def test_comment_in_parameters( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/context_object/test_context_object.py b/tests/aws/services/stepfunctions/v2/context_object/test_context_object.py index 7807bb0d1371f..9d1be7f2ae6a0 100644 --- a/tests/aws/services/stepfunctions/v2/context_object/test_context_object.py +++ b/tests/aws/services/stepfunctions/v2/context_object/test_context_object.py @@ -30,7 +30,7 @@ class TestSnfBase: def test_input_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, context_object_literal, @@ -44,8 +44,8 @@ def test_input_path( ) exec_input = json.dumps({"input-value": 0}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -57,7 +57,7 @@ def test_input_path( def test_output_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, context_object_literal, @@ -71,8 +71,8 @@ def test_output_path( ) exec_input = json.dumps({"input-value": 0}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -83,7 +83,7 @@ def test_output_path( def test_result_selector( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -106,8 +106,8 @@ def test_result_selector( exec_input = json.dumps({"FunctionName": function_name, "Payload": {"input-value": 0}}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -118,7 +118,7 @@ def test_result_selector( def test_variable( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -132,8 +132,8 @@ def test_variable( ) exec_input = json.dumps({"input-value": 0}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -144,7 +144,7 @@ def test_variable( def test_error_cause_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -154,8 +154,8 @@ def test_error_cause_path( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/credentials/__init__.py b/tests/aws/services/stepfunctions/v2/credentials/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py b/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py new file mode 100644 index 0000000000000..201c0a7f70904 --- /dev/null +++ b/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py @@ -0,0 +1,287 @@ +import json + +import pytest +from localstack_snapshot.snapshots.transformer import JsonpathTransformer, RegexTransformer + +from localstack.aws.api.lambda_ import Runtime +from localstack.testing.config import SECONDARY_TEST_AWS_ACCOUNT_ID, TEST_AWS_ACCOUNT_ID +from localstack.testing.pytest import markers +from localstack.testing.pytest.stepfunctions.utils import ( + create_and_record_execution, + create_state_machine_with_iam_role, +) +from localstack.utils.strings import short_uid +from tests.aws.services.stepfunctions.templates.base.base_templates import ( + BaseTemplate as BT, +) +from tests.aws.services.stepfunctions.templates.credentials.credentials_templates import ( + CredentialsTemplates as CT, +) +from tests.aws.services.stepfunctions.templates.errorhandling.error_handling_templates import ( + ErrorHandlingTemplate as EHT, +) +from tests.aws.services.stepfunctions.templates.services.services_templates import ( + ServicesTemplates as ST, +) + + +@markers.snapshot.skip_snapshot_verify( + paths=[ + "$..SdkHttpMetadata", + "$..SdkResponseMetadata", + "$..RedriveCount", + "$..RedriveStatus", + "$..RedriveStatusReason", + ] +) +class TestCredentialsBase: + @markers.aws.validated + @pytest.mark.parametrize( + "template_path", + [CT.EMPTY_CREDENTIALS, CT.INVALID_CREDENTIALS_FIELD], + ids=["EMPTY_CREDENTIALS", "INVALID_CREDENTIALS_FIELD"], + ) + @markers.snapshot.skip_snapshot_verify(paths=["$..Error.Message", "$..message"]) + def test_invalid_credentials_field( + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template_path, + ): + snf_role_arn = create_state_machine_iam_role(aws_client) + sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "sfn_role_arn")) + + definition = CT.load_sfn_template(template_path) + definition_str = json.dumps(definition) + + sm_name = f"statemachine_{short_uid()}" + + with pytest.raises(Exception) as ex: + create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn + ) + sfn_snapshot.match("invalid_definition", ex.value.response) + + @markers.aws.validated + @pytest.mark.parametrize( + "template_path", + [ + CT.SFN_START_EXECUTION_SYNC_ROLE_ARN_JSONATA, + CT.SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH, + CT.SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH_CONTEXT, + CT.SFN_START_EXECUTION_SYNC_ROLE_ARN_VARIABLE, + CT.SFN_START_EXECUTION_SYNC_ROLE_ARN_INTRINSIC, + ], + ids=[ + "SFN_START_EXECUTION_SYNC_ROLE_ARN_JSONATA", + "SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH", + "SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH_CONTEXT", + "SFN_START_EXECUTION_SYNC_ROLE_ARN_VARIABLE", + "SFN_START_EXECUTION_SYNC_ROLE_ARN_INTRINSIC", + ], + ) + def test_cross_account_states_start_sync_execution( + self, + aws_client, + secondary_aws_client, + create_state_machine_iam_role, + create_state_machine, + create_cross_account_admin_role_and_policy, + sfn_snapshot, + template_path, + ): + trusted_role_arn = create_cross_account_admin_role_and_policy( + trusted_aws_client=aws_client, + trusting_aws_client=secondary_aws_client, + trusted_account_id=TEST_AWS_ACCOUNT_ID, + ) + sfn_snapshot.add_transformer(RegexTransformer(trusted_role_arn, "")) + sfn_snapshot.add_transformer( + JsonpathTransformer( + jsonpath="$..output.StartDate", + replacement="", + replace_reference=False, + ) + ) + sfn_snapshot.add_transformer( + JsonpathTransformer( + jsonpath="$..output.StopDate", + replacement="", + replace_reference=False, + ) + ) + target_definition = json.dumps(BT.load_sfn_template(BT.BASE_PASS_RESULT)) + target_state_machine_arn = create_state_machine_with_iam_role( + secondary_aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + target_definition, + ) + definition = json.dumps(CT.load_sfn_template(template_path)) + exec_input = json.dumps( + { + "StateMachineArn": target_state_machine_arn, + "Input": json.dumps("InputFromTrustedAccount"), + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": trusted_role_arn, + } + ) + create_and_record_execution( + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, + exec_input, + ) + sfn_snapshot.add_transformers_list( + [ + RegexTransformer(TEST_AWS_ACCOUNT_ID, ""), + RegexTransformer(SECONDARY_TEST_AWS_ACCOUNT_ID, ""), + ] + ) + + @markers.aws.validated + def test_cross_account_lambda_task( + self, + aws_client, + secondary_aws_client, + create_lambda_function, + create_state_machine_iam_role, + create_state_machine, + create_cross_account_admin_role_and_policy, + sfn_snapshot, + ): + trusted_role_arn = create_cross_account_admin_role_and_policy( + trusted_aws_client=secondary_aws_client, + trusting_aws_client=aws_client, + trusted_account_id=SECONDARY_TEST_AWS_ACCOUNT_ID, + ) + sfn_snapshot.add_transformer(RegexTransformer(trusted_role_arn, "")) + function_name = f"lambda_func_{short_uid()}" + create_lambda_response = create_lambda_function( + func_name=function_name, handler_file=ST.LAMBDA_ID_FUNCTION, runtime=Runtime.python3_12 + ) + sfn_snapshot.add_transformer(RegexTransformer(function_name, "")) + template = CT.load_sfn_template(CT.LAMBDA_TASK) + template["States"]["LambdaTask"]["Resource"] = create_lambda_response[ + "CreateFunctionResponse" + ]["FunctionArn"] + definition = json.dumps(template) + exec_input = json.dumps( + { + "Payload": json.dumps("PayloadFromTrustedAccount"), + "CredentialsRoleArn": trusted_role_arn, + } + ) + create_and_record_execution( + secondary_aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, + exec_input, + ) + sfn_snapshot.add_transformers_list( + [ + RegexTransformer(TEST_AWS_ACCOUNT_ID, ""), + RegexTransformer(SECONDARY_TEST_AWS_ACCOUNT_ID, ""), + ] + ) + + @markers.aws.validated + def test_cross_account_service_lambda_invoke( + self, + aws_client, + secondary_aws_client, + create_lambda_function, + create_state_machine_iam_role, + create_state_machine, + create_cross_account_admin_role_and_policy, + sfn_snapshot, + ): + trusted_role_arn = create_cross_account_admin_role_and_policy( + trusted_aws_client=secondary_aws_client, + trusting_aws_client=aws_client, + trusted_account_id=SECONDARY_TEST_AWS_ACCOUNT_ID, + ) + sfn_snapshot.add_transformer(RegexTransformer(trusted_role_arn, "")) + function_name = f"lambda_func_{short_uid()}" + create_lambda_function( + func_name=function_name, handler_file=ST.LAMBDA_ID_FUNCTION, runtime=Runtime.python3_12 + ) + sfn_snapshot.add_transformer(RegexTransformer(function_name, "")) + template = CT.load_sfn_template(CT.SERVICE_LAMBDA_INVOKE) + definition = json.dumps(template) + exec_input = json.dumps( + { + "FunctionName": function_name, + "Payload": json.dumps("PayloadFromTrustedAccount"), + "CredentialsRoleArn": trusted_role_arn, + } + ) + create_and_record_execution( + secondary_aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, + exec_input, + ) + sfn_snapshot.add_transformers_list( + [ + RegexTransformer(TEST_AWS_ACCOUNT_ID, ""), + RegexTransformer(SECONDARY_TEST_AWS_ACCOUNT_ID, ""), + ] + ) + + @markers.aws.validated + def test_cross_account_service_lambda_invoke_retry( + self, + aws_client, + secondary_aws_client, + create_lambda_function, + create_state_machine_iam_role, + create_state_machine, + create_cross_account_admin_role_and_policy, + sfn_snapshot, + ): + trusted_role_arn = create_cross_account_admin_role_and_policy( + trusted_aws_client=secondary_aws_client, + trusting_aws_client=aws_client, + trusted_account_id=SECONDARY_TEST_AWS_ACCOUNT_ID, + ) + sfn_snapshot.add_transformer(RegexTransformer(trusted_role_arn, "")) + function_name = f"lambda_func_{short_uid()}" + create_lambda_function( + func_name=function_name, + handler_file=EHT.LAMBDA_FUNC_RAISE_EXCEPTION, + runtime=Runtime.python3_12, + ) + sfn_snapshot.add_transformer(RegexTransformer(function_name, "")) + template = CT.load_sfn_template(CT.SERVICE_LAMBDA_INVOKE_RETRY) + definition = json.dumps(template) + exec_input = json.dumps( + { + "FunctionName": function_name, + "Payload": json.dumps("PayloadFromTrustedAccount"), + "CredentialsRoleArn": trusted_role_arn, + } + ) + create_and_record_execution( + secondary_aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, + exec_input, + ) + sfn_snapshot.add_transformers_list( + [ + RegexTransformer(TEST_AWS_ACCOUNT_ID, ""), + RegexTransformer(SECONDARY_TEST_AWS_ACCOUNT_ID, ""), + ] + ) diff --git a/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.snapshot.json b/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.snapshot.json new file mode 100644 index 0000000000000..7641c050c404b --- /dev/null +++ b/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.snapshot.json @@ -0,0 +1,1759 @@ +{ + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_JSONATA]": { + "recorded-date": "04-12-2024, 17:11:42", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "StartExecution" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 3, + "previousEventId": 2, + "taskScheduledEventDetails": { + "parameters": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials" + }, + "region": "", + "resource": "startExecution.sync", + "resourceType": "states", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 4, + "previousEventId": 3, + "taskStartedEventDetails": { + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 5, + "previousEventId": 4, + "taskSubmittedEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "x-amzn-RequestId": [ + "" + ], + "connection": [ + "keep-alive" + ], + "Content-Length": [ + "178" + ], + "Date": "date", + "Content-Type": [ + "application/x-amz-json-1.0" + ] + }, + "HttpHeaders": { + "connection": "keep-alive", + "Content-Length": "178", + "Content-Type": "application/x-amz-json-1.0", + "Date": "date", + "x-amzn-RequestId": "" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StartDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSubmitted" + }, + { + "id": 6, + "previousEventId": 5, + "taskSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSucceeded" + }, + { + "id": 7, + "previousEventId": 6, + "stateExitedEventDetails": { + "name": "StartExecution", + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "TaskStateExited" + }, + { + "executionSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "id": 8, + "previousEventId": 7, + "timestamp": "timestamp", + "type": "ExecutionSucceeded" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH]": { + "recorded-date": "04-12-2024, 17:12:32", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "StartExecution" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 3, + "previousEventId": 2, + "taskScheduledEventDetails": { + "parameters": { + "Input": "\"InputFromTrustedAccount\"", + "StateMachineArn": "arn::states:::stateMachine:", + "Name": "TestTaskTargetWithCredentials" + }, + "region": "", + "resource": "startExecution.sync", + "resourceType": "states", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 4, + "previousEventId": 3, + "taskStartedEventDetails": { + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 5, + "previousEventId": 4, + "taskSubmittedEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "x-amzn-RequestId": [ + "" + ], + "connection": [ + "keep-alive" + ], + "Content-Length": [ + "178" + ], + "Date": "date", + "Content-Type": [ + "application/x-amz-json-1.0" + ] + }, + "HttpHeaders": { + "connection": "keep-alive", + "Content-Length": "178", + "Content-Type": "application/x-amz-json-1.0", + "Date": "date", + "x-amzn-RequestId": "" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StartDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSubmitted" + }, + { + "id": 6, + "previousEventId": 5, + "taskSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSucceeded" + }, + { + "id": 7, + "previousEventId": 6, + "stateExitedEventDetails": { + "name": "StartExecution", + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "TaskStateExited" + }, + { + "executionSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "id": 8, + "previousEventId": 7, + "timestamp": "timestamp", + "type": "ExecutionSucceeded" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH_CONTEXT]": { + "recorded-date": "04-12-2024, 17:13:18", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "StartExecution" + }, + "timestamp": "timestamp", + "type": "PassStateEntered" + }, + { + "id": 3, + "previousEventId": 2, + "stateExitedEventDetails": { + "assignedVariables": { + "roleArn": "\"\"" + }, + "assignedVariablesDetails": { + "truncated": false + }, + "name": "StartExecution", + "output": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "PassStateExited" + }, + { + "id": 4, + "previousEventId": 3, + "stateEnteredEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "RunTask" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 5, + "previousEventId": 4, + "taskScheduledEventDetails": { + "parameters": { + "Input": "\"InputFromTrustedAccount\"", + "StateMachineArn": "arn::states:::stateMachine:", + "Name": "TestTaskTargetWithCredentials" + }, + "region": "", + "resource": "startExecution.sync", + "resourceType": "states", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 6, + "previousEventId": 5, + "taskStartedEventDetails": { + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 7, + "previousEventId": 6, + "taskSubmittedEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "x-amzn-RequestId": [ + "" + ], + "connection": [ + "keep-alive" + ], + "Content-Length": [ + "177" + ], + "Date": "date", + "Content-Type": [ + "application/x-amz-json-1.0" + ] + }, + "HttpHeaders": { + "connection": "keep-alive", + "Content-Length": "177", + "Content-Type": "application/x-amz-json-1.0", + "Date": "date", + "x-amzn-RequestId": "" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StartDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSubmitted" + }, + { + "id": 8, + "previousEventId": 7, + "taskSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSucceeded" + }, + { + "id": 9, + "previousEventId": 8, + "stateExitedEventDetails": { + "name": "RunTask", + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "TaskStateExited" + }, + { + "executionSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "id": 10, + "previousEventId": 9, + "timestamp": "timestamp", + "type": "ExecutionSucceeded" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_VARIABLE]": { + "recorded-date": "04-12-2024, 17:14:14", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "StartExecution" + }, + "timestamp": "timestamp", + "type": "PassStateEntered" + }, + { + "id": 3, + "previousEventId": 2, + "stateExitedEventDetails": { + "assignedVariables": { + "roleArn": "\"\"" + }, + "assignedVariablesDetails": { + "truncated": false + }, + "name": "StartExecution", + "output": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "PassStateExited" + }, + { + "id": 4, + "previousEventId": 3, + "stateEnteredEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "RunTask" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 5, + "previousEventId": 4, + "taskScheduledEventDetails": { + "parameters": { + "Input": "\"InputFromTrustedAccount\"", + "StateMachineArn": "arn::states:::stateMachine:", + "Name": "TestTaskTargetWithCredentials" + }, + "region": "", + "resource": "startExecution.sync", + "resourceType": "states", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 6, + "previousEventId": 5, + "taskStartedEventDetails": { + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 7, + "previousEventId": 6, + "taskSubmittedEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "x-amzn-RequestId": [ + "" + ], + "connection": [ + "keep-alive" + ], + "Content-Length": [ + "178" + ], + "Date": "date", + "Content-Type": [ + "application/x-amz-json-1.0" + ] + }, + "HttpHeaders": { + "connection": "keep-alive", + "Content-Length": "178", + "Content-Type": "application/x-amz-json-1.0", + "Date": "date", + "x-amzn-RequestId": "" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StartDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSubmitted" + }, + { + "id": 8, + "previousEventId": 7, + "taskSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSucceeded" + }, + { + "id": 9, + "previousEventId": 8, + "stateExitedEventDetails": { + "name": "RunTask", + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "TaskStateExited" + }, + { + "executionSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "id": 10, + "previousEventId": 9, + "timestamp": "timestamp", + "type": "ExecutionSucceeded" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_invalid_credentials_field[EMPTY_CREDENTIALS]": { + "recorded-date": "04-12-2024, 14:50:43", + "recorded-content": { + "invalid_definition": { + "Error": { + "Code": "InvalidDefinition", + "Message": "Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The field 'RoleArn' is required but was missing at /States/State0/Credentials'" + }, + "message": "Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The field 'RoleArn' is required but was missing at /States/State0/Credentials'", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 400 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_invalid_credentials_field[INVALID_CREDENTIALS_FIELD]": { + "recorded-date": "04-12-2024, 14:51:02", + "recorded-content": { + "invalid_definition": { + "Error": { + "Code": "InvalidDefinition", + "Message": "Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The field 'RoleArn' is required but was missing at /States/State0/Credentials'" + }, + "message": "Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The field 'RoleArn' is required but was missing at /States/State0/Credentials'", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 400 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_INTRINSIC]": { + "recorded-date": "04-12-2024, 17:15:00", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "StateMachineArn": "arn::states:::stateMachine:", + "Input": "\"InputFromTrustedAccount\"", + "Name": "TestTaskTargetWithCredentials", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "StartExecution" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 3, + "previousEventId": 2, + "taskScheduledEventDetails": { + "parameters": { + "Input": "\"InputFromTrustedAccount\"", + "StateMachineArn": "arn::states:::stateMachine:", + "Name": "TestTaskTargetWithCredentials" + }, + "region": "", + "resource": "startExecution.sync", + "resourceType": "states", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 4, + "previousEventId": 3, + "taskStartedEventDetails": { + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 5, + "previousEventId": 4, + "taskSubmittedEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "x-amzn-RequestId": [ + "" + ], + "connection": [ + "keep-alive" + ], + "Content-Length": [ + "178" + ], + "Date": "date", + "Content-Type": [ + "application/x-amz-json-1.0" + ] + }, + "HttpHeaders": { + "connection": "keep-alive", + "Content-Length": "178", + "Content-Type": "application/x-amz-json-1.0", + "Date": "date", + "x-amzn-RequestId": "" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StartDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSubmitted" + }, + { + "id": 6, + "previousEventId": 5, + "taskSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + }, + "resource": "startExecution.sync", + "resourceType": "states" + }, + "timestamp": "timestamp", + "type": "TaskSucceeded" + }, + { + "id": 7, + "previousEventId": 6, + "stateExitedEventDetails": { + "name": "StartExecution", + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "TaskStateExited" + }, + { + "executionSucceededEventDetails": { + "output": { + "ExecutionArn": "arn::states:::execution::TestTaskTargetWithCredentials", + "Input": "\"InputFromTrustedAccount\"", + "InputDetails": { + "Included": true + }, + "Name": "TestTaskTargetWithCredentials", + "Output": "{\"Arg1\":\"argument1\"}", + "OutputDetails": { + "Included": true + }, + "RedriveCount": 0, + "RedriveStatus": "NOT_REDRIVABLE", + "RedriveStatusReason": "Execution is SUCCEEDED and cannot be redriven", + "StartDate": "", + "StateMachineArn": "arn::states:::stateMachine:", + "Status": "SUCCEEDED", + "StopDate": "" + }, + "outputDetails": { + "truncated": false + } + }, + "id": 8, + "previousEventId": 7, + "timestamp": "timestamp", + "type": "ExecutionSucceeded" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_service_lambda_invoke": { + "recorded-date": "04-12-2024, 20:28:21", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "InvokeLambda" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 3, + "previousEventId": 2, + "taskScheduledEventDetails": { + "parameters": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"" + }, + "region": "", + "resource": "invoke", + "resourceType": "lambda", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 4, + "previousEventId": 3, + "taskStartedEventDetails": { + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 5, + "previousEventId": 4, + "taskSucceededEventDetails": { + "output": { + "ExecutedVersion": "$LATEST", + "Payload": "PayloadFromTrustedAccount", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "X-Amz-Executed-Version": [ + "$LATEST" + ], + "x-amzn-Remapped-Content-Length": [ + "0" + ], + "Connection": [ + "keep-alive" + ], + "x-amzn-RequestId": [ + "" + ], + "Content-Length": [ + "27" + ], + "Date": "date", + "X-Amzn-Trace-Id": "X-Amzn-Trace-Id", + "Content-Type": [ + "application/json" + ] + }, + "HttpHeaders": { + "Connection": "keep-alive", + "Content-Length": "27", + "Content-Type": "application/json", + "Date": "date", + "X-Amz-Executed-Version": "$LATEST", + "x-amzn-Remapped-Content-Length": "0", + "x-amzn-RequestId": "", + "X-Amzn-Trace-Id": "X-Amzn-Trace-Id" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StatusCode": 200 + }, + "outputDetails": { + "truncated": false + }, + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskSucceeded" + }, + { + "id": 6, + "previousEventId": 5, + "stateExitedEventDetails": { + "name": "InvokeLambda", + "output": { + "ExecutedVersion": "$LATEST", + "Payload": "PayloadFromTrustedAccount", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "X-Amz-Executed-Version": [ + "$LATEST" + ], + "x-amzn-Remapped-Content-Length": [ + "0" + ], + "Connection": [ + "keep-alive" + ], + "x-amzn-RequestId": [ + "" + ], + "Content-Length": [ + "27" + ], + "Date": "date", + "X-Amzn-Trace-Id": "X-Amzn-Trace-Id", + "Content-Type": [ + "application/json" + ] + }, + "HttpHeaders": { + "Connection": "keep-alive", + "Content-Length": "27", + "Content-Type": "application/json", + "Date": "date", + "X-Amz-Executed-Version": "$LATEST", + "x-amzn-Remapped-Content-Length": "0", + "x-amzn-RequestId": "", + "X-Amzn-Trace-Id": "X-Amzn-Trace-Id" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StatusCode": 200 + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "TaskStateExited" + }, + { + "executionSucceededEventDetails": { + "output": { + "ExecutedVersion": "$LATEST", + "Payload": "PayloadFromTrustedAccount", + "SdkHttpMetadata": { + "AllHttpHeaders": { + "X-Amz-Executed-Version": [ + "$LATEST" + ], + "x-amzn-Remapped-Content-Length": [ + "0" + ], + "Connection": [ + "keep-alive" + ], + "x-amzn-RequestId": [ + "" + ], + "Content-Length": [ + "27" + ], + "Date": "date", + "X-Amzn-Trace-Id": "X-Amzn-Trace-Id", + "Content-Type": [ + "application/json" + ] + }, + "HttpHeaders": { + "Connection": "keep-alive", + "Content-Length": "27", + "Content-Type": "application/json", + "Date": "date", + "X-Amz-Executed-Version": "$LATEST", + "x-amzn-Remapped-Content-Length": "0", + "x-amzn-RequestId": "", + "X-Amzn-Trace-Id": "X-Amzn-Trace-Id" + }, + "HttpStatusCode": 200 + }, + "SdkResponseMetadata": { + "RequestId": "" + }, + "StatusCode": 200 + }, + "outputDetails": { + "truncated": false + } + }, + "id": 7, + "previousEventId": 6, + "timestamp": "timestamp", + "type": "ExecutionSucceeded" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_service_lambda_invoke_retry": { + "recorded-date": "04-12-2024, 20:34:05", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "InvokeLambda" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 3, + "previousEventId": 2, + "taskScheduledEventDetails": { + "parameters": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"" + }, + "region": "", + "resource": "invoke", + "resourceType": "lambda", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 4, + "previousEventId": 3, + "taskStartedEventDetails": { + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 5, + "previousEventId": 4, + "taskFailedEventDetails": { + "cause": { + "errorMessage": "Some exception was raised.", + "errorType": "Exception", + "requestId": "", + "stackTrace": [ + " File \"/var/task/handler.py\", line 2, in handler\n raise Exception(\"Some exception was raised.\")\n" + ] + }, + "error": "Exception", + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskFailed" + }, + { + "id": 6, + "previousEventId": 5, + "taskScheduledEventDetails": { + "parameters": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"" + }, + "region": "", + "resource": "invoke", + "resourceType": "lambda", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 7, + "previousEventId": 6, + "taskStartedEventDetails": { + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 8, + "previousEventId": 7, + "taskFailedEventDetails": { + "cause": { + "errorMessage": "Some exception was raised.", + "errorType": "Exception", + "requestId": "", + "stackTrace": [ + " File \"/var/task/handler.py\", line 2, in handler\n raise Exception(\"Some exception was raised.\")\n" + ] + }, + "error": "Exception", + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskFailed" + }, + { + "id": 9, + "previousEventId": 8, + "taskScheduledEventDetails": { + "parameters": { + "FunctionName": "", + "Payload": "\"PayloadFromTrustedAccount\"" + }, + "region": "", + "resource": "invoke", + "resourceType": "lambda", + "taskCredentials": { + "roleArn": "" + } + }, + "timestamp": "timestamp", + "type": "TaskScheduled" + }, + { + "id": 10, + "previousEventId": 9, + "taskStartedEventDetails": { + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskStarted" + }, + { + "id": 11, + "previousEventId": 10, + "taskFailedEventDetails": { + "cause": { + "errorMessage": "Some exception was raised.", + "errorType": "Exception", + "requestId": "", + "stackTrace": [ + " File \"/var/task/handler.py\", line 2, in handler\n raise Exception(\"Some exception was raised.\")\n" + ] + }, + "error": "Exception", + "resource": "invoke", + "resourceType": "lambda" + }, + "timestamp": "timestamp", + "type": "TaskFailed" + }, + { + "executionFailedEventDetails": { + "cause": { + "errorMessage": "Some exception was raised.", + "errorType": "Exception", + "requestId": "", + "stackTrace": [ + " File \"/var/task/handler.py\", line 2, in handler\n raise Exception(\"Some exception was raised.\")\n" + ] + }, + "error": "Exception" + }, + "id": 12, + "previousEventId": 11, + "timestamp": "timestamp", + "type": "ExecutionFailed" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_lambda_task": { + "recorded-date": "04-12-2024, 20:43:04", + "recorded-content": { + "get_execution_history": { + "events": [ + { + "executionStartedEventDetails": { + "input": { + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "roleArn": "snf_role_arn" + }, + "id": 1, + "previousEventId": 0, + "timestamp": "timestamp", + "type": "ExecutionStarted" + }, + { + "id": 2, + "previousEventId": 0, + "stateEnteredEventDetails": { + "input": { + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "name": "LambdaTask" + }, + "timestamp": "timestamp", + "type": "TaskStateEntered" + }, + { + "id": 3, + "lambdaFunctionScheduledEventDetails": { + "input": { + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "inputDetails": { + "truncated": false + }, + "resource": "arn::lambda:::function:", + "taskCredentials": { + "roleArn": "" + } + }, + "previousEventId": 2, + "timestamp": "timestamp", + "type": "LambdaFunctionScheduled" + }, + { + "id": 4, + "previousEventId": 3, + "timestamp": "timestamp", + "type": "LambdaFunctionStarted" + }, + { + "id": 5, + "lambdaFunctionSucceededEventDetails": { + "output": { + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "outputDetails": { + "truncated": false + } + }, + "previousEventId": 4, + "timestamp": "timestamp", + "type": "LambdaFunctionSucceeded" + }, + { + "id": 6, + "previousEventId": 5, + "stateExitedEventDetails": { + "name": "LambdaTask", + "output": { + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "outputDetails": { + "truncated": false + } + }, + "timestamp": "timestamp", + "type": "TaskStateExited" + }, + { + "executionSucceededEventDetails": { + "output": { + "Payload": "\"PayloadFromTrustedAccount\"", + "CredentialsRoleArn": "" + }, + "outputDetails": { + "truncated": false + } + }, + "id": 7, + "previousEventId": 6, + "timestamp": "timestamp", + "type": "ExecutionSucceeded" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + } +} diff --git a/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.validation.json b/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.validation.json new file mode 100644 index 0000000000000..30d54ee45b5f9 --- /dev/null +++ b/tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.validation.json @@ -0,0 +1,32 @@ +{ + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_lambda_task": { + "last_validated_date": "2024-12-04T20:43:04+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_service_lambda_invoke": { + "last_validated_date": "2024-12-04T20:28:21+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_service_lambda_invoke_retry": { + "last_validated_date": "2024-12-04T20:34:05+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_INTRINSIC]": { + "last_validated_date": "2024-12-04T17:15:00+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_JSONATA]": { + "last_validated_date": "2024-12-04T17:11:42+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH]": { + "last_validated_date": "2024-12-04T17:12:32+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_PATH_CONTEXT]": { + "last_validated_date": "2024-12-04T17:13:18+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_cross_account_states_start_sync_execution[SFN_START_EXECUTION_SYNC_ROLE_ARN_VARIABLE]": { + "last_validated_date": "2024-12-04T17:14:14+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_invalid_credentials_field[EMPTY_CREDENTIALS]": { + "last_validated_date": "2024-12-04T14:50:43+00:00" + }, + "tests/aws/services/stepfunctions/v2/credentials/test_credentials_base.py::TestCredentialsBase::test_invalid_credentials_field[INVALID_CREDENTIALS_FIELD]": { + "last_validated_date": "2024-12-04T14:51:02+00:00" + } +} diff --git a/tests/aws/services/stepfunctions/v2/error_handling/test_aws_sdk.py b/tests/aws/services/stepfunctions/v2/error_handling/test_aws_sdk.py index fed62b65236d1..7cdc28dc6073f 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/test_aws_sdk.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/test_aws_sdk.py @@ -14,18 +14,17 @@ ) -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestAwsSdk: @markers.aws.validated def test_invalid_secret_name( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot ): template = EHT.load_sfn_template(EHT.AWS_SDK_TASK_FAILED_SECRETSMANAGER_CREATE_SECRET) definition = json.dumps(template) exec_input = json.dumps({"Name": "Invalid Name", "SecretString": "HelloWorld"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -34,7 +33,7 @@ def test_invalid_secret_name( @markers.aws.validated def test_no_such_bucket( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot ): template = EHT.load_sfn_template(EHT.AWS_SDK_TASK_FAILED_S3_LIST_OBJECTS) definition = json.dumps(template) @@ -42,8 +41,8 @@ def test_no_such_bucket( sfn_snapshot.add_transformer(RegexTransformer(bucket_name, "someNonexistentBucketName")) exec_input = json.dumps({"Bucket": bucket_name}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -59,7 +58,7 @@ def test_no_such_bucket( def test_dynamodb_invalid_param( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, sfn_snapshot, @@ -73,8 +72,8 @@ def test_dynamodb_invalid_param( {"TableName": f"no_such_sfn_test_table_{short_uid()}", "Key": None, "Item": None} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -86,7 +85,7 @@ def test_dynamodb_invalid_param( def test_dynamodb_put_item_no_such_table( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -104,8 +103,8 @@ def test_dynamodb_put_item_no_such_table( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/error_handling/test_states_errors.py b/tests/aws/services/stepfunctions/v2/error_handling/test_states_errors.py index 8be8d58aad66b..cdbdab6b50938 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/test_states_errors.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/test_states_errors.py @@ -12,17 +12,12 @@ ) -@markers.snapshot.skip_snapshot_verify( - paths=[ - "$..tracingConfiguration", - ] -) class TestStatesErrors: @markers.aws.validated def test_service_task_lambada_data_limit_exceeded_on_large_utf8_response( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -46,8 +41,8 @@ def test_service_task_lambada_data_limit_exceeded_on_large_utf8_response( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -58,7 +53,7 @@ def test_service_task_lambada_data_limit_exceeded_on_large_utf8_response( def test_service_task_lambada_catch_state_all_data_limit_exceeded_on_large_utf8_response( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -83,8 +78,8 @@ def test_service_task_lambada_catch_state_all_data_limit_exceeded_on_large_utf8_ exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -95,7 +90,7 @@ def test_service_task_lambada_catch_state_all_data_limit_exceeded_on_large_utf8_ def test_task_lambda_data_limit_exceeded_on_large_utf8_response( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -124,8 +119,8 @@ def test_task_lambda_data_limit_exceeded_on_large_utf8_response( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -136,7 +131,7 @@ def test_task_lambda_data_limit_exceeded_on_large_utf8_response( def test_task_lambda_catch_state_all_data_limit_exceeded_on_large_utf8_response( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -165,8 +160,8 @@ def test_task_lambda_catch_state_all_data_limit_exceeded_on_large_utf8_response( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -177,7 +172,7 @@ def test_task_lambda_catch_state_all_data_limit_exceeded_on_large_utf8_response( def test_start_large_input( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -205,8 +200,8 @@ def test_start_large_input( exec_input = json.dumps(dict()) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/error_handling/test_task_lambda.py b/tests/aws/services/stepfunctions/v2/error_handling/test_task_lambda.py index ffef223030f7a..d89fa5b28e767 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/test_task_lambda.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/test_task_lambda.py @@ -19,7 +19,7 @@ class TestTaskLambda: def test_raise_exception( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -40,8 +40,8 @@ def test_raise_exception( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -52,7 +52,7 @@ def test_raise_exception( def test_raise_custom_exception( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -74,8 +74,8 @@ def test_raise_custom_exception( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -86,7 +86,7 @@ def test_raise_custom_exception( def test_raise_exception_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -107,8 +107,8 @@ def test_raise_exception_catch( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -119,7 +119,7 @@ def test_raise_exception_catch( def test_no_such_function( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -140,8 +140,8 @@ def test_no_such_function( exec_input = json.dumps({"FunctionName": f"no_such_{function_name}", "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -152,7 +152,7 @@ def test_no_such_function( def test_no_such_function_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -173,8 +173,8 @@ def test_no_such_function_catch( exec_input = json.dumps({"FunctionName": f"no_such_{function_name}", "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_dynamodb.py b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_dynamodb.py index a289c52b5561b..61edd8aa9c2ba 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_dynamodb.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_dynamodb.py @@ -12,7 +12,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -26,7 +25,7 @@ class TestTaskServiceDynamoDB: def test_invalid_param( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, snapshot, @@ -40,8 +39,8 @@ def test_invalid_param( {"TableName": f"no_such_sfn_test_table_{short_uid()}", "Key": None, "Item": None} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, snapshot, definition, @@ -52,7 +51,7 @@ def test_invalid_param( def test_put_item_no_such_table( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, snapshot, ): @@ -70,8 +69,8 @@ def test_put_item_no_such_table( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, snapshot, definition, @@ -87,7 +86,7 @@ def test_put_item_no_such_table( def test_put_item_invalid_table_name( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, snapshot, ): @@ -105,8 +104,8 @@ def test_put_item_invalid_table_name( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_lambda.py b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_lambda.py index d91c7974919e9..790a2763d8b72 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_lambda.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_lambda.py @@ -22,7 +22,7 @@ class TestTaskServiceLambda: def test_raise_exception( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -40,8 +40,8 @@ def test_raise_exception( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -52,7 +52,7 @@ def test_raise_exception( def test_raise_custom_exception( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -71,8 +71,8 @@ def test_raise_custom_exception( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -83,7 +83,7 @@ def test_raise_custom_exception( def test_raise_exception_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -101,8 +101,8 @@ def test_raise_exception_catch( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -114,7 +114,7 @@ def test_raise_exception_catch( def test_raise_exception_catch_output_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -136,8 +136,8 @@ def test_raise_exception_catch_output_path( {"FunctionName": function_name, "Payload": {"payload_input_value_0": 0}} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -148,7 +148,7 @@ def test_raise_exception_catch_output_path( def test_no_such_function( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -166,8 +166,8 @@ def test_no_such_function( exec_input = json.dumps({"FunctionName": f"no_such_{function_name}", "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -178,7 +178,7 @@ def test_no_such_function( def test_no_such_function_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -196,8 +196,8 @@ def test_no_such_function_catch( exec_input = json.dumps({"FunctionName": f"no_such_{function_name}", "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -208,7 +208,7 @@ def test_no_such_function_catch( def test_invoke_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -226,8 +226,8 @@ def test_invoke_timeout( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sfn.py b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sfn.py index 5cce37d33b24c..35a4d74cd3328 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sfn.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sfn.py @@ -4,8 +4,8 @@ from localstack.testing.pytest import markers from localstack.testing.pytest.stepfunctions.utils import ( - create, create_and_record_execution, + create_state_machine_with_iam_role, ) from localstack.utils.strings import short_uid from tests.aws.services.stepfunctions.templates.base.base_templates import BaseTemplate as BT @@ -16,7 +16,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -27,7 +26,7 @@ class TestTaskServiceSfn: def test_start_execution_no_such_arn( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -41,8 +40,9 @@ def test_start_execution_no_such_arn( template_target = BT.load_sfn_template(BT.BASE_PASS_RESULT) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -63,8 +63,8 @@ def test_start_execution_no_such_arn( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sqs.py b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sqs.py index 891a6e4a79505..8351e0bfbba54 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sqs.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/test_task_service_sqs.py @@ -19,7 +19,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -33,7 +32,7 @@ class TestTaskServiceSqs: def test_send_message_no_such_queue( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -50,8 +49,8 @@ def test_send_message_no_such_queue( message_body = "test_message_body" exec_input = json.dumps({"QueueUrl": queue_url, "MessageBody": message_body}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -62,7 +61,7 @@ def test_send_message_no_such_queue( def test_send_message_no_such_queue_no_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -79,8 +78,8 @@ def test_send_message_no_such_queue_no_catch( message_body = "test_message_body" exec_input = json.dumps({"QueueUrl": queue_url, "MessageBody": message_body}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -94,7 +93,7 @@ def test_send_message_no_such_queue_no_catch( def test_send_message_empty_body( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, @@ -111,8 +110,8 @@ def test_send_message_empty_body( exec_input = json.dumps({"QueueUrl": queue_url, "MessageBody": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -123,7 +122,7 @@ def test_send_message_empty_body( def test_sqs_failure_in_wait_for_task_tok( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_failure_state_machine, @@ -152,8 +151,8 @@ def test_sqs_failure_in_wait_for_task_tok( message_txt = "test_message_txt" exec_input = json.dumps({"QueueUrl": queue_url, "Message": message_txt}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/error_handling/utils.py b/tests/aws/services/stepfunctions/v2/error_handling/utils.py index 1df2463611487..bd922531c4543 100644 --- a/tests/aws/services/stepfunctions/v2/error_handling/utils.py +++ b/tests/aws/services/stepfunctions/v2/error_handling/utils.py @@ -6,14 +6,15 @@ @staticmethod def _test_sfn_scenario( - stepfunctions_client, - create_iam_role_for_sfn, + target_aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, execution_input, ): - snf_role_arn = create_iam_role_for_sfn() + stepfunctions_client = target_aws_client.stepfunctions + snf_role_arn = create_state_machine_iam_role(target_aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sfn_snapshot.add_transformer( RegexTransformer( @@ -26,7 +27,9 @@ def _test_sfn_scenario( ) sm_name: str = f"statemachine_{short_uid()}" - creation_resp = create_state_machine(name=sm_name, definition=definition, roleArn=snf_role_arn) + creation_resp = create_state_machine( + target_aws_client, name=sm_name, definition=definition, roleArn=snf_role_arn + ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] diff --git a/tests/aws/services/stepfunctions/v2/evaluate_jsonata/test_base_evaluate_expressions.py b/tests/aws/services/stepfunctions/v2/evaluate_jsonata/test_base_evaluate_expressions.py index 5e6be999b94c1..4a1a78538a52d 100644 --- a/tests/aws/services/stepfunctions/v2/evaluate_jsonata/test_base_evaluate_expressions.py +++ b/tests/aws/services/stepfunctions/v2/evaluate_jsonata/test_base_evaluate_expressions.py @@ -23,7 +23,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..redriveCount", "$..redriveStatus", "$..RedriveCount", @@ -53,7 +52,7 @@ class TestBaseEvaluateJsonata: def test_base_task( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -80,8 +79,8 @@ def test_base_task( exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -115,7 +114,7 @@ def test_base_task( def test_base_map( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, expression_dict, @@ -126,8 +125,8 @@ def test_base_map( exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -145,7 +144,7 @@ def test_base_map( def test_base_task_from_input( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -173,8 +172,8 @@ def test_base_task_from_input( exec_input = json.dumps({"input_value": input_value}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -200,7 +199,7 @@ def test_base_task_from_input( def test_base_map_from_input( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -228,8 +227,8 @@ def test_base_map_from_input( exec_input = json.dumps({"input_value": input_value}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, diff --git a/tests/aws/services/stepfunctions/v2/express/test_express_async.py b/tests/aws/services/stepfunctions/v2/express/test_express_async.py index ac77ed2cf45a6..4cc322ba3926c 100644 --- a/tests/aws/services/stepfunctions/v2/express/test_express_async.py +++ b/tests/aws/services/stepfunctions/v2/express/test_express_async.py @@ -18,7 +18,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..billingDetails", "$..redrive_count", "$..event_timestamp", @@ -34,7 +33,7 @@ class TestExpressAsync: ) def test_base( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -45,7 +44,7 @@ def test_base( exec_input = json.dumps({}) create_and_record_express_async_execution( aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -57,7 +56,7 @@ def test_base( @markers.aws.validated def test_query_runtime_memory( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, sfn_create_log_group, create_state_machine, aws_client, @@ -90,7 +89,7 @@ def test_query_runtime_memory( exec_input = json.dumps({"message": "TestMessage"}) create_and_record_express_async_execution( aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -102,7 +101,7 @@ def test_query_runtime_memory( def test_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, sfn_create_log_group, create_state_machine, create_lambda_function, @@ -129,7 +128,7 @@ def test_catch( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_express_async_execution( aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -141,7 +140,7 @@ def test_catch( def test_retry( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, sfn_create_log_group, create_state_machine, create_lambda_function, @@ -170,7 +169,7 @@ def test_retry( exec_input = json.dumps({}) create_and_record_express_async_execution( aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, diff --git a/tests/aws/services/stepfunctions/v2/express/test_express_sync.py b/tests/aws/services/stepfunctions/v2/express/test_express_sync.py index 4c103b3153605..cc769cc9e28a3 100644 --- a/tests/aws/services/stepfunctions/v2/express/test_express_sync.py +++ b/tests/aws/services/stepfunctions/v2/express/test_express_sync.py @@ -18,7 +18,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..billingDetails", "$..output.Cause", ] @@ -32,18 +31,18 @@ class TestExpressSync: ) def test_base( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, - stepfunctions_client_sync_executions, + aws_client_no_sync_prefix, template, ): definition = json.dumps(BaseTemplate.load_sfn_template(template)) exec_input = json.dumps({}) create_and_record_express_sync_execution( - stepfunctions_client_sync_executions, - create_iam_role_for_sfn, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -54,9 +53,9 @@ def test_base( @markers.aws.validated def test_query_runtime_memory( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, - stepfunctions_client_sync_executions, + aws_client_no_sync_prefix, sfn_snapshot, ): sfn_snapshot.add_transformer( @@ -85,8 +84,8 @@ def test_query_runtime_memory( exec_input = json.dumps({"message": "TestMessage"}) create_and_record_express_sync_execution( - stepfunctions_client_sync_executions, - create_iam_role_for_sfn, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -96,8 +95,8 @@ def test_query_runtime_memory( @markers.aws.validated def test_catch( self, - stepfunctions_client_sync_executions, - create_iam_role_for_sfn, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -122,8 +121,8 @@ def test_catch( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_express_sync_execution( - stepfunctions_client_sync_executions, - create_iam_role_for_sfn, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -134,8 +133,8 @@ def test_catch( def test_retry( self, aws_client, - stepfunctions_client_sync_executions, - create_iam_role_for_sfn, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -162,8 +161,8 @@ def test_retry( exec_input = json.dumps({}) create_and_record_express_sync_execution( - stepfunctions_client_sync_executions, - create_iam_role_for_sfn, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array.py index 3f6837f80b7eb..6dd745757fb3e 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array.py @@ -9,13 +9,14 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestArray: @markers.aws.validated - def test_array_0(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client): + def test_array_0( + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client + ): create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_0, @@ -23,7 +24,9 @@ def test_array_0(self, create_iam_role_for_sfn, create_state_machine, sfn_snapsh ) @markers.aws.validated - def test_array_2(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client): + def test_array_2( + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client + ): values = [ "", " ", @@ -38,8 +41,8 @@ def test_array_2(self, create_iam_role_for_sfn, create_state_machine, sfn_snapsh for value in values: input_values.append({"fst": value, "snd": value}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_2, @@ -48,7 +51,7 @@ def test_array_2(self, create_iam_role_for_sfn, create_state_machine, sfn_snapsh @markers.aws.validated def test_array_partition( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): arrays = [list(range(i)) for i in range(5)] input_values = list() @@ -56,8 +59,8 @@ def test_array_partition( for chunk_size in range(1, 6): input_values.append({"fst": array, "snd": chunk_size}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_PARTITION, @@ -66,7 +69,7 @@ def test_array_partition( @markers.aws.validated def test_array_contains( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): search_bindings = [ ([], None), @@ -83,8 +86,8 @@ def test_array_contains( for array, value in search_bindings: input_values.append({"fst": array, "snd": value}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_CONTAINS, @@ -93,7 +96,7 @@ def test_array_contains( @markers.aws.validated def test_array_range( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): ranges = [ (0, 9, 3), @@ -105,8 +108,8 @@ def test_array_range( for fst, lst, step in ranges: input_values.append({"fst": fst, "snd": lst, "trd": step}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_RANGE, @@ -115,12 +118,12 @@ def test_array_range( @markers.aws.validated def test_array_get_item( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [{"fst": [1, 2, 3, 4, 5, 6, 7, 8, 9], "snd": 5}] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_GET_ITEM, @@ -129,12 +132,12 @@ def test_array_get_item( @markers.aws.validated def test_array_length( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [[1, 2, 3, 4, 5, 6, 7, 8, 9]] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_LENGTH, @@ -143,7 +146,7 @@ def test_array_length( @markers.aws.validated def test_array_unique( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [ [ @@ -170,8 +173,8 @@ def test_array_unique( ] ] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_LENGTH, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array_jsonata.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array_jsonata.py index 7730d11539352..23d325683e2c7 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array_jsonata.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_array_jsonata.py @@ -5,11 +5,10 @@ from tests.aws.services.stepfunctions.v2.intrinsic_functions.utils import create_and_test_on_inputs -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestArrayJSONata: @markers.aws.validated def test_array_partition( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): # TODO: test and add support for raising exception on empty array. arrays = [list(range(i)) for i in range(1, 5)] @@ -18,8 +17,8 @@ def test_array_partition( for chunk_size in range(1, 6): input_values.append({"fst": array, "snd": chunk_size}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_PARTITION_JSONATA, @@ -28,7 +27,7 @@ def test_array_partition( @markers.aws.validated def test_array_range( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): ranges = [ (0, 9, 3), @@ -40,8 +39,8 @@ def test_array_range( for fst, lst, step in ranges: input_values.append({"fst": fst, "snd": lst, "trd": step}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ARRAY_RANGE_JSONATA, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_encode_decode.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_encode_decode.py index 1f067b5473e38..7e81435856da1 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_encode_decode.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_encode_decode.py @@ -7,16 +7,15 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestEncodeDecode: @markers.aws.validated def test_base_64_encode( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = ["", "Data to encode"] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.BASE_64_ENCODE, @@ -25,12 +24,12 @@ def test_base_64_encode( @markers.aws.validated def test_base_64_decode( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = ["", "RGF0YSB0byBlbmNvZGU="] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.BASE_64_DECODE, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_generic.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_generic.py index fb50be20dd803..b480ecf4725ee 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_generic.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_generic.py @@ -9,16 +9,15 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestGeneric: @markers.aws.validated def test_format_1( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = ["", " ", "HelloWorld", None, 1, 1.1, '{"Arg1": 1, "Arg2": []}'] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.FORMAT_1, @@ -27,7 +26,7 @@ def test_format_1( @markers.aws.validated def test_format_2( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): values = [ "", @@ -44,8 +43,8 @@ def test_format_2( input_values.append({"fst": value, "snd": value}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.FORMAT_2, @@ -54,12 +53,12 @@ def test_format_2( @markers.aws.validated def test_context_json_path( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [None] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.FORMAT_CONTEXT_PATH, @@ -68,12 +67,12 @@ def test_context_json_path( @markers.aws.validated def test_nested_calls_1( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [None] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.NESTED_CALLS_1, @@ -82,12 +81,12 @@ def test_nested_calls_1( @markers.aws.validated def test_nested_calls_2( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [None] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.NESTED_CALLS_2, @@ -96,12 +95,12 @@ def test_nested_calls_2( @markers.aws.validated def test_escape_sequence( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [None] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.ESCAPE_SEQUENCE, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_hash_calculations.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_hash_calculations.py index 33090bc6f3496..cc259fabb9eb7 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_hash_calculations.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_hash_calculations.py @@ -7,10 +7,11 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestHashCalculations: @markers.aws.validated - def test_hash(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client): + def test_hash( + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client + ): hash_bindings = [ ("input data", "MD5"), ("input data", "SHA-1"), @@ -20,8 +21,8 @@ def test_hash(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, ] input_values = [{"fst": inp, "snd": algo} for inp, algo in hash_bindings] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.HASH, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation.py index 5202b7fdd4884..d3b37ad599872 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation.py @@ -10,11 +10,10 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestJsonManipulation: @markers.aws.validated def test_string_to_json( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [ "", @@ -29,8 +28,8 @@ def test_string_to_json( '{"Arg1": 1, "Arg2": []}', ] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.STRING_TO_JSON, @@ -39,7 +38,7 @@ def test_string_to_json( @markers.aws.validated def test_json_to_string( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [ "null", @@ -53,8 +52,8 @@ def test_json_to_string( ] input_values_jsons = list(map(json.loads, input_values)) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.JSON_TO_STRING, @@ -63,7 +62,7 @@ def test_json_to_string( @markers.aws.validated def test_json_merge( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): merge_bindings = [ ({"a": {"a1": 1, "a2": 2}, "b": 2, "d": 3}, {"a": {"a3": 1, "a4": 2}, "c": 3, "d": 4}), @@ -72,8 +71,8 @@ def test_json_merge( for fst, snd in merge_bindings: input_values.append({"fst": fst, "snd": snd}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.JSON_MERGE, @@ -84,7 +83,7 @@ def test_json_merge( def test_json_merge_escaped_argument( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -93,8 +92,8 @@ def test_json_merge_escaped_argument( exec_input = json.dumps({"input_field": {"constant_input_field": "constant_value"}}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation_jsonata.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation_jsonata.py index f6ce931f41435..ec69ca6638ec0 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation_jsonata.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_json_manipulation_jsonata.py @@ -7,7 +7,9 @@ class TestJsonManipulationJSONata: @markers.aws.validated - def test_parse(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client): + def test_parse( + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client + ): input_values = [ # "null", TODO: Skip as this is failing on the $eval/$parse "-0", @@ -19,8 +21,8 @@ def test_parse(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot '{"Arg1": 1, "Arg2": []}', ] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.PARSE_JSONATA, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations.py index afb6da8a58f6b..61d10ce646811 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations.py @@ -13,13 +13,12 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestMathOperations: @markers.aws.validated def test_math_random( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sfn_snapshot.add_transformer( JsonpathTransformer( @@ -41,7 +40,7 @@ def test_math_random( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] @@ -70,9 +69,9 @@ def test_math_random( @markers.aws.validated def test_math_random_seeded( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sfn_snapshot.add_transformer( JsonpathTransformer( @@ -94,7 +93,7 @@ def test_math_random_seeded( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] @@ -118,7 +117,7 @@ def test_math_random_seeded( @markers.aws.validated def test_math_add( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): add_tuples = [ (-9, 3), @@ -149,8 +148,8 @@ def test_math_add( for fst, snd in add_tuples: input_values.append({"fst": fst, "snd": snd}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.MATH_ADD, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations_jsonata.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations_jsonata.py index c78c019f196d3..e18fc4eba08a7 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations_jsonata.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_math_operations_jsonata.py @@ -12,9 +12,9 @@ class TestMathOperationsJSONata: @pytest.mark.skip(reason="AWS does not compute function randomSeeded") @markers.aws.validated def test_math_random_seeded( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sfn_snapshot.add_transformer( JsonpathTransformer( @@ -32,8 +32,8 @@ def test_math_random_seeded( ) input_values = list({"fst": 3}) create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.MATH_RANDOM_SEEDED_JSONATA, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_string_operations.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_string_operations.py index 2809446786b41..4b70770f00881 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_string_operations.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_string_operations.py @@ -7,11 +7,10 @@ # TODO: test for validation errors, and boundary testing. -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestStringOperations: @markers.aws.validated def test_string_split( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [ {"fst": " ", "snd": ","}, @@ -22,8 +21,8 @@ def test_string_split( {"fst": "This.is+a,test=string", "snd": ".+,="}, ] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.STRING_SPLIT, @@ -32,7 +31,7 @@ def test_string_split( @markers.aws.validated def test_string_split_context_object( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): input_values = [ ( @@ -45,8 +44,8 @@ def test_string_split_context_object( ) ] create_and_test_on_inputs( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, IFT.STRING_SPLIT_CONTEXT_OBJECT, diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_unique_id_generation.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_unique_id_generation.py index 4978edd4d6141..0e9e93ba713ab 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_unique_id_generation.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/test_unique_id_generation.py @@ -11,11 +11,12 @@ ) -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestUniqueIdGeneration: @markers.aws.validated - def test_uuid(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client): - snf_role_arn = create_iam_role_for_sfn() + def test_uuid( + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client + ): + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -23,7 +24,7 @@ def test_uuid(self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] diff --git a/tests/aws/services/stepfunctions/v2/intrinsic_functions/utils.py b/tests/aws/services/stepfunctions/v2/intrinsic_functions/utils.py index d3d8d06fa6c00..278ce973ea4c2 100644 --- a/tests/aws/services/stepfunctions/v2/intrinsic_functions/utils.py +++ b/tests/aws/services/stepfunctions/v2/intrinsic_functions/utils.py @@ -12,14 +12,15 @@ def create_and_test_on_inputs( - stepfunctions_client, - create_iam_role_for_sfn, + target_aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ift_template, input_values, ): - snf_role_arn = create_iam_role_for_sfn() + stepfunctions_client = target_aws_client.stepfunctions + snf_role_arn = create_state_machine_iam_role(target_aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -27,7 +28,7 @@ def create_and_test_on_inputs( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + target_aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] diff --git a/tests/aws/services/stepfunctions/v2/logs/test_logs.py b/tests/aws/services/stepfunctions/v2/logs/test_logs.py index 313f923db1b62..3eb7a32dec710 100644 --- a/tests/aws/services/stepfunctions/v2/logs/test_logs.py +++ b/tests/aws/services/stepfunctions/v2/logs/test_logs.py @@ -14,8 +14,8 @@ from localstack.testing.pytest import markers from localstack.testing.pytest.stepfunctions.utils import ( await_execution_terminated, - create, create_and_record_logs, + create_state_machine_with_iam_role, launch_and_record_execution, launch_and_record_logs, ) @@ -60,7 +60,7 @@ @markers.snapshot.skip_snapshot_verify( - paths=["$..tracingConfiguration", "$..redriveCount", "$..redrive_count", "$..redriveStatus"] + paths=["$..redriveCount", "$..redrive_count", "$..redriveStatus"] ) class TestLogs: @markers.aws.validated @@ -73,7 +73,7 @@ class TestLogs: def test_base( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, sfn_create_log_group, create_state_machine, sfn_snapshot, @@ -87,7 +87,7 @@ def test_base( exec_input = json.dumps({}) create_and_record_logs( aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -107,7 +107,7 @@ def test_base( def test_partial_log_levels( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, sfn_create_log_group, create_state_machine, sfn_snapshot, @@ -132,8 +132,9 @@ def test_partial_log_levels( template = BaseTemplate.load_sfn_template(template_path) definition = json.dumps(template) - state_machine_arn = create( - create_iam_role_for_sfn, + state_machine_arn = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -149,7 +150,7 @@ def test_partial_log_levels( @markers.aws.validated def test_deleted_log_group( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -169,14 +170,15 @@ def test_deleted_log_group( ], ) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) template = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) definition = json.dumps(template) - state_machine_arn = create( - create_iam_role_for_sfn, + state_machine_arn = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -194,7 +196,7 @@ def _log_group_is_deleted() -> bool: execution_input = json.dumps({}) launch_and_record_execution( - aws_client.stepfunctions, + aws_client, sfn_snapshot, state_machine_arn, execution_input, @@ -203,7 +205,7 @@ def _log_group_is_deleted() -> bool: @markers.aws.validated def test_log_group_with_multiple_runs( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -231,14 +233,15 @@ def test_log_group_with_multiple_runs( ], ) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) template = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) definition = json.dumps(template) - state_machine_arn = create( - create_iam_role_for_sfn, + state_machine_arn = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/outputdecl/test_output.py b/tests/aws/services/stepfunctions/v2/outputdecl/test_output.py index b5a3cca31ba80..44eb75fadef99 100644 --- a/tests/aws/services/stepfunctions/v2/outputdecl/test_output.py +++ b/tests/aws/services/stepfunctions/v2/outputdecl/test_output.py @@ -43,7 +43,7 @@ def test_base_cases( self, sfn_snapshot, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, template_path, @@ -52,8 +52,8 @@ def test_base_cases( definition = json.dumps(template) exec_input = json.dumps({"input_value": "string literal", "input_values": [1, 2, 3]}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -74,7 +74,7 @@ def test_base_lambda( self, sfn_snapshot, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, template_path, @@ -92,8 +92,8 @@ def test_base_lambda( definition = json.dumps(template) exec_input = json.dumps({"input_value": "string literal", "input_values": [1, 2, 3]}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -114,7 +114,7 @@ def test_base_task_lambda( self, sfn_snapshot, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, template_path, @@ -137,8 +137,8 @@ def test_base_task_lambda( } ) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -184,7 +184,7 @@ def test_base_output_any_non_dict( self, sfn_snapshot, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, output_value, @@ -195,8 +195,8 @@ def test_base_output_any_non_dict( exec_input = json.dumps({"input_value": "stringliteral"}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, diff --git a/tests/aws/services/stepfunctions/v2/query_language/test_base_query_language.py b/tests/aws/services/stepfunctions/v2/query_language/test_base_query_language.py index 03ee2acc8dead..dbc0aeac833f9 100644 --- a/tests/aws/services/stepfunctions/v2/query_language/test_base_query_language.py +++ b/tests/aws/services/stepfunctions/v2/query_language/test_base_query_language.py @@ -25,7 +25,7 @@ class TestBaseQueryLanguage: def test_base_query_language_field( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, @@ -33,8 +33,8 @@ def test_base_query_language_field( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -53,7 +53,7 @@ def test_base_query_language_field( def test_query_language_field_override( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, @@ -61,8 +61,8 @@ def test_query_language_field_override( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -74,7 +74,7 @@ def test_query_language_field_override( def test_jsonata_query_language_field_downgrade_exception( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -88,7 +88,7 @@ def test_jsonata_query_language_field_downgrade_exception( try: create_and_record_execution( stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, diff --git a/tests/aws/services/stepfunctions/v2/query_language/test_mixed_query_language.py b/tests/aws/services/stepfunctions/v2/query_language/test_mixed_query_language.py index 906c8329e1a4c..8c3e69c0e7884 100644 --- a/tests/aws/services/stepfunctions/v2/query_language/test_mixed_query_language.py +++ b/tests/aws/services/stepfunctions/v2/query_language/test_mixed_query_language.py @@ -35,7 +35,7 @@ class TestMixedQueryLanguageFlow: def test_variable_sampling( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, @@ -43,8 +43,8 @@ def test_variable_sampling( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -63,7 +63,7 @@ def test_variable_sampling( def test_output_to_state( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, @@ -71,8 +71,8 @@ def test_output_to_state( definition = json.dumps(template) exec_input = json.dumps({"input_data": "test"}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -83,7 +83,7 @@ def test_output_to_state( def test_task_dataflow_to_state( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -103,8 +103,8 @@ def test_task_dataflow_to_state( definition = json.dumps(template) exec_input = json.dumps({"functionName": function_arn}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -130,7 +130,7 @@ def test_task_dataflow_to_state( def test_lambda_task_resource_data_flow( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -154,8 +154,8 @@ def test_lambda_task_resource_data_flow( ) exec_input = json.dumps({}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, diff --git a/tests/aws/services/stepfunctions/v2/scenarios/test_base_scenarios.py b/tests/aws/services/stepfunctions/v2/scenarios/test_base_scenarios.py index f00bce6f2ee55..41a5307915a1d 100644 --- a/tests/aws/services/stepfunctions/v2/scenarios/test_base_scenarios.py +++ b/tests/aws/services/stepfunctions/v2/scenarios/test_base_scenarios.py @@ -11,8 +11,8 @@ from localstack.testing.pytest.stepfunctions.utils import ( SfnNoneRecursiveParallelTransformer, await_execution_terminated, - create, create_and_record_execution, + create_state_machine_with_iam_role, ) from localstack.utils.strings import short_uid from tests.aws.services.stepfunctions.templates.errorhandling.error_handling_templates import ( @@ -26,14 +26,13 @@ ) -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestBaseScenarios: @markers.snapshot.skip_snapshot_verify(paths=["$..cause"]) @markers.aws.validated def test_catch_states_runtime( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -53,8 +52,8 @@ def test_catch_states_runtime( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -65,7 +64,7 @@ def test_catch_states_runtime( def test_catch_empty( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -85,8 +84,8 @@ def test_catch_empty( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -103,14 +102,19 @@ def test_catch_empty( ids=["PARALLEL_STATE", "PARALLEL_STATE_PARAMETERS"], ) def test_parallel_state( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, template + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template, ): sfn_snapshot.add_transformer(SfnNoneRecursiveParallelTransformer()) definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -122,7 +126,7 @@ def test_parallel_state( def test_max_concurrency_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, max_concurrency_value, @@ -137,8 +141,8 @@ def test_max_concurrency_path( {"MaxConcurrencyValue": max_concurrency_value, "Values": ["HelloWorld"]} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -157,7 +161,7 @@ def test_max_concurrency_path( def test_max_concurrency_path_negative( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -166,8 +170,8 @@ def test_max_concurrency_path_negative( exec_input = json.dumps({"MaxConcurrencyValue": -1, "Values": ["HelloWorld"]}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -178,7 +182,7 @@ def test_max_concurrency_path_negative( def test_parallel_state_order( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -188,8 +192,8 @@ def test_parallel_state_order( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -200,7 +204,7 @@ def test_parallel_state_order( def test_parallel_state_fail( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -209,8 +213,8 @@ def test_parallel_state_fail( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -230,7 +234,7 @@ def test_parallel_state_fail( def test_parallel_state_nested( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -240,8 +244,8 @@ def test_parallel_state_nested( exec_input = json.dumps([[1, 2, 3], [4, 5, 6]]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -252,7 +256,7 @@ def test_parallel_state_nested( def test_parallel_state_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -261,8 +265,8 @@ def test_parallel_state_catch( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -273,7 +277,7 @@ def test_parallel_state_catch( def test_parallel_state_retry( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -282,8 +286,8 @@ def test_parallel_state_retry( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -294,7 +298,7 @@ def test_parallel_state_retry( def test_map_state( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -303,8 +307,8 @@ def test_map_state( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -322,7 +326,7 @@ def test_map_state( def test_map_state_nested( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -336,8 +340,8 @@ def test_map_state_nested( ] ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -348,7 +352,7 @@ def test_map_state_nested( def test_map_state_no_processor_config( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -357,8 +361,8 @@ def test_map_state_no_processor_config( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -369,7 +373,7 @@ def test_map_state_no_processor_config( def test_map_state_legacy( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -378,8 +382,8 @@ def test_map_state_legacy( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -397,7 +401,7 @@ def test_map_state_legacy( def test_map_state_legacy_config_inline( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -406,8 +410,8 @@ def test_map_state_legacy_config_inline( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -425,7 +429,7 @@ def test_map_state_legacy_config_inline( def test_map_state_legacy_config_distributed( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -434,8 +438,8 @@ def test_map_state_legacy_config_distributed( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -453,7 +457,7 @@ def test_map_state_legacy_config_distributed( def test_map_state_legacy_config_distributed_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -462,8 +466,8 @@ def test_map_state_legacy_config_distributed_parameters( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -481,7 +485,7 @@ def test_map_state_legacy_config_distributed_parameters( def test_map_state_legacy_config_distributed_item_selector( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -490,8 +494,8 @@ def test_map_state_legacy_config_distributed_item_selector( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -509,7 +513,7 @@ def test_map_state_legacy_config_distributed_item_selector( def test_map_state_legacy_config_inline_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -518,8 +522,8 @@ def test_map_state_legacy_config_inline_parameters( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -537,7 +541,7 @@ def test_map_state_legacy_config_inline_parameters( def test_map_state_legacy_config_inline_item_selector( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -546,8 +550,8 @@ def test_map_state_legacy_config_inline_item_selector( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -565,7 +569,7 @@ def test_map_state_legacy_config_inline_item_selector( def test_map_state_config_distributed_item_selector( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -574,8 +578,8 @@ def test_map_state_config_distributed_item_selector( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -593,7 +597,7 @@ def test_map_state_config_distributed_item_selector( def test_map_state_config_distributed_item_selector_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -602,8 +606,8 @@ def test_map_state_config_distributed_item_selector_parameters( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -614,7 +618,7 @@ def test_map_state_config_distributed_item_selector_parameters( def test_map_state_legacy_reentrant( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -623,8 +627,8 @@ def test_map_state_legacy_reentrant( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -635,7 +639,7 @@ def test_map_state_legacy_reentrant( def test_map_state_config_distributed_reentrant( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -651,8 +655,8 @@ def test_map_state_config_distributed_reentrant( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -663,7 +667,7 @@ def test_map_state_config_distributed_reentrant( def test_map_state_config_distributed_reentrant_lambda( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -690,8 +694,8 @@ def test_map_state_config_distributed_reentrant_lambda( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -709,7 +713,7 @@ def test_map_state_config_distributed_reentrant_lambda( def test_map_state_config_distributed_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -718,8 +722,8 @@ def test_map_state_config_distributed_parameters( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -737,7 +741,7 @@ def test_map_state_config_distributed_parameters( def test_map_state_config_inline_item_selector( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -746,8 +750,8 @@ def test_map_state_config_inline_item_selector( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -765,7 +769,7 @@ def test_map_state_config_inline_item_selector( def test_map_state_config_inline_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -774,8 +778,8 @@ def test_map_state_config_inline_parameters( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -786,7 +790,7 @@ def test_map_state_config_inline_parameters( def test_map_state_item_selector( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -795,8 +799,8 @@ def test_map_state_item_selector( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -827,7 +831,7 @@ def test_map_state_item_selector( def test_map_state_items_eval_jsonata_fail( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, items_literal, @@ -838,8 +842,8 @@ def test_map_state_items_eval_jsonata_fail( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -855,7 +859,7 @@ def test_map_state_items_eval_jsonata_fail( def test_map_state_items_eval_jsonata( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, items_literal, @@ -866,8 +870,8 @@ def test_map_state_items_eval_jsonata( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -885,7 +889,7 @@ def test_map_state_items_eval_jsonata( def test_map_state_items_eval_jsonata_variable_sampling_fail( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, items_literal, @@ -896,8 +900,8 @@ def test_map_state_items_eval_jsonata_variable_sampling_fail( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -922,7 +926,7 @@ def test_map_state_items_eval_jsonata_variable_sampling_fail( def test_map_state_items_input_types( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, items_value, @@ -932,8 +936,8 @@ def test_map_state_items_input_types( exec_input = json.dumps({"items": items_value}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -949,7 +953,7 @@ def test_map_state_items_input_types( def test_map_state_items_input_array( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, items_value, @@ -959,8 +963,8 @@ def test_map_state_items_input_array( exec_input = json.dumps({"items": items_value}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -977,7 +981,7 @@ def test_map_state_items_input_array( def test_map_state_items_variable_sampling( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, items_literal, @@ -988,8 +992,8 @@ def test_map_state_items_variable_sampling( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1000,7 +1004,7 @@ def test_map_state_items_variable_sampling( def test_map_state_item_selector_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1009,8 +1013,8 @@ def test_map_state_item_selector_parameters( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1021,7 +1025,7 @@ def test_map_state_item_selector_parameters( def test_map_state_parameters_legacy( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1030,8 +1034,8 @@ def test_map_state_parameters_legacy( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1042,7 +1046,7 @@ def test_map_state_parameters_legacy( def test_map_state_item_selector_singleton( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1051,8 +1055,8 @@ def test_map_state_item_selector_singleton( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1063,7 +1067,7 @@ def test_map_state_item_selector_singleton( def test_map_state_parameters_singleton_legacy( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1072,8 +1076,8 @@ def test_map_state_parameters_singleton_legacy( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1084,7 +1088,7 @@ def test_map_state_parameters_singleton_legacy( def test_map_state_catch( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1093,8 +1097,8 @@ def test_map_state_catch( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1105,7 +1109,7 @@ def test_map_state_catch( def test_map_state_catch_empty_fail( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1114,8 +1118,8 @@ def test_map_state_catch_empty_fail( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1126,7 +1130,7 @@ def test_map_state_catch_empty_fail( def test_map_state_catch_legacy( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1135,8 +1139,8 @@ def test_map_state_catch_legacy( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1147,7 +1151,7 @@ def test_map_state_catch_legacy( def test_map_state_retry( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1156,8 +1160,8 @@ def test_map_state_retry( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1168,7 +1172,7 @@ def test_map_state_retry( def test_map_state_retry_multiple_retriers( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1177,8 +1181,8 @@ def test_map_state_retry_multiple_retriers( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1189,7 +1193,7 @@ def test_map_state_retry_multiple_retriers( def test_map_state_retry_legacy( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1198,8 +1202,8 @@ def test_map_state_retry_legacy( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1210,7 +1214,7 @@ def test_map_state_retry_legacy( def test_map_state_break_condition( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1219,8 +1223,8 @@ def test_map_state_break_condition( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1231,7 +1235,7 @@ def test_map_state_break_condition( def test_map_state_break_condition_legacy( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1240,8 +1244,8 @@ def test_map_state_break_condition_legacy( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1257,7 +1261,7 @@ def test_map_state_break_condition_legacy( def test_map_state_tolerated_failure_values( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, tolerance_template, @@ -1267,8 +1271,8 @@ def test_map_state_tolerated_failure_values( exec_input = json.dumps([0]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1280,7 +1284,7 @@ def test_map_state_tolerated_failure_values( def test_map_state_tolerated_failure_count_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, tolerated_failure_count_value, @@ -1292,8 +1296,8 @@ def test_map_state_tolerated_failure_count_path( {"Items": [0], "ToleratedFailureCount": tolerated_failure_count_value} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1308,7 +1312,7 @@ def test_map_state_tolerated_failure_percentage_path( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, tolerated_failure_percentage_value, @@ -1320,8 +1324,8 @@ def test_map_state_tolerated_failure_percentage_path( {"Items": [0], "ToleratedFailurePercentage": tolerated_failure_percentage_value} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1332,7 +1336,7 @@ def test_map_state_tolerated_failure_percentage_path( def test_map_state_label( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1341,8 +1345,8 @@ def test_map_state_label( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1354,7 +1358,7 @@ def test_map_state_result_writer( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1366,8 +1370,8 @@ def test_map_state_result_writer( exec_input = json.dumps(["Hello", "World"]) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1405,13 +1409,18 @@ def test_map_state_result_writer( ], ) def test_choice_unsorted_parameters_positive( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, template_path + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template_path, ): template = ST.load_sfn_template(template_path) definition = json.dumps(template) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1431,13 +1440,18 @@ def test_choice_unsorted_parameters_positive( ], ) def test_choice_unsorted_parameters_negative( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, template_path + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template_path, ): template = ST.load_sfn_template(template_path) definition = json.dumps(template) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1448,7 +1462,7 @@ def test_choice_unsorted_parameters_negative( def test_choice_condition_constant_jsonata( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1456,8 +1470,8 @@ def test_choice_condition_constant_jsonata( definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1471,14 +1485,19 @@ def test_choice_condition_constant_jsonata( ids=["CHOICE_STATE_AWS_SCENARIO", "CHOICE_STATE_AWS_SCENARIO_JSONATA"], ) def test_choice_aws_docs_scenario( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, template_path + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template_path, ): template = ST.load_sfn_template(template_path) definition = json.dumps(template) exec_input = json.dumps({"type": "Private", "value": 22}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1492,14 +1511,19 @@ def test_choice_aws_docs_scenario( ids=["CHOICE_STATE_SINGLETON_COMPOSITE", "CHOICE_STATE_SINGLETON_COMPOSITE_JSONATA"], ) def test_choice_singleton_composite( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, template_path + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + template_path, ): template = ST.load_sfn_template(template_path) definition = json.dumps(template) exec_input = json.dumps({"type": "Public", "value": 22}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1511,7 +1535,7 @@ def test_map_item_reader_base_list_objects_v2( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1527,8 +1551,12 @@ def test_map_item_reader_base_list_objects_v2( exec_input = json.dumps({"Bucket": bucket_name}) - state_machine_arn = create( - create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition + state_machine_arn = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, ) exec_resp = aws_client.stepfunctions.start_execution( @@ -1575,7 +1603,7 @@ def test_map_item_reader_base_csv_headers_first_line( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1599,8 +1627,8 @@ def test_map_item_reader_base_csv_headers_first_line( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1616,7 +1644,7 @@ def test_map_item_reader_csv_max_items( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, max_items_value, @@ -1636,8 +1664,8 @@ def test_map_item_reader_csv_max_items( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1652,7 +1680,7 @@ def test_map_item_reader_csv_max_items_paths( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, max_items_value, @@ -1677,8 +1705,8 @@ def test_map_item_reader_csv_max_items_paths( exec_input = json.dumps({"Bucket": bucket_name, "Key": key, "MaxItems": max_items_value}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1691,7 +1719,7 @@ def test_map_item_reader_base_json_max_items_jsonata( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1721,8 +1749,8 @@ def test_map_item_reader_base_json_max_items_jsonata( exec_input = json.dumps({"Bucket": bucket_name, "Key": key, "MaxItems": 2}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1737,7 +1765,7 @@ def test_map_item_batching_base_json_max_per_batch_jsonata( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1774,8 +1802,8 @@ def test_map_item_batching_base_json_max_per_batch_jsonata( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1787,7 +1815,7 @@ def test_map_item_reader_base_csv_headers_decl( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1812,8 +1840,8 @@ def test_map_item_reader_base_csv_headers_decl( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1825,7 +1853,7 @@ def test_map_item_reader_csv_headers_decl_duplicate_headers( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1850,8 +1878,8 @@ def test_map_item_reader_csv_headers_decl_duplicate_headers( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1863,7 +1891,7 @@ def test_map_item_reader_csv_headers_first_row_typed_headers( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1886,8 +1914,8 @@ def test_map_item_reader_csv_headers_first_row_typed_headers( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1899,7 +1927,7 @@ def test_map_item_reader_csv_headers_decl_extra_fields( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1924,8 +1952,8 @@ def test_map_item_reader_csv_headers_decl_extra_fields( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1937,7 +1965,7 @@ def test_map_item_reader_csv_first_row_extra_fields( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1955,8 +1983,8 @@ def test_map_item_reader_csv_first_row_extra_fields( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -1968,7 +1996,7 @@ def test_map_item_reader_base_json( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -1998,8 +2026,8 @@ def test_map_item_reader_base_json( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2011,7 +2039,7 @@ def test_map_item_reader_json_no_json_list_object( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2027,8 +2055,8 @@ def test_map_item_reader_json_no_json_list_object( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2040,7 +2068,7 @@ def test_map_item_reader_base_json_max_items( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2061,8 +2089,8 @@ def test_map_item_reader_base_json_max_items( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2074,7 +2102,7 @@ def test_map_item_reader_base_json_max_items( def test_lambda_empty_retry( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -2094,8 +2122,8 @@ def test_lambda_empty_retry( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2107,7 +2135,7 @@ def test_lambda_empty_retry( def test_lambda_invoke_with_retry_base( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -2128,8 +2156,8 @@ def test_lambda_invoke_with_retry_base( exec_input = json.dumps({"Value1": "HelloWorld!", "Value2": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2141,7 +2169,7 @@ def test_lambda_invoke_with_retry_base( def test_lambda_invoke_with_retry_extended_input( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -2173,8 +2201,8 @@ def test_lambda_invoke_with_retry_extended_input( exec_input = json.dumps({"Value1": "HelloWorld!", "Value2": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2186,7 +2214,7 @@ def test_lambda_invoke_with_retry_extended_input( def test_lambda_service_invoke_with_retry_extended_input( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -2217,8 +2245,8 @@ def test_lambda_service_invoke_with_retry_extended_input( {"FunctionName": function_1_name, "Value1": "HelloWorld!", "Value2": None} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2229,7 +2257,7 @@ def test_lambda_service_invoke_with_retry_extended_input( def test_retry_interval_features( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -2249,8 +2277,8 @@ def test_retry_interval_features( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2261,7 +2289,7 @@ def test_retry_interval_features( def test_retry_interval_features_jitter_none( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -2281,8 +2309,8 @@ def test_retry_interval_features_jitter_none( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2293,7 +2321,7 @@ def test_retry_interval_features_jitter_none( def test_retry_interval_features_max_attempts_zero( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -2311,8 +2339,8 @@ def test_retry_interval_features_max_attempts_zero( exec_input = json.dumps({"FunctionName": function_name}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2323,7 +2351,7 @@ def test_retry_interval_features_max_attempts_zero( def test_wait_timestamp( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2332,8 +2360,8 @@ def test_wait_timestamp( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2344,7 +2372,7 @@ def test_wait_timestamp( def test_wait_timestamp_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2353,8 +2381,8 @@ def test_wait_timestamp_path( exec_input = json.dumps({"TimestampValue": "2016-03-14T01:59:00Z"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2365,7 +2393,7 @@ def test_wait_timestamp_path( def test_wait_timestamp_jsonata( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2374,8 +2402,8 @@ def test_wait_timestamp_jsonata( exec_input = json.dumps({"TimestampValue": "2016-03-14T01:59:00Z"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2386,7 +2414,7 @@ def test_wait_timestamp_jsonata( def test_wait_seconds_jsonata( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2395,8 +2423,8 @@ def test_wait_seconds_jsonata( exec_input = json.dumps({"waitSeconds": 0}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2407,7 +2435,7 @@ def test_wait_seconds_jsonata( def test_fail_error_jsonata( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2416,8 +2444,8 @@ def test_fail_error_jsonata( exec_input = json.dumps({"error": "Exception"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -2428,7 +2456,7 @@ def test_fail_error_jsonata( def test_fail_cause_jsonata( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -2437,8 +2465,8 @@ def test_fail_cause_jsonata( exec_input = json.dumps({"cause": "This failed to due an Exception."}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_apigetway_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_apigetway_task_service.py index 295d3dc0c8f0e..ecdff5fa6845d 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_apigetway_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_apigetway_task_service.py @@ -21,7 +21,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -188,7 +187,7 @@ def test_invoke_base( aws_client, create_lambda_function, create_role_with_policy, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_rest_apigw, sfn_snapshot, @@ -215,8 +214,8 @@ def test_invoke_base( {"ApiEndpoint": api_url, "Method": http_method, "Path": part_path, "Stage": api_stage} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -238,7 +237,7 @@ def test_invoke_with_body_post( aws_client, create_lambda_function, create_role_with_policy, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_rest_apigw, sfn_snapshot, @@ -272,8 +271,8 @@ def test_invoke_with_body_post( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -298,7 +297,7 @@ def test_invoke_with_headers( aws_client, create_lambda_function, create_role_with_policy, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_rest_apigw, sfn_snapshot, @@ -333,8 +332,8 @@ def test_invoke_with_headers( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -354,7 +353,7 @@ def test_invoke_with_query_parameters( aws_client, create_lambda_function, create_role_with_policy, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_rest_apigw, sfn_snapshot, @@ -390,8 +389,8 @@ def test_invoke_with_query_parameters( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -412,7 +411,7 @@ def test_invoke_error( aws_client, create_lambda_function, create_role_with_policy, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_rest_apigw, sfn_snapshot, @@ -445,8 +444,8 @@ def test_invoke_error( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_aws_sdk_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_aws_sdk_task_service.py index 8a665c745a68d..f97031483c683 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_aws_sdk_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_aws_sdk_task_service.py @@ -5,8 +5,8 @@ from localstack.testing.pytest import markers from localstack.testing.pytest.stepfunctions.utils import ( - create, create_and_record_execution, + create_state_machine_with_iam_role, ) from localstack.utils.strings import short_uid from tests.aws.services.stepfunctions.templates.base.base_templates import BaseTemplate as BT @@ -17,7 +17,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -27,14 +26,14 @@ class TestTaskServiceAwsSdk: @markers.snapshot.skip_snapshot_verify(paths=["$..SecretList"]) @markers.aws.validated def test_list_secrets( - self, aws_client, create_iam_role_for_sfn, create_state_machine, sfn_snapshot + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot ): template = ST.load_sfn_template(ST.AWSSDK_LIST_SECRETS) definition = json.dumps(template) exec_input = json.dumps(dict()) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -45,7 +44,7 @@ def test_list_secrets( def test_dynamodb_put_get_item( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, snapshot, @@ -66,8 +65,8 @@ def test_dynamodb_put_get_item( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, snapshot, definition, @@ -78,7 +77,7 @@ def test_dynamodb_put_get_item( def test_dynamodb_put_delete_item( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, snapshot, @@ -99,8 +98,8 @@ def test_dynamodb_put_delete_item( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, snapshot, definition, @@ -111,7 +110,7 @@ def test_dynamodb_put_delete_item( def test_dynamodb_put_update_get_item( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, snapshot, @@ -134,8 +133,8 @@ def test_dynamodb_put_update_get_item( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, snapshot, definition, @@ -162,7 +161,7 @@ def test_dynamodb_put_update_get_item( def test_sfn_send_task_outcome_with_no_such_token( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, state_machine_template, @@ -171,8 +170,8 @@ def test_sfn_send_task_outcome_with_no_such_token( exec_input = json.dumps({"TaskToken": "NoSuchTaskToken"}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -183,14 +182,15 @@ def test_sfn_send_task_outcome_with_no_such_token( def test_sfn_start_execution( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): template_target = BT.load_sfn_template(BT.BASE_RAISE_FAILURE) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -203,8 +203,8 @@ def test_sfn_start_execution( {"StateMachineArn": state_machine_arn_target, "Input": None, "Name": "TestStartTarget"} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -215,7 +215,7 @@ def test_sfn_start_execution( def test_sfn_start_execution_implicit_json_serialisation( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -229,8 +229,9 @@ def test_sfn_start_execution_implicit_json_serialisation( template_target = BT.load_sfn_template(BT.BASE_PASS_RESULT) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -244,8 +245,8 @@ def test_sfn_start_execution_implicit_json_serialisation( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -262,7 +263,7 @@ def test_s3_get_object( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, file_body, @@ -278,8 +279,8 @@ def test_s3_get_object( exec_input = json.dumps({"Bucket": bucket_name, "Key": file_key}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -304,7 +305,7 @@ def test_s3_put_object( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, body, @@ -317,8 +318,8 @@ def test_s3_put_object( exec_input = json.dumps({"Bucket": bucket_name, "Key": "file-key", "Body": body}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_dynamodb_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_dynamodb_task_service.py index 8ab533dd29fd7..67c167a2a10e7 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_dynamodb_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_dynamodb_task_service.py @@ -12,7 +12,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -23,7 +22,7 @@ class TestTaskServiceDynamoDB: def test_put_get_item( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, sfn_snapshot, @@ -44,8 +43,8 @@ def test_put_get_item( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -56,7 +55,7 @@ def test_put_get_item( def test_put_delete_item( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, sfn_snapshot, @@ -77,8 +76,8 @@ def test_put_delete_item( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -89,7 +88,7 @@ def test_put_delete_item( def test_put_update_get_item( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, dynamodb_create_table, sfn_snapshot, @@ -112,8 +111,8 @@ def test_put_update_get_item( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_ecs_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_ecs_task_service.py index 1efb9b363ea14..94cd574279739 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_ecs_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_ecs_task_service.py @@ -273,7 +273,7 @@ def test_run_task(self, aws_client, infrastructure_test_run_task, sfn_ecs_snapsh sfn_ecs_snapshot.add_transformer(RegexTransformer(state_machine_arn, "state_machine_arn")) launch_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, + target_aws_client=aws_client, sfn_snapshot=sfn_ecs_snapshot, state_machine_arn=state_machine_arn, execution_input=json.dumps({}), @@ -313,7 +313,7 @@ def test_run_task_raise_failure( sfn_ecs_snapshot.add_transformer(RegexTransformer(state_machine_arn, "state_machine_arn")) launch_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, + target_aws_client=aws_client, sfn_snapshot=sfn_ecs_snapshot, state_machine_arn=state_machine_arn, execution_input=json.dumps({}), @@ -350,7 +350,7 @@ def test_run_task_sync(self, aws_client, infrastructure_test_run_task_sync, sfn_ sfn_ecs_snapshot.add_transformer(RegexTransformer(state_machine_arn, "state_machine_arn")) launch_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, + target_aws_client=aws_client, sfn_snapshot=sfn_ecs_snapshot, state_machine_arn=state_machine_arn, execution_input=json.dumps({}), @@ -390,7 +390,7 @@ def test_run_task_sync_raise_failure( sfn_ecs_snapshot.add_transformer(RegexTransformer(state_machine_arn, "state_machine_arn")) launch_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, + target_aws_client=aws_client, sfn_snapshot=sfn_ecs_snapshot, state_machine_arn=state_machine_arn, execution_input=json.dumps({}), diff --git a/tests/aws/services/stepfunctions/v2/services/test_events_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_events_task_service.py index 1a8a252d3d50f..14424fd3f5bd1 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_events_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_events_task_service.py @@ -15,7 +15,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -25,7 +24,7 @@ class TestTaskServiceEvents: @markers.aws.validated def test_put_events_base( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, events_to_sqs_queue, aws_client, @@ -60,8 +59,8 @@ def test_put_events_base( ] exec_input = json.dumps({"Entries": entries}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -72,7 +71,7 @@ def test_put_events_base( @markers.aws.validated def test_put_events_malformed_detail( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, events_to_sqs_queue, aws_client, @@ -96,8 +95,8 @@ def test_put_events_malformed_detail( ] exec_input = json.dumps({"Entries": entries}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -107,7 +106,7 @@ def test_put_events_malformed_detail( @markers.aws.validated def test_put_events_no_source( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, events_to_sqs_queue, aws_client, @@ -135,8 +134,8 @@ def test_put_events_no_source( ] exec_input = json.dumps({"Entries": entries}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -147,7 +146,7 @@ def test_put_events_no_source( @markers.aws.validated def test_put_events_mixed_malformed_detail( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, events_to_sqs_queue, aws_client, @@ -176,8 +175,8 @@ def test_put_events_mixed_malformed_detail( ] exec_input = json.dumps({"Entries": entries}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_lambda_task.py b/tests/aws/services/stepfunctions/v2/services/test_lambda_task.py index fbc9c50673391..35b5f36847af6 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_lambda_task.py +++ b/tests/aws/services/stepfunctions/v2/services/test_lambda_task.py @@ -14,13 +14,12 @@ ) -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestTaskLambda: @markers.aws.validated def test_invoke_bytes_payload( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -41,8 +40,8 @@ def test_invoke_bytes_payload( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -53,7 +52,7 @@ def test_invoke_bytes_payload( def test_invoke_string_payload( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -74,8 +73,8 @@ def test_invoke_string_payload( exec_input = json.dumps("HelloWorld") create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -98,7 +97,7 @@ def test_invoke_string_payload( def test_invoke_json_values( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -120,8 +119,8 @@ def test_invoke_json_values( exec_input = json.dumps(json_value) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -132,7 +131,7 @@ def test_invoke_json_values( def test_invoke_pipe( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -164,8 +163,8 @@ def test_invoke_pipe( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -176,7 +175,7 @@ def test_invoke_pipe( def test_lambda_task_filter_parameters_input( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -196,8 +195,8 @@ def test_lambda_task_filter_parameters_input( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_lambda_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_lambda_task_service.py index 74760d03e350e..cc5441556e49f 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_lambda_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_lambda_task_service.py @@ -17,7 +17,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -28,7 +27,7 @@ class TestTaskServiceLambda: def test_invoke( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -46,8 +45,8 @@ def test_invoke( exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -58,7 +57,7 @@ def test_invoke( def test_invoke_bytes_payload( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -78,8 +77,8 @@ def test_invoke_bytes_payload( {"FunctionName": function_name, "Payload": json.dumps("'{'Hello':'World'}'")} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -91,7 +90,7 @@ def test_invoke_bytes_payload( def test_invoke_unsupported_param( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -114,8 +113,8 @@ def test_invoke_unsupported_param( {"FunctionName": function_name, "Payload": None, "LogType": LogType.Tail} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -138,7 +137,7 @@ def test_invoke_unsupported_param( def test_invoke_json_values( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -160,8 +159,8 @@ def test_invoke_json_values( exec_input = json.dumps({"FunctionName": function_name, "Payload": json.dumps(json_value)}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -176,7 +175,7 @@ def test_invoke_json_values( def test_list_functions( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -185,8 +184,8 @@ def test_list_functions( exec_input = json.dumps({}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_sfn_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_sfn_task_service.py index d079cac07e162..d63de14c1bb96 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_sfn_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_sfn_task_service.py @@ -4,8 +4,8 @@ from localstack.testing.pytest import markers from localstack.testing.pytest.stepfunctions.utils import ( - create, create_and_record_execution, + create_state_machine_with_iam_role, ) from tests.aws.services.stepfunctions.templates.base.base_templates import BaseTemplate as BT from tests.aws.services.stepfunctions.templates.services.services_templates import ( @@ -15,7 +15,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -26,7 +25,7 @@ class TestTaskServiceSfn: def test_start_execution( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -40,8 +39,9 @@ def test_start_execution( template_target = BT.load_sfn_template(BT.BASE_PASS_RESULT) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -54,8 +54,8 @@ def test_start_execution( {"StateMachineArn": state_machine_arn_target, "Input": None, "Name": "TestStartTarget"} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -66,7 +66,7 @@ def test_start_execution( def test_start_execution_input_json( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -80,8 +80,9 @@ def test_start_execution_input_json( template_target = BT.load_sfn_template(BT.BASE_PASS_RESULT) definition_target = json.dumps(template_target) - state_machine_arn_target = create( - create_iam_role_for_sfn, + state_machine_arn_target = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition_target, @@ -98,8 +99,8 @@ def test_start_execution_input_json( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_sns_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_sns_task_service.py index 5e133b06e296d..1e9aa553bcfd5 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_sns_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_sns_task_service.py @@ -17,7 +17,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -47,7 +46,7 @@ class TestTaskServiceSns: def test_fifo_message_attribute( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, input_params, fail_template, @@ -68,8 +67,8 @@ def test_fifo_message_attribute( exec_input = json.dumps(input_params) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -83,7 +82,7 @@ def test_fifo_message_attribute( def test_publish_base( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sns_create_topic, sfn_snapshot, @@ -99,8 +98,8 @@ def test_publish_base( exec_input = json.dumps({"TopicArn": topic_arn, "Message": {"Message": "HelloWorld!"}}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -114,7 +113,7 @@ def test_publish_base( def test_publish_message_attributes( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_receive_num_messages, @@ -163,8 +162,8 @@ def record_messages(): } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -177,7 +176,7 @@ def record_messages(): def test_publish_base_error_topic_arn( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sns_create_topic, sfn_snapshot, @@ -193,8 +192,8 @@ def test_publish_base_error_topic_arn( exec_input = json.dumps({"TopicArn": topic_arn, "Message": {"Message": "HelloWorld!"}}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/services/test_sqs_task_service.py b/tests/aws/services/stepfunctions/v2/services/test_sqs_task_service.py index 64decf44dfd9a..9b308d858c266 100644 --- a/tests/aws/services/stepfunctions/v2/services/test_sqs_task_service.py +++ b/tests/aws/services/stepfunctions/v2/services/test_sqs_task_service.py @@ -15,7 +15,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", # TODO: add support for Sdk Http metadata. "$..SdkHttpMetadata", "$..SdkResponseMetadata", @@ -29,7 +28,7 @@ class TestTaskServiceSqs: def test_send_message( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, @@ -47,8 +46,8 @@ def test_send_message( message_body = "test_message_body" exec_input = json.dumps({"QueueUrl": queue_url, "MessageBody": message_body}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -63,7 +62,7 @@ def test_send_message( def test_send_message_unsupported_parameters( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, @@ -88,8 +87,8 @@ def test_send_message_unsupported_parameters( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -100,7 +99,7 @@ def test_send_message_unsupported_parameters( def test_send_message_attributes( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, @@ -128,8 +127,8 @@ def test_send_message_attributes( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/states_variables/test_error_output.py b/tests/aws/services/stepfunctions/v2/states_variables/test_error_output.py index 52fba1ccb1a5a..d109a71965896 100644 --- a/tests/aws/services/stepfunctions/v2/states_variables/test_error_output.py +++ b/tests/aws/services/stepfunctions/v2/states_variables/test_error_output.py @@ -40,7 +40,7 @@ class TestStateVariablesTemplate: def test_task_catch_error_output( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -64,8 +64,8 @@ def test_task_catch_error_output( ) exec_input = json.dumps({"inputData": "dummy"}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -87,7 +87,7 @@ def test_task_catch_error_output( def test_catch_error_variable_sampling( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -111,8 +111,8 @@ def test_catch_error_variable_sampling( ) exec_input = json.dumps({"inputData": "dummy"}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -134,7 +134,7 @@ def test_catch_error_variable_sampling( def test_task_catch_error_with_retry( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -158,8 +158,8 @@ def test_task_catch_error_with_retry( ) exec_input = json.dumps({"inputData": "dummy"}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -184,7 +184,7 @@ def test_task_catch_error_with_retry( def test_map_catch_error( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -208,8 +208,8 @@ def test_map_catch_error( ) exec_input = json.dumps({"items": [1, 2, 3]}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, @@ -234,7 +234,7 @@ def test_map_catch_error( def test_parallel_catch_error( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, create_lambda_function, @@ -259,8 +259,8 @@ def test_parallel_catch_error( ) exec_input = json.dumps({"inputData": "dummy"}) create_and_record_execution( - stepfunctions_client=aws_client.stepfunctions, - create_iam_role_for_sfn=create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role=create_state_machine_iam_role, create_state_machine=create_state_machine, sfn_snapshot=sfn_snapshot, definition=definition, diff --git a/tests/aws/services/stepfunctions/v2/test_sfn_api.py b/tests/aws/services/stepfunctions/v2/test_sfn_api.py index 3c2a05154e0b7..285ea25db3042 100644 --- a/tests/aws/services/stepfunctions/v2/test_sfn_api.py +++ b/tests/aws/services/stepfunctions/v2/test_sfn_api.py @@ -33,7 +33,7 @@ class TestSnfApi: @markers.aws.validated def test_create_delete_valid_sm( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_lambda_function, create_state_machine, sfn_snapshot, @@ -46,7 +46,7 @@ def test_create_delete_valid_sm( ) lambda_arn_1 = create_lambda_1["CreateFunctionResponse"]["FunctionArn"] - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_TASK_SEQ_2) @@ -56,7 +56,7 @@ def test_create_delete_valid_sm( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -77,9 +77,9 @@ def test_create_delete_valid_sm( ) @markers.aws.validated def test_create_delete_invalid_sm( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_INVALID_DER) @@ -88,14 +88,16 @@ def test_create_delete_invalid_sm( sm_name = f"statemachine_{short_uid()}" with pytest.raises(Exception) as resource_not_found: - create_state_machine(name=sm_name, definition=definition_str, roleArn=snf_role_arn) + create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn + ) sfn_snapshot.match("invalid_definition_1", resource_not_found.value.response) @markers.aws.validated def test_delete_nonexistent_sm( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -103,7 +105,7 @@ def test_delete_nonexistent_sm( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn: str = creation_resp_1["stateMachineArn"] @@ -117,9 +119,9 @@ def test_delete_nonexistent_sm( @markers.aws.validated def test_describe_nonexistent_sm( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -127,7 +129,7 @@ def test_describe_nonexistent_sm( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn: str = creation_resp_1["stateMachineArn"] @@ -141,9 +143,9 @@ def test_describe_nonexistent_sm( @markers.aws.validated def test_describe_sm_arn_containing_punctuation( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -153,7 +155,7 @@ def test_describe_sm_arn_containing_punctuation( sm_name = f"state.machine_{short_uid()}" creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -174,9 +176,9 @@ def test_describe_invalid_arn_sm(self, sfn_snapshot, aws_client): @markers.aws.validated def test_create_exact_duplicate_sm( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -184,7 +186,7 @@ def test_create_exact_duplicate_sm( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -196,7 +198,7 @@ def test_create_exact_duplicate_sm( sfn_snapshot.match("describe_resp_1", describe_resp_1) creation_resp_2 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_2, 1)) sfn_snapshot.match("creation_resp_2", creation_resp_2) @@ -214,9 +216,9 @@ def test_create_exact_duplicate_sm( @markers.aws.validated def test_create_duplicate_definition_format_sm( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -224,7 +226,7 @@ def test_create_duplicate_definition_format_sm( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -237,14 +239,16 @@ def test_create_duplicate_definition_format_sm( definition_str_2 = json.dumps(definition, indent=4) with pytest.raises(Exception) as resource_not_found: - create_state_machine(name=sm_name, definition=definition_str_2, roleArn=snf_role_arn) + create_state_machine( + aws_client, name=sm_name, definition=definition_str_2, roleArn=snf_role_arn + ) sfn_snapshot.match("already_exists_1", resource_not_found.value.response) @markers.aws.validated def test_create_duplicate_sm_name( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition_1 = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -252,7 +256,7 @@ def test_create_duplicate_sm_name( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str_1, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str_1, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -268,14 +272,16 @@ def test_create_duplicate_sm_name( definition_str_2 = json.dumps(definition_2) with pytest.raises(Exception) as resource_not_found: - create_state_machine(name=sm_name, definition=definition_str_2, roleArn=snf_role_arn) + create_state_machine( + aws_client, name=sm_name, definition=definition_str_2, roleArn=snf_role_arn + ) sfn_snapshot.match("already_exists_1", resource_not_found.value.response) @markers.aws.needs_fixing def test_list_sms( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -290,6 +296,7 @@ def test_list_sms( for i, sm_name in enumerate(sm_names): creation_resp = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, @@ -323,9 +330,9 @@ def test_list_sms( @markers.aws.validated def test_list_sms_pagination( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) @@ -337,6 +344,7 @@ def test_list_sms_pagination( for i, sm_name in enumerate(sm_names): creation_resp = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, @@ -421,7 +429,7 @@ def _verify_paginate_results() -> list: @markers.aws.validated def test_start_execution_idempotent( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_send_task_success_state_machine, sqs_create_queue, @@ -442,7 +450,7 @@ def test_start_execution_idempotent( sfn_snapshot.add_transformer(RegexTransformer(queue_url, "")) sfn_snapshot.add_transformer(RegexTransformer(queue_name, "")) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -452,7 +460,7 @@ def test_start_execution_idempotent( definition = json.dumps(template) creation_resp = create_state_machine( - name=sm_name, definition=definition, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -501,9 +509,9 @@ def test_start_execution_idempotent( @markers.aws.validated @markers.snapshot.skip_snapshot_verify(paths=["$..redriveCount"]) def test_start_execution( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -511,7 +519,7 @@ def test_start_execution( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -534,9 +542,9 @@ def test_start_execution( @markers.aws.validated def test_list_execution_no_such_state_machine( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -544,7 +552,7 @@ def test_list_execution_no_such_state_machine( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn: str = creation_resp_1["stateMachineArn"] @@ -570,9 +578,9 @@ def test_list_execution_invalid_arn(self, sfn_snapshot, aws_client): @markers.aws.validated @markers.snapshot.skip_snapshot_verify(paths=["$..exception_value", "$..redriveCount"]) def test_list_executions_pagination( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) @@ -582,7 +590,7 @@ def test_list_executions_pagination( sm_name = f"statemachine_{short_uid()}" creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) @@ -671,9 +679,9 @@ def test_list_executions_pagination( @markers.aws.validated @markers.snapshot.skip_snapshot_verify(paths=["$..exception_value", "$..redriveCount"]) def test_list_executions_versions_pagination( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) @@ -683,7 +691,7 @@ def test_list_executions_versions_pagination( sm_name = f"statemachine_{short_uid()}" creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) @@ -774,9 +782,9 @@ def test_list_executions_versions_pagination( @markers.aws.validated def test_get_execution_history_reversed( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -784,7 +792,7 @@ def test_get_execution_history_reversed( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] @@ -804,9 +812,9 @@ def test_get_execution_history_reversed( @markers.aws.validated def test_invalid_start_execution_arn( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -814,7 +822,7 @@ def test_invalid_start_execution_arn( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -832,9 +840,9 @@ def test_invalid_start_execution_arn( @markers.snapshot.skip_snapshot_verify(paths=["$..Error.Message", "$..message"]) @markers.aws.validated def test_invalid_start_execution_input( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -842,7 +850,7 @@ def test_invalid_start_execution_input( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -884,9 +892,9 @@ def test_invalid_start_execution_input( @markers.aws.validated def test_stop_execution( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -894,7 +902,7 @@ def test_stop_execution( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -932,9 +940,9 @@ def _check_stated_entered(events: HistoryEventList) -> bool: @markers.aws.validated def test_create_update_state_machine_base_definition( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition_t0 = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -942,7 +950,7 @@ def test_create_update_state_machine_base_definition( sm_name = f"statemachine_{short_uid()}" creation_resp_t0 = create_state_machine( - name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_t0, 0)) sfn_snapshot.match("creation_resp_t0", creation_resp_t0) @@ -983,9 +991,9 @@ def test_create_update_state_machine_base_definition( @markers.aws.validated def test_create_update_state_machine_base_role_arn( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn_t0 = create_iam_role_for_sfn() + snf_role_arn_t0 = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn_t0, "snf_role_arn_t0")) definition_t0 = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -993,7 +1001,7 @@ def test_create_update_state_machine_base_role_arn( sm_name = f"statemachine_{short_uid()}" creation_resp_t0 = create_state_machine( - name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn_t0 + aws_client, name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn_t0 ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_t0, 0)) sfn_snapshot.match("creation_resp_t0", creation_resp_t0) @@ -1004,7 +1012,7 @@ def test_create_update_state_machine_base_role_arn( ) sfn_snapshot.match("describe_resp_t0", describe_resp_t0) - snf_role_arn_t1 = create_iam_role_for_sfn() + snf_role_arn_t1 = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn_t1, "snf_role_arn_t1")) update_state_machine_res_t1 = aws_client.stepfunctions.update_state_machine( @@ -1017,7 +1025,7 @@ def test_create_update_state_machine_base_role_arn( ) sfn_snapshot.match("describe_resp_t1", describe_resp_t1) - snf_role_arn_t2 = create_iam_role_for_sfn() + snf_role_arn_t2 = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn_t2, "snf_role_arn_t2")) update_state_machine_res_t2 = aws_client.stepfunctions.update_state_machine( @@ -1032,9 +1040,9 @@ def test_create_update_state_machine_base_role_arn( @markers.aws.validated def test_create_update_state_machine_base_definition_and_role( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition_t0 = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -1042,7 +1050,7 @@ def test_create_update_state_machine_base_definition_and_role( sm_name = f"statemachine_{short_uid()}" creation_resp_t0 = create_state_machine( - name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_t0, 0)) sfn_snapshot.match("creation_resp_t0", creation_resp_t0) @@ -1057,7 +1065,7 @@ def test_create_update_state_machine_base_definition_and_role( definition_t1["States"]["State_1"]["Result"].update({"Arg1": "AfterUpdate1"}) definition_str_t1 = json.dumps(definition_t1) - snf_role_arn_t1 = create_iam_role_for_sfn() + snf_role_arn_t1 = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn_t1, "snf_role_arn_t1")) update_state_machine_res_t1 = aws_client.stepfunctions.update_state_machine( @@ -1074,7 +1082,7 @@ def test_create_update_state_machine_base_definition_and_role( definition_t2["States"]["State_1"]["Result"].update({"Arg1": "AfterUpdate2"}) definition_str_t2 = json.dumps(definition_t2) - snf_role_arn_t2 = create_iam_role_for_sfn() + snf_role_arn_t2 = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn_t2, "snf_role_arn_t2")) update_state_machine_res_t2 = aws_client.stepfunctions.update_state_machine( @@ -1089,9 +1097,9 @@ def test_create_update_state_machine_base_definition_and_role( @markers.aws.validated def test_create_update_state_machine_base_update_none( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition_t0 = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -1099,7 +1107,7 @@ def test_create_update_state_machine_base_update_none( sm_name = f"statemachine_{short_uid()}" creation_resp_t0 = create_state_machine( - name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_t0, 0)) sfn_snapshot.match("creation_resp_t0", creation_resp_t0) @@ -1122,9 +1130,9 @@ def test_create_update_state_machine_base_update_none( @markers.aws.validated def test_create_update_state_machine_same_parameters( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn_t0 = create_iam_role_for_sfn() + snf_role_arn_t0 = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn_t0, "snf_role_arn_t0")) definition_t0 = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -1132,7 +1140,7 @@ def test_create_update_state_machine_same_parameters( sm_name = f"statemachine_{short_uid()}" creation_resp_t0 = create_state_machine( - name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn_t0 + aws_client, name=sm_name, definition=definition_str_t0, roleArn=snf_role_arn_t0 ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_t0, 0)) sfn_snapshot.match("creation_resp_t0", creation_resp_t0) @@ -1143,7 +1151,7 @@ def test_create_update_state_machine_same_parameters( ) sfn_snapshot.match("describe_resp_t0", describe_resp_t0) - snf_role_arn_t1 = create_iam_role_for_sfn() + snf_role_arn_t1 = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn_t1, "snf_role_arn_t1")) update_state_machine_res_t1 = aws_client.stepfunctions.update_state_machine( @@ -1168,9 +1176,9 @@ def test_create_update_state_machine_same_parameters( @markers.aws.validated def test_describe_state_machine_for_execution( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -1178,7 +1186,7 @@ def test_describe_state_machine_for_execution( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -1202,12 +1210,12 @@ def test_describe_state_machine_for_execution( @pytest.mark.parametrize("encoder_function", [json.dumps, yaml.dump]) def test_cloudformation_definition_create_describe( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, sfn_snapshot, aws_client, encoder_function, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) state_machine_name = f"statemachine{short_uid()}" @@ -1260,12 +1268,12 @@ def test_cloudformation_definition_create_describe( @pytest.mark.parametrize("encoder_function", [json.dumps, yaml.dump]) def test_cloudformation_definition_string_create_describe( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, sfn_snapshot, aws_client, encoder_function, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) state_machine_name = f"statemachine{short_uid()}" @@ -1320,9 +1328,9 @@ def test_cloudformation_definition_string_create_describe( paths=["$..redriveCount", "$..redriveStatus", "$..redriveStatusReason"] ) def test_describe_execution( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -1330,7 +1338,7 @@ def test_describe_execution( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -1350,9 +1358,9 @@ def test_describe_execution( @markers.aws.validated def test_describe_execution_no_such_state_machine( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -1360,7 +1368,7 @@ def test_describe_execution_no_such_state_machine( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn = creation_resp["stateMachineArn"] @@ -1397,9 +1405,9 @@ def test_describe_execution_invalid_arn(self, sfn_snapshot, aws_client): paths=["$..redriveCount", "$..redriveStatus", "$..redriveStatusReason"] ) def test_describe_execution_arn_containing_punctuation( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"state.machine_{short_uid()}" @@ -1407,7 +1415,7 @@ def test_describe_execution_arn_containing_punctuation( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -1430,9 +1438,9 @@ def test_describe_execution_arn_containing_punctuation( @markers.aws.needs_fixing def test_get_execution_history_no_such_execution( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name: str = f"statemachine_{short_uid()}" @@ -1440,7 +1448,7 @@ def test_get_execution_history_no_such_execution( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn = creation_resp["stateMachineArn"] @@ -1470,9 +1478,9 @@ def test_get_execution_history_invalid_arn(self, sfn_snapshot, aws_client): @markers.snapshot.skip_snapshot_verify(paths=["$..redriveCount"]) @markers.aws.validated def test_state_machine_status_filter( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) sm_name = f"statemachine_{short_uid()}" @@ -1480,7 +1488,7 @@ def test_state_machine_status_filter( definition_str = json.dumps(definition) creation_resp = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) sfn_snapshot.match("creation_resp", creation_resp) @@ -1522,14 +1530,14 @@ def test_state_machine_status_filter( @markers.aws.validated def test_start_sync_execution( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sfn_snapshot, aws_client, - stepfunctions_client_sync_executions, + aws_client_no_sync_prefix, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) queue_url = sqs_create_queue(QueueName=f"queue-{short_uid()}") @@ -1539,6 +1547,7 @@ def test_start_sync_execution( definition_str = json.dumps(definition) creation_response = create_state_machine( + aws_client, name=f"statemachine_{short_uid()}", definition=definition_str, roleArn=snf_role_arn, @@ -1549,7 +1558,7 @@ def test_start_sync_execution( sfn_snapshot.match("creation_response", creation_response) with pytest.raises(Exception) as ex: - stepfunctions_client_sync_executions.start_sync_execution( + aws_client_no_sync_prefix.stepfunctions.start_sync_execution( stateMachineArn=state_machine_arn, input=json.dumps({}), name="SyncExecution" ) sfn_snapshot.match("start_sync_execution_error", ex.value.response) diff --git a/tests/aws/services/stepfunctions/v2/test_sfn_api_express.py b/tests/aws/services/stepfunctions/v2/test_sfn_api_express.py index 0f8c5962420c3..9db90757eff92 100644 --- a/tests/aws/services/stepfunctions/v2/test_sfn_api_express.py +++ b/tests/aws/services/stepfunctions/v2/test_sfn_api_express.py @@ -33,18 +33,19 @@ class TestSfnApiExpress: @markers.aws.validated def test_create_describe_delete( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) definition_str = json.dumps(definition) creation_response = create_state_machine( + aws_client, name=f"statemachine_{short_uid()}", definition=definition_str, roleArn=snf_role_arn, @@ -67,7 +68,7 @@ def test_create_describe_delete( @markers.aws.validated def test_start_async_describe_history_execution( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -78,7 +79,7 @@ def test_start_async_describe_history_execution( execution_input = json.dumps(dict()) state_machine_arn, execution_arn = create_and_record_express_async_execution( aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -105,18 +106,18 @@ def test_start_async_describe_history_execution( @markers.aws.validated def test_start_sync_execution( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, - stepfunctions_client_sync_executions, + aws_client_no_sync_prefix, ): template = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) definition = json.dumps(template) exec_input = json.dumps({}) create_and_record_express_sync_execution( - stepfunctions_client_sync_executions, - create_iam_role_for_sfn, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -136,12 +137,12 @@ def test_start_sync_execution( def test_illegal_callbacks( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, template, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "sfn_role_arn")) template = CallbackTemplates.load_sfn_template(template) @@ -149,6 +150,7 @@ def test_illegal_callbacks( with pytest.raises(Exception) as ex: create_state_machine( + aws_client, name=f"express_statemachine_{short_uid()}", definition=definition, roleArn=snf_role_arn, @@ -161,13 +163,13 @@ def test_illegal_callbacks( def test_illegal_activity_task( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_activity, sfn_activity_consumer, sfn_snapshot, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "sfn_role_arn")) activity_name = f"activity-{short_uid()}" @@ -183,6 +185,7 @@ def test_illegal_activity_task( with pytest.raises(Exception) as ex: create_state_machine( + aws_client, name=f"express_statemachine_{short_uid()}", definition=definition, roleArn=snf_role_arn, diff --git a/tests/aws/services/stepfunctions/v2/test_sfn_api_logs.py b/tests/aws/services/stepfunctions/v2/test_sfn_api_logs.py index befd26e1be25b..b8838b85632fa 100644 --- a/tests/aws/services/stepfunctions/v2/test_sfn_api_logs.py +++ b/tests/aws/services/stepfunctions/v2/test_sfn_api_logs.py @@ -13,7 +13,7 @@ LogLevel, ) from localstack.testing.pytest import markers -from localstack.testing.pytest.stepfunctions.utils import create +from localstack.testing.pytest.stepfunctions.utils import create_state_machine_with_iam_role from localstack.utils.strings import short_uid from localstack.utils.sync import poll_condition from tests.aws.services.stepfunctions.templates.base.base_templates import BaseTemplate @@ -43,7 +43,7 @@ class TestSnfApiLogs: @pytest.mark.parametrize("logging_level,include_execution_data", _TEST_LOGGING_CONFIGURATIONS) def test_logging_configuration( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -65,7 +65,7 @@ def test_logging_configuration( ], ) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -73,6 +73,7 @@ def test_logging_configuration( sm_name = f"statemachine_{short_uid()}" creation_resp = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, @@ -91,14 +92,14 @@ def test_logging_configuration( @pytest.mark.parametrize("logging_configuration", _TEST_INCOMPLETE_LOGGING_CONFIGURATIONS) def test_incomplete_logging_configuration( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, aws_client, logging_configuration, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -106,6 +107,7 @@ def test_incomplete_logging_configuration( sm_name = f"statemachine_{short_uid()}" creation_resp = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, @@ -124,7 +126,7 @@ def test_incomplete_logging_configuration( @pytest.mark.parametrize("logging_configuration", _TEST_INVALID_LOGGING_CONFIGURATIONS) def test_invalid_logging_configuration( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -132,7 +134,7 @@ def test_invalid_logging_configuration( aws_client_factory, logging_configuration, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) template = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -157,7 +159,7 @@ def test_invalid_logging_configuration( @markers.aws.validated def test_deleted_log_group( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -185,15 +187,16 @@ def _log_group_is_deleted() -> bool: assert poll_condition(condition=_log_group_is_deleted) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) template = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) definition = json.dumps(template) with pytest.raises(ClientError) as exc: - create( - create_iam_role_for_sfn, + create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -206,7 +209,7 @@ def _log_group_is_deleted() -> bool: @markers.aws.validated def test_multiple_destinations( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -228,8 +231,9 @@ def test_multiple_destinations( definition = json.dumps(template) with pytest.raises(ClientError) as exc: - create( - create_iam_role_for_sfn, + create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -242,7 +246,7 @@ def test_multiple_destinations( @markers.aws.validated def test_update_logging_configuration( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_create_log_group, sfn_snapshot, @@ -267,7 +271,7 @@ def test_update_logging_configuration( ], ) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -275,6 +279,7 @@ def test_update_logging_configuration( sm_name = f"statemachine_{short_uid()}" creation_resp = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, diff --git a/tests/aws/services/stepfunctions/v2/test_sfn_api_map_run.py b/tests/aws/services/stepfunctions/v2/test_sfn_api_map_run.py index 40f9bd0b78209..33a388c258f46 100644 --- a/tests/aws/services/stepfunctions/v2/test_sfn_api_map_run.py +++ b/tests/aws/services/stepfunctions/v2/test_sfn_api_map_run.py @@ -7,21 +7,20 @@ from localstack.testing.pytest import markers from localstack.testing.pytest.stepfunctions.utils import ( await_execution_terminated, - create, + create_state_machine_with_iam_role, ) from tests.aws.services.stepfunctions.templates.scenarios.scenarios_templates import ( ScenariosTemplate as ST, ) -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestSnfApiMapRun: @markers.aws.validated def test_list_map_runs_and_describe_map_run( self, aws_client, s3_create_bucket, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): @@ -48,8 +47,12 @@ def test_list_map_runs_and_describe_map_run( exec_input = json.dumps({"Bucket": bucket_name, "Key": key}) - state_machine_arn = create( - create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition + state_machine_arn = create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, ) exec_resp = aws_client.stepfunctions.start_execution( @@ -82,34 +85,57 @@ def test_list_map_runs_and_describe_map_run( + [chr(i) for i in chain(range(0x00, 0x20), range(0x7F, 0xA0))], ) def test_map_state_label_invalid_char_fail( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, invalid_char + self, + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + invalid_char, ): template = ST.load_sfn_template(ST.MAP_STATE_LABEL_INVALID_CHAR_FAIL) template["States"]["MapState"]["Label"] = f"label_{invalid_char}" definition = json.dumps(template) with pytest.raises(Exception) as err: - create(create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition) + create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, + ) sfn_snapshot.match("map_state_label_invalid_char_fail", err.value.response) @markers.aws.validated def test_map_state_label_empty_fail( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot ): template = ST.load_sfn_template(ST.MAP_STATE_LABEL_EMPTY_FAIL) definition = json.dumps(template) with pytest.raises(Exception) as err: - create(create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition) + create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, + ) sfn_snapshot.match("map_state_label_empty_fail", err.value.response) @markers.aws.validated def test_map_state_label_too_long_fail( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot + self, aws_client, create_state_machine_iam_role, create_state_machine, sfn_snapshot ): template = ST.load_sfn_template(ST.MAP_STATE_LABEL_TOO_LONG_FAIL) definition = json.dumps(template) with pytest.raises(Exception) as err: - create(create_iam_role_for_sfn, create_state_machine, sfn_snapshot, definition) + create_state_machine_with_iam_role( + aws_client, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + definition, + ) sfn_snapshot.match("map_state_label_too_long_fail", err.value.response) diff --git a/tests/aws/services/stepfunctions/v2/test_sfn_api_tagging.py b/tests/aws/services/stepfunctions/v2/test_sfn_api_tagging.py index 10ef36522675f..5a7a80956d3d9 100644 --- a/tests/aws/services/stepfunctions/v2/test_sfn_api_tagging.py +++ b/tests/aws/services/stepfunctions/v2/test_sfn_api_tagging.py @@ -9,7 +9,6 @@ from tests.aws.services.stepfunctions.templates.base.base_templates import BaseTemplate -@markers.snapshot.skip_snapshot_verify(paths=["$..tracingConfiguration"]) class TestSnfApiTagging: @markers.aws.validated @pytest.mark.parametrize( @@ -23,9 +22,14 @@ class TestSnfApiTagging: ], ) def test_tag_state_machine( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client, tag_list + self, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + aws_client, + tag_list, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -33,7 +37,7 @@ def test_tag_state_machine( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn = creation_resp_1["stateMachineArn"] sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) @@ -60,9 +64,14 @@ def test_tag_state_machine( ], ) def test_tag_invalid_state_machine( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client, tag_list + self, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + aws_client, + tag_list, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -70,7 +79,7 @@ def test_tag_invalid_state_machine( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn = creation_resp_1["stateMachineArn"] sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) @@ -83,12 +92,12 @@ def test_tag_invalid_state_machine( @markers.aws.validated def test_tag_state_machine_version( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -96,7 +105,7 @@ def test_tag_state_machine_version( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn = creation_resp_1["stateMachineArn"] sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) @@ -125,9 +134,14 @@ def test_tag_state_machine_version( ], ) def test_untag_state_machine( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client, tag_keys + self, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + aws_client, + tag_keys, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -135,7 +149,7 @@ def test_untag_state_machine( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn = creation_resp_1["stateMachineArn"] sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) @@ -158,9 +172,9 @@ def test_untag_state_machine( @markers.aws.validated def test_create_state_machine( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -168,6 +182,7 @@ def test_create_state_machine( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, diff --git a/tests/aws/services/stepfunctions/v2/test_sfn_api_variable_references.py b/tests/aws/services/stepfunctions/v2/test_sfn_api_variable_references.py index f440867259341..d9b87eba5151d 100644 --- a/tests/aws/services/stepfunctions/v2/test_sfn_api_variable_references.py +++ b/tests/aws/services/stepfunctions/v2/test_sfn_api_variable_references.py @@ -76,17 +76,22 @@ class TestSfnApiVariableReferences: ], ) def test_base_variable_references_in_assign_templates( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client, template_path + self, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + aws_client, + template_path, ): sfn_snapshot.add_transformer(_SfnSortVariableReferences()) - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "sfn_role_arn")) definition = AT.load_sfn_template(template_path) definition_str = json.dumps(definition) creation_response = create_state_machine( - name=f"sm-{short_uid()}", definition=definition_str, roleArn=snf_role_arn + aws_client, name=f"sm-{short_uid()}", definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_response, 0)) state_machine_arn = creation_response["stateMachineArn"] @@ -126,17 +131,22 @@ def test_base_variable_references_in_assign_templates( ], ) def test_base_variable_references_in_jsonata_template( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client, template_path + self, + create_state_machine_iam_role, + create_state_machine, + sfn_snapshot, + aws_client, + template_path, ): # This test checks that variable references within jsonata expression are not included. - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "sfn_role_arn")) definition = AT.load_sfn_template(template_path) definition_str = json.dumps(definition) creation_response = create_state_machine( - name=f"sm-{short_uid()}", definition=definition_str, roleArn=snf_role_arn + aws_client, name=f"sm-{short_uid()}", definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_response, 0)) diff --git a/tests/aws/services/stepfunctions/v2/test_sfn_api_versioning.py b/tests/aws/services/stepfunctions/v2/test_sfn_api_versioning.py index 0228801149174..bbb838fadf465 100644 --- a/tests/aws/services/stepfunctions/v2/test_sfn_api_versioning.py +++ b/tests/aws/services/stepfunctions/v2/test_sfn_api_versioning.py @@ -20,12 +20,12 @@ class TestSnfApiVersioning: @markers.aws.validated def test_create_with_publish( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -33,7 +33,7 @@ def test_create_with_publish( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -41,12 +41,12 @@ def test_create_with_publish( @markers.aws.validated def test_create_express_with_publish( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -54,6 +54,7 @@ def test_create_express_with_publish( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, @@ -66,12 +67,12 @@ def test_create_express_with_publish( @markers.aws.validated def test_create_with_version_description_no_publish( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -80,6 +81,7 @@ def test_create_with_version_description_no_publish( with pytest.raises(Exception) as validation_exception: sm_name = f"statemachine_{short_uid()}" create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, @@ -90,12 +92,12 @@ def test_create_with_version_description_no_publish( @markers.aws.validated def test_create_publish_describe_no_version_description( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -103,7 +105,7 @@ def test_create_publish_describe_no_version_description( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -123,12 +125,12 @@ def test_create_publish_describe_no_version_description( @markers.aws.validated def test_create_publish_describe_with_version_description( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -136,6 +138,7 @@ def test_create_publish_describe_with_version_description( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, @@ -160,12 +163,12 @@ def test_create_publish_describe_with_version_description( @markers.aws.validated def test_list_state_machine_versions_pagination( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -173,7 +176,7 @@ def test_list_state_machine_versions_pagination( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -276,12 +279,12 @@ def test_list_state_machine_versions_pagination( @markers.aws.validated def test_list_delete_version( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -289,7 +292,7 @@ def test_list_delete_version( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -332,12 +335,12 @@ def test_list_delete_version( @markers.aws.validated def test_update_state_machine( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -345,7 +348,7 @@ def test_update_state_machine( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -409,12 +412,12 @@ def test_update_state_machine( @markers.aws.validated def test_publish_state_machine_version( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -422,7 +425,7 @@ def test_publish_state_machine_version( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -505,12 +508,12 @@ def test_publish_state_machine_version( @markers.aws.validated def test_start_version_execution( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -518,7 +521,7 @@ def test_start_version_execution( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -570,12 +573,12 @@ def test_start_version_execution( @markers.aws.validated def test_version_ids_between_deletions( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -583,7 +586,7 @@ def test_version_ids_between_deletions( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -619,12 +622,12 @@ def test_version_ids_between_deletions( @markers.aws.validated def test_idempotent_publish( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -632,7 +635,7 @@ def test_idempotent_publish( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -658,9 +661,9 @@ def test_idempotent_publish( @markers.aws.validated def test_publish_state_machine_version_no_such_machine( - self, create_iam_role_for_sfn, create_state_machine, sfn_snapshot, aws_client + self, create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -668,7 +671,7 @@ def test_publish_state_machine_version_no_such_machine( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) state_machine_arn: str = creation_resp_1["stateMachineArn"] @@ -696,12 +699,12 @@ def test_publish_state_machine_version_invalid_arn(self, sfn_snapshot, aws_clien @markers.aws.validated def test_empty_revision_with_publish_and_publish_on_creation( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -709,7 +712,7 @@ def test_empty_revision_with_publish_and_publish_on_creation( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -728,12 +731,12 @@ def test_empty_revision_with_publish_and_publish_on_creation( @markers.aws.validated def test_empty_revision_with_publish_and_no_publish_on_creation( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -741,7 +744,7 @@ def test_empty_revision_with_publish_and_no_publish_on_creation( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -760,12 +763,12 @@ def test_empty_revision_with_publish_and_no_publish_on_creation( @markers.aws.validated def test_describe_state_machine_for_execution_of_version( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -773,7 +776,7 @@ def test_describe_state_machine_for_execution_of_version( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn, publish=True ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) @@ -798,12 +801,12 @@ def test_describe_state_machine_for_execution_of_version( @markers.aws.validated def test_describe_state_machine_for_execution_of_version_with_revision( self, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, aws_client, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) sfn_snapshot.add_transformer(RegexTransformer(snf_role_arn, "snf_role_arn")) definition = BaseTemplate.load_sfn_template(BaseTemplate.BASE_PASS_RESULT) @@ -811,7 +814,7 @@ def test_describe_state_machine_for_execution_of_version_with_revision( sm_name = f"statemachine_{short_uid()}" creation_resp_1 = create_state_machine( - name=sm_name, definition=definition_str, roleArn=snf_role_arn + aws_client, name=sm_name, definition=definition_str, roleArn=snf_role_arn ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp_1, 0)) sfn_snapshot.match("creation_resp_1", creation_resp_1) diff --git a/tests/aws/services/stepfunctions/v2/test_state/test_test_state_scenarios.py b/tests/aws/services/stepfunctions/v2/test_state/test_test_state_scenarios.py index bd2d82fc502d1..facf99bd57c7a 100644 --- a/tests/aws/services/stepfunctions/v2/test_state/test_test_state_scenarios.py +++ b/tests/aws/services/stepfunctions/v2/test_state/test_test_state_scenarios.py @@ -45,7 +45,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..SdkHttpMetadata", "$..SdkResponseMetadata", ] @@ -62,19 +61,20 @@ class TestStateCaseScenarios: ) def test_base_inspection_level_info( self, - stepfunctions_client_test_state, - create_iam_role_for_sfn, + aws_client, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, tct_template, execution_input, ): - sfn_role_arn = create_iam_role_for_sfn() + sfn_role_arn = create_state_machine_iam_role(aws_client) template = TST.load_sfn_template(tct_template) definition = json.dumps(template) - test_case_response = stepfunctions_client_test_state.test_state( + test_case_response = aws_client_no_sync_prefix.stepfunctions.test_state( definition=definition, roleArn=sfn_role_arn, input=execution_input, @@ -101,19 +101,20 @@ def test_base_inspection_level_info( ) def test_base_inspection_level_debug( self, - stepfunctions_client_test_state, - create_iam_role_for_sfn, + aws_client, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, tct_template, execution_input, ): - sfn_role_arn = create_iam_role_for_sfn() + sfn_role_arn = create_state_machine_iam_role(aws_client) template = TST.load_sfn_template(tct_template) definition = json.dumps(template) - test_case_response = stepfunctions_client_test_state.test_state( + test_case_response = aws_client_no_sync_prefix.stepfunctions.test_state( definition=definition, roleArn=sfn_role_arn, input=execution_input, @@ -140,19 +141,20 @@ def test_base_inspection_level_debug( ) def test_base_inspection_level_trace( self, - stepfunctions_client_test_state, - create_iam_role_for_sfn, + aws_client, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, tct_template, execution_input, ): - sfn_role_arn = create_iam_role_for_sfn() + sfn_role_arn = create_state_machine_iam_role(aws_client) template = TST.load_sfn_template(tct_template) definition = json.dumps(template) - test_case_response = stepfunctions_client_test_state.test_state( + test_case_response = aws_client_no_sync_prefix.stepfunctions.test_state( definition=definition, roleArn=sfn_role_arn, input=execution_input, @@ -176,8 +178,9 @@ def test_base_inspection_level_trace( ) def test_base_lambda_task_state( self, - stepfunctions_client_test_state, - create_iam_role_for_sfn, + aws_client, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -196,8 +199,8 @@ def test_base_lambda_task_state( definition = json.dumps(template) exec_input = json.dumps({"inputData": "HelloWorld"}) - sfn_role_arn = create_iam_role_for_sfn() - test_case_response = stepfunctions_client_test_state.test_state( + sfn_role_arn = create_state_machine_iam_role(aws_client) + test_case_response = aws_client_no_sync_prefix.stepfunctions.test_state( definition=definition, roleArn=sfn_role_arn, input=exec_input, @@ -219,8 +222,9 @@ def test_base_lambda_task_state( ) def test_base_lambda_service_task_state( self, - stepfunctions_client_test_state, - create_iam_role_for_sfn, + aws_client, + aws_client_no_sync_prefix, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -238,8 +242,8 @@ def test_base_lambda_service_task_state( definition = json.dumps(template) exec_input = json.dumps({"FunctionName": function_name, "Payload": None}) - sfn_role_arn = create_iam_role_for_sfn() - test_case_response = stepfunctions_client_test_state.test_state( + sfn_role_arn = create_state_machine_iam_role(aws_client) + test_case_response = aws_client_no_sync_prefix.stepfunctions.test_state( definition=definition, roleArn=sfn_role_arn, input=exec_input, diff --git a/tests/aws/services/stepfunctions/v2/test_stepfunctions_v2.py b/tests/aws/services/stepfunctions/v2/test_stepfunctions_v2.py index ea6d461c03d2a..001664d6f638a 100644 --- a/tests/aws/services/stepfunctions/v2/test_stepfunctions_v2.py +++ b/tests/aws/services/stepfunctions/v2/test_stepfunctions_v2.py @@ -672,7 +672,9 @@ def test_default_logging_configuration(create_state_machine, aws_client): definition = json.dumps(definition) sm_name = f"sts-logging-{short_uid()}" - result = create_state_machine(name=sm_name, definition=definition, roleArn=role_arn) + result = create_state_machine( + aws_client, name=sm_name, definition=definition, roleArn=role_arn + ) assert result["ResponseMetadata"]["HTTPStatusCode"] == 200 result = aws_client.stepfunctions.describe_state_machine( diff --git a/tests/aws/services/stepfunctions/v2/timeouts/test_heartbeats.py b/tests/aws/services/stepfunctions/v2/timeouts/test_heartbeats.py index e68f7d12e0bf6..fb63b3138d608 100644 --- a/tests/aws/services/stepfunctions/v2/timeouts/test_heartbeats.py +++ b/tests/aws/services/stepfunctions/v2/timeouts/test_heartbeats.py @@ -14,7 +14,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..SdkHttpMetadata", "$..SdkResponseMetadata", ] @@ -24,7 +23,7 @@ class TestHeartbeats: def test_heartbeat_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_success_state_machine, @@ -50,8 +49,8 @@ def test_heartbeat_timeout( message_txt = "test_message_txt" exec_input = json.dumps({"QueueUrl": queue_url, "Message": message_txt}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -62,7 +61,7 @@ def test_heartbeat_timeout( def test_heartbeat_path_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_success_state_machine, @@ -92,8 +91,8 @@ def test_heartbeat_path_timeout( {"QueueUrl": queue_url, "Message": message_txt, "HeartbeatSecondsPath": 5} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -104,7 +103,7 @@ def test_heartbeat_path_timeout( def test_heartbeat_no_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sqs_create_queue, sqs_send_task_success_state_machine, @@ -131,8 +130,8 @@ def test_heartbeat_no_timeout( message_txt = "test_message_txt" exec_input = json.dumps({"QueueUrl": queue_url, "Message": message_txt}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, diff --git a/tests/aws/services/stepfunctions/v2/timeouts/test_timeouts.py b/tests/aws/services/stepfunctions/v2/timeouts/test_timeouts.py index 3d710559200e8..c6807f01bc316 100644 --- a/tests/aws/services/stepfunctions/v2/timeouts/test_timeouts.py +++ b/tests/aws/services/stepfunctions/v2/timeouts/test_timeouts.py @@ -18,7 +18,6 @@ @markers.snapshot.skip_snapshot_verify( paths=[ - "$..tracingConfiguration", "$..redriveCount", "$..redriveStatus", ] @@ -28,18 +27,21 @@ class TestTimeouts: def test_global_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, ): - snf_role_arn = create_iam_role_for_sfn() + snf_role_arn = create_state_machine_iam_role(aws_client) template = TT.load_sfn_template(BaseTemplate.BASE_WAIT_1_MIN) template["TimeoutSeconds"] = 5 definition = json.dumps(template) creation_resp = create_state_machine( - name=f"test_global_timeout-{short_uid()}", definition=definition, roleArn=snf_role_arn + aws_client, + name=f"test_global_timeout-{short_uid()}", + definition=definition, + roleArn=snf_role_arn, ) sfn_snapshot.add_transformer(sfn_snapshot.transform.sfn_sm_create_arn(creation_resp, 0)) state_machine_arn = creation_resp["stateMachineArn"] @@ -63,7 +65,7 @@ def test_global_timeout( def test_fixed_timeout_service_lambda( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -83,8 +85,8 @@ def test_fixed_timeout_service_lambda( {"FunctionName": function_name, "Payload": None, "TimeoutSecondsValue": 5} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -95,7 +97,7 @@ def test_fixed_timeout_service_lambda( def test_fixed_timeout_service_lambda_with_path( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -117,8 +119,8 @@ def test_fixed_timeout_service_lambda_with_path( {"TimeoutSecondsValue": 5, "FunctionName": function_name, "Payload": None} ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -129,7 +131,7 @@ def test_fixed_timeout_service_lambda_with_path( def test_fixed_timeout_lambda( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -149,8 +151,8 @@ def test_fixed_timeout_lambda( exec_input = json.dumps({"Payload": None}) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition, @@ -164,7 +166,7 @@ def test_fixed_timeout_lambda( def test_service_lambda_map_timeout( self, aws_client, - create_iam_role_for_sfn, + create_state_machine_iam_role, create_state_machine, create_lambda_function, sfn_snapshot, @@ -191,8 +193,8 @@ def test_service_lambda_map_timeout( } ) create_and_record_execution( - aws_client.stepfunctions, - create_iam_role_for_sfn, + aws_client, + create_state_machine_iam_role, create_state_machine, sfn_snapshot, definition,