@mitre/hdf-mappings 3.5.1 → 3.6.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -539,8 +539,27 @@ interface AwsConfigNistMapping {
539
539
  Source: string;
540
540
  }
541
541
  type AwsConfigNistMappings = AwsConfigNistMapping[];
542
+ /**
543
+ * A maintainer-reviewed removal the generator applies after every source tier:
544
+ * the (rule, control) pair is dropped at each listed revision on every
545
+ * regeneration. Deliberately carries nothing else — no rationale or
546
+ * attribution fields; git history records who committed a suppression and
547
+ * when.
548
+ */
549
+ interface AwsConfigSuppression {
550
+ rule: string;
551
+ control: string;
552
+ revisions: number[];
553
+ }
554
+ type AwsConfigSuppressions = AwsConfigSuppression[];
542
555
  //#endregion
543
556
  //#region src/awsconfig/index.d.ts
557
+ /**
558
+ * The maintainer-reviewed (rule, control) removals the generator applied to
559
+ * the mapping table — exposed so a consumer can distinguish "removed by
560
+ * review" from "never mapped by the sources".
561
+ */
562
+ declare const awsConfigSuppressions: AwsConfigSuppressions;
544
563
  /** Get the full mapping for an AWS Config rule by source identifier. */
545
564
  declare function getAwsConfigNistMappingByIdentifier(identifier: string, rev?: number): AwsConfigNistMapping | undefined;
546
565
  /** Get the full mapping for an AWS Config rule by rule name. */
@@ -601,5 +620,5 @@ declare function getAllHipcheckAnalyses(): string[];
601
620
  /** Get all Hipcheck to NIST mappings. */
602
621
  declare function getAllHipcheckMappings(): HipcheckNistMappings;
603
622
  //#endregion
604
- export { type AwsConfigNistMapping, type AwsConfigNistMappings, type CCIItem, type CCIMappings, type CweNistMapping, type CweNistMappings, DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS, DEFAULT_CONFIG_MANAGEMENT_NIST_TAGS, DEFAULT_NIST_REVISION, DEFAULT_REMEDIATION_NIST_TAGS, DEFAULT_STATIC_ANALYSIS_NIST_TAGS, type HipcheckNistMapping, type HipcheckNistMappings, type NISTDescriptions, type NessusNistMapping, type NessusNistMappings, type NiktoNistMappings, type NistCCIMappings, type NistControlTranslation, type NistCrosswalkRelation, type OwaspNistMapping, type OwaspNistMappings, SUPPORTED_NIST_REVISIONS, type ScoutsuiteNistMapping, type ScoutsuiteNistMappings, awsConfigIdentifierExists, awsConfigMappedRevisions, awsConfigRuleNameExists, cciExists, cweExists, getAllAwsConfigIdentifiers, getAllAwsConfigMappings, getAllAwsConfigRuleNames, getAllCCIIds, getAllCweIds, getAllCweMappings, getAllHipcheckAnalyses, getAllHipcheckMappings, getAllNISTIds, getAllNessusMappings, getAllNessusPluginFamilies, getAllNiktoIds, getAllNiktoMappings, getAllOwaspIds, getAllOwaspMappings, getAllScoutsuiteMappings, getAllScoutsuiteRules, getAwsConfigNistControlByIdentifier, getAwsConfigNistControlByName, getAwsConfigNistControlsBySubstring, getAwsConfigNistMappingByIdentifier, getAwsConfigNistMappingByName, getCCIDescription, getCCINistMappings, getCurrentNistRevision, getCweName, getCweNistControl, getCweNistMapping, getHipcheckNistControls, getNISTDescription, getNISTFamily, getNessusNistControl, getNessusPluginFamilyMappings, getNiktoNistControl, getNistCCIMappings, getOwaspName, getOwaspNistControl, getOwaspNistMapping, getScoutsuiteNistControl, getScoutsuiteNistMapping, hipcheckAnalysisExists, isNistStrict, nessusPluginFamilyExists, niktoExists, nistControlsAtRevision, nistExists, nistRosterSize, nistToCci, owaspExists, resetNistRevision, scoutsuiteRuleExists, setCurrentNistRevision, setNistStrict, translateNistControl, translateNistControls };
623
+ export { type AwsConfigNistMapping, type AwsConfigNistMappings, type AwsConfigSuppression, type AwsConfigSuppressions, type CCIItem, type CCIMappings, type CweNistMapping, type CweNistMappings, DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS, DEFAULT_CONFIG_MANAGEMENT_NIST_TAGS, DEFAULT_NIST_REVISION, DEFAULT_REMEDIATION_NIST_TAGS, DEFAULT_STATIC_ANALYSIS_NIST_TAGS, type HipcheckNistMapping, type HipcheckNistMappings, type NISTDescriptions, type NessusNistMapping, type NessusNistMappings, type NiktoNistMappings, type NistCCIMappings, type NistControlTranslation, type NistCrosswalkRelation, type OwaspNistMapping, type OwaspNistMappings, SUPPORTED_NIST_REVISIONS, type ScoutsuiteNistMapping, type ScoutsuiteNistMappings, awsConfigIdentifierExists, awsConfigMappedRevisions, awsConfigRuleNameExists, awsConfigSuppressions, cciExists, cweExists, getAllAwsConfigIdentifiers, getAllAwsConfigMappings, getAllAwsConfigRuleNames, getAllCCIIds, getAllCweIds, getAllCweMappings, getAllHipcheckAnalyses, getAllHipcheckMappings, getAllNISTIds, getAllNessusMappings, getAllNessusPluginFamilies, getAllNiktoIds, getAllNiktoMappings, getAllOwaspIds, getAllOwaspMappings, getAllScoutsuiteMappings, getAllScoutsuiteRules, getAwsConfigNistControlByIdentifier, getAwsConfigNistControlByName, getAwsConfigNistControlsBySubstring, getAwsConfigNistMappingByIdentifier, getAwsConfigNistMappingByName, getCCIDescription, getCCINistMappings, getCurrentNistRevision, getCweName, getCweNistControl, getCweNistMapping, getHipcheckNistControls, getNISTDescription, getNISTFamily, getNessusNistControl, getNessusPluginFamilyMappings, getNiktoNistControl, getNistCCIMappings, getOwaspName, getOwaspNistControl, getOwaspNistMapping, getScoutsuiteNistControl, getScoutsuiteNistMapping, hipcheckAnalysisExists, isNistStrict, nessusPluginFamilyExists, niktoExists, nistControlsAtRevision, nistExists, nistRosterSize, nistToCci, owaspExists, resetNistRevision, scoutsuiteRuleExists, setCurrentNistRevision, setNistStrict, translateNistControl, translateNistControls };
605
624
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/cci/types.ts","../src/cci/index.ts","../src/nist/crosswalk.ts","../src/nist/types.ts","../src/nist/index.ts","../src/owasp/types.ts","../src/owasp/index.ts","../src/cwe/types.ts","../src/cwe/index.ts","../src/nessus/types.ts","../src/nessus/index.ts","../src/nikto/types.ts","../src/nikto/index.ts","../src/scoutsuite/types.ts","../src/scoutsuite/index.ts","../src/awsconfig/types.ts","../src/awsconfig/index.ts","../src/hipcheck/types.ts","../src/hipcheck/index.ts"],"mappings":";;;;UAGiB;;EAEf;;EAEA;;;;;KAMU,cAAc,eAAe;;;;;KAM7B,kBAAkB;;;;;;;;;;;;;;;;;;iBCUd,kBAAkB;;;;;;;;;;;;;iBAqBlB,mBAAmB;;;;;;;;;;;;iBAqBnB;;;;;;;;;;;;;;iBAiBA,UAAU;;;;;;;;;;;;;;iBA8BV,mBAAmB;;;;;;;;;;;;;;iBAqBnB,UAAU;;;;;;;;;;;;;;;;;KC1Hd;UASK;EACf;EACA;EACA,UAAU;;;;;EAKV;;EAEA;;;;;;;;;;iBA4Dc,qBACd,iBACA,cACA,aACC;;;;;;;;iBA8Ba,sBACd,oBACA,cACA;EACG;EAAsB,UAAU;;;;;;iBAwBrB,eAAe;;;;;;;;;;;iBAoBf,uBACd,oBACA,mBACA;;;;;;KClLU,mBAAmB;;;;;;;;;;;;;;;;cCyBlB;;cAWA;;iBAKG;;;;;iBAQA,uBAAuB;;iBAUvB;;iBAOA;;;;;;iBASA,cAAc;;;;;;;;;;;;;;;;iBAmBd,mBACd,gBACA;;;;;;;;;;;;;;iBAsBc,cAAc;;;;;;;;;;;;;;;;iBAmBd,WAAW,gBAAgB;;;;;;;;;;;;;;;;;;;iBA0B3B,cACd,gBACA;;;;;;;;;;;cAiCW;;cAGA;;cAGA;;cAGA;;;;;;UC9MI;EACf;EACA;EACA;EACA;EACA;;KAGU,oBAAoB;;;;;;;;;;;;;;;iBCoBhB,oBAAoB,kBAAkB;;;;;;;;;;;;;iBAoBtC,oBAAoB;;;;;;;;;;;;;iBAiBpB,aAAa;;;;;;;;;;;;iBAgBb;;;;;;;;;;;;;;iBAiBA,YAAY;;;;;;;;;;;;iBAmBZ,uBAAuB;;;;;;UCrHtB;EACf;EACA;EACA;EACA;EACA;;KAGU,kBAAkB;;;;iBCiBd,kBACd,eACA,eACC;;iBAKa,kBAAkB,eAAe;;iBAKjC,WAAW,eAAe;;iBAK1B,aAAa;;iBAKb,UAAU,eAAe;;iBAKzB,qBAAqB;;;;;;UCrDpB;EACf;EACA;EACA;;KAGU,qBAAqB;;;;;;;;;iBCajB,qBACd,sBACA;;;;;;iBAwBc,8BACd,uBACC;;;;;iBAQa;;;;;;iBAUA,yBAAyB;;;;;iBAQzB,wBAAwB;;;;;;KCzE5B,oBAAoB;;;;;;;;iBCkBhB,oBAAoB;;;;;iBAUpB;;;;;;iBASA,YAAY;;;;;iBASZ,uBAAuB;;;;;;UC9CtB;EACf;EACA;;KAGU,yBAAyB;;;;;;;;iBCgBrB,yBAAyB,eAAe;;;;;;iBASxC,yBAAyB;;;;;iBASzB;;;;;;iBASA,qBAAqB;;;;;iBAQrB,4BAA4B;;;;;;UCxD3B;EACf;EACA;EACA;EACA;;;;;;EAMA;;KAGU,wBAAwB;;;;iBCgBpB,oCACd,oBACA,eACC;;iBAKa,8BACd,kBACA,eACC;;iBAKa,oCACd,oBACA;;iBAMc,8BACd,kBACA;;;;;;;iBAWc,oCACd,cACA;;iBAoBc,2BAA2B;;iBAK3B,yBAAyB;;iBAKzB,0BAA0B,oBAAoB;;iBAK9C,wBAAwB,kBAAkB;;;;;;;;iBAW1C,yBAAyB,oBAAoB;;iBAa7C,2BAA2B;;;;;;UC/H1B;EACf;EACA;EACA;EACA;;KAGU,uBAAuB;;;;;;;;iBC2BnB,wBAAwB;;iBAWxB,uBAAuB;;iBAKvB;;iBAKA,0BAA0B"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/cci/types.ts","../src/cci/index.ts","../src/nist/crosswalk.ts","../src/nist/types.ts","../src/nist/index.ts","../src/owasp/types.ts","../src/owasp/index.ts","../src/cwe/types.ts","../src/cwe/index.ts","../src/nessus/types.ts","../src/nessus/index.ts","../src/nikto/types.ts","../src/nikto/index.ts","../src/scoutsuite/types.ts","../src/scoutsuite/index.ts","../src/awsconfig/types.ts","../src/awsconfig/index.ts","../src/hipcheck/types.ts","../src/hipcheck/index.ts"],"mappings":";;;;UAGiB;;EAEf;;EAEA;;;;;KAMU,cAAc,eAAe;;;;;KAM7B,kBAAkB;;;;;;;;;;;;;;;;;;iBCUd,kBAAkB;;;;;;;;;;;;;iBAqBlB,mBAAmB;;;;;;;;;;;;iBAqBnB;;;;;;;;;;;;;;iBAiBA,UAAU;;;;;;;;;;;;;;iBA8BV,mBAAmB;;;;;;;;;;;;;;iBAqBnB,UAAU;;;;;;;;;;;;;;;;;KC1Hd;UASK;EACf;EACA;EACA,UAAU;;;;;EAKV;;EAEA;;;;;;;;;;iBA4Dc,qBACd,iBACA,cACA,aACC;;;;;;;;iBA8Ba,sBACd,oBACA,cACA;EACG;EAAsB,UAAU;;;;;;iBAwBrB,eAAe;;;;;;;;;;;iBAoBf,uBACd,oBACA,mBACA;;;;;;KClLU,mBAAmB;;;;;;;;;;;;;;;;cCyBlB;;cAWA;;iBAKG;;;;;iBAQA,uBAAuB;;iBAUvB;;iBAOA;;;;;;iBASA,cAAc;;;;;;;;;;;;;;;;iBAmBd,mBACd,gBACA;;;;;;;;;;;;;;iBAsBc,cAAc;;;;;;;;;;;;;;;;iBAmBd,WAAW,gBAAgB;;;;;;;;;;;;;;;;;;;iBA0B3B,cACd,gBACA;;;;;;;;;;;cAiCW;;cAGA;;cAGA;;cAGA;;;;;;UC9MI;EACf;EACA;EACA;EACA;EACA;;KAGU,oBAAoB;;;;;;;;;;;;;;;iBCoBhB,oBAAoB,kBAAkB;;;;;;;;;;;;;iBAoBtC,oBAAoB;;;;;;;;;;;;;iBAiBpB,aAAa;;;;;;;;;;;;iBAgBb;;;;;;;;;;;;;;iBAiBA,YAAY;;;;;;;;;;;;iBAmBZ,uBAAuB;;;;;;UCrHtB;EACf;EACA;EACA;EACA;EACA;;KAGU,kBAAkB;;;;iBCiBd,kBACd,eACA,eACC;;iBAKa,kBAAkB,eAAe;;iBAKjC,WAAW,eAAe;;iBAK1B,aAAa;;iBAKb,UAAU,eAAe;;iBAKzB,qBAAqB;;;;;;UCrDpB;EACf;EACA;EACA;;KAGU,qBAAqB;;;;;;;;;iBCajB,qBACd,sBACA;;;;;;iBAwBc,8BACd,uBACC;;;;;iBAQa;;;;;;iBAUA,yBAAyB;;;;;iBAQzB,wBAAwB;;;;;;KCzE5B,oBAAoB;;;;;;;;iBCkBhB,oBAAoB;;;;;iBAUpB;;;;;;iBASA,YAAY;;;;;iBASZ,uBAAuB;;;;;;UC9CtB;EACf;EACA;;KAGU,yBAAyB;;;;;;;;iBCgBrB,yBAAyB,eAAe;;;;;;iBASxC,yBAAyB;;;;;iBASzB;;;;;;iBASA,qBAAqB;;;;;iBAQrB,4BAA4B;;;;;;UCxD3B;EACf;EACA;EACA;EACA;;;;;;EAMA;;KAGU,wBAAwB;;;;;;;;UASnB;EACf;EACA;EACA;;KAGU,wBAAwB;;;;;;;;cCbvB,uBAA2C;;iBAsBxC,oCACd,oBACA,eACC;;iBAKa,8BACd,kBACA,eACC;;iBAKa,oCACd,oBACA;;iBAMc,8BACd,kBACA;;;;;;;iBAWc,oCACd,cACA;;iBAoBc,2BAA2B;;iBAK3B,yBAAyB;;iBAKzB,0BAA0B,oBAAoB;;iBAK9C,wBAAwB,kBAAkB;;;;;;;;iBAW1C,yBAAyB,oBAAoB;;iBAa7C,2BAA2B;;;;;;UCvI1B;EACf;EACA;EACA;EACA;;KAGU,uBAAuB;;;;;;;;iBC2BnB,wBAAwB;;iBAWxB,uBAAuB;;iBAKvB;;iBAKA,0BAA0B"}
package/dist/index.js CHANGED
@@ -42036,8 +42036,8 @@ function getAllScoutsuiteMappings() {
42036
42036
  return [...mappings$2];
42037
42037
  }
42038
42038
  //#endregion
42039
- //#region src/awsconfig/index.ts
42040
- const mappings$1 = [
42039
+ //#region src/data/awsconfig-mappings.json
42040
+ var awsconfig_mappings_default = [
42041
42041
  {
42042
42042
  "AwsConfigRuleSourceIdentifier": "ACCESS_KEYS_ROTATED",
42043
42043
  "AwsConfigRuleName": "access-keys-rotated",
@@ -42153,7 +42153,7 @@ const mappings$1 = [
42153
42153
  {
42154
42154
  "AwsConfigRuleSourceIdentifier": "APIGATEWAY_STAGE_ACCESS_LOGS_ENABLED",
42155
42155
  "AwsConfigRuleName": "apigateway-stage-access-logs-enabled",
42156
- "NIST-ID": "AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
42156
+ "NIST-ID": "AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7",
42157
42157
  "Rev": 4,
42158
42158
  "Source": "crosswalk"
42159
42159
  },
@@ -42174,7 +42174,7 @@ const mappings$1 = [
42174
42174
  {
42175
42175
  "AwsConfigRuleSourceIdentifier": "APPMESH_VIRTUAL_GATEWAY_LOGGING_FILE_PATH_EXISTS",
42176
42176
  "AwsConfigRuleName": "appmesh-virtual-gateway-logging-file-path-exists",
42177
- "NIST-ID": "AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
42177
+ "NIST-ID": "AU-12|AU-6(3)|AU-6(4)|CA-7|SI-7(8)",
42178
42178
  "Rev": 4,
42179
42179
  "Source": "crosswalk"
42180
42180
  },
@@ -42188,7 +42188,7 @@ const mappings$1 = [
42188
42188
  {
42189
42189
  "AwsConfigRuleSourceIdentifier": "APPMESH_VIRTUAL_NODE_LOGGING_FILE_PATH_EXISTS",
42190
42190
  "AwsConfigRuleName": "appmesh-virtual-node-logging-file-path-exists",
42191
- "NIST-ID": "AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
42191
+ "NIST-ID": "AU-12|AU-6(3)|AU-6(4)|CA-7|SI-7(8)",
42192
42192
  "Rev": 4,
42193
42193
  "Source": "crosswalk"
42194
42194
  },
@@ -42202,7 +42202,7 @@ const mappings$1 = [
42202
42202
  {
42203
42203
  "AwsConfigRuleSourceIdentifier": "APPRUNNER_SERVICE_NO_PUBLIC_ACCESS",
42204
42204
  "AwsConfigRuleName": "apprunner-service-no-public-access",
42205
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
42205
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
42206
42206
  "Rev": 4,
42207
42207
  "Source": "crosswalk"
42208
42208
  },
@@ -42237,7 +42237,7 @@ const mappings$1 = [
42237
42237
  {
42238
42238
  "AwsConfigRuleSourceIdentifier": "APPSYNC_LOGGING_ENABLED",
42239
42239
  "AwsConfigRuleName": "appsync-logging-enabled",
42240
- "NIST-ID": "AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
42240
+ "NIST-ID": "AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SI-7(8)",
42241
42241
  "Rev": 4,
42242
42242
  "Source": "crosswalk"
42243
42243
  },
@@ -42251,7 +42251,7 @@ const mappings$1 = [
42251
42251
  {
42252
42252
  "AwsConfigRuleSourceIdentifier": "ATHENA_WORKGROUP_LOGGING_ENABLED",
42253
42253
  "AwsConfigRuleName": "athena-workgroup-logging-enabled",
42254
- "NIST-ID": "AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
42254
+ "NIST-ID": "AU-10|AU-12|AU-2|AU-6(3)|AU-6(4)|CA-7",
42255
42255
  "Rev": 4,
42256
42256
  "Source": "crosswalk"
42257
42257
  },
@@ -42517,7 +42517,7 @@ const mappings$1 = [
42517
42517
  {
42518
42518
  "AwsConfigRuleSourceIdentifier": "CLOUDTRAIL_S3_BUCKET_PUBLIC_ACCESS_PROHIBITED",
42519
42519
  "AwsConfigRuleName": "cloudtrail-s3-bucket-public-access-prohibited",
42520
- "NIST-ID": "AC-21|AC-3|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)|SI-7(8)",
42520
+ "NIST-ID": "AC-21|AC-3|AU-10|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)",
42521
42521
  "Rev": 4,
42522
42522
  "Source": "crosswalk"
42523
42523
  },
@@ -42846,7 +42846,7 @@ const mappings$1 = [
42846
42846
  {
42847
42847
  "AwsConfigRuleSourceIdentifier": "EBS_SNAPSHOT_BLOCK_PUBLIC_ACCESS",
42848
42848
  "AwsConfigRuleName": "ebs-snapshot-block-public-access",
42849
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
42849
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
42850
42850
  "Rev": 4,
42851
42851
  "Source": "crosswalk"
42852
42852
  },
@@ -42888,7 +42888,7 @@ const mappings$1 = [
42888
42888
  {
42889
42889
  "AwsConfigRuleSourceIdentifier": "EC2_INSTANCE_MANAGED_BY_SSM",
42890
42890
  "AwsConfigRuleName": "ec2-instance-managed-by-systems-manager",
42891
- "NIST-ID": "CM-2|CM-7(a)|CM-8(1)|CM-8(3)|CM-8(a)|SA-10|SA-3(a)|SI-2(2)|SI-7(1)",
42891
+ "NIST-ID": "CM-2|CM-7(a)|CM-8(1)|CM-8(3)(a)|SA-10|SA-3(a)|SI-2(2)|SI-7(1)",
42892
42892
  "Rev": 4,
42893
42893
  "Source": "config-pack"
42894
42894
  },
@@ -42944,14 +42944,14 @@ const mappings$1 = [
42944
42944
  {
42945
42945
  "AwsConfigRuleSourceIdentifier": "EC2_MANAGEDINSTANCE_ASSOCIATION_COMPLIANCE_STATUS_CHECK",
42946
42946
  "AwsConfigRuleName": "ec2-managedinstance-association-compliance-status-check",
42947
- "NIST-ID": "CM-2|CM-7(a)|CM-8(3)|CM-8(a)|SI-2(2)",
42947
+ "NIST-ID": "CM-2|CM-7(a)|CM-8(3)(a)|SI-2(2)",
42948
42948
  "Rev": 4,
42949
42949
  "Source": "config-pack"
42950
42950
  },
42951
42951
  {
42952
42952
  "AwsConfigRuleSourceIdentifier": "EC2_MANAGEDINSTANCE_PATCH_COMPLIANCE_STATUS_CHECK",
42953
42953
  "AwsConfigRuleName": "ec2-managedinstance-patch-compliance-status-check",
42954
- "NIST-ID": "CM-8(3)|CM-8(a)|SI-2(2)|SI-7(1)",
42954
+ "NIST-ID": "CM-8(3)(a)|SI-2(2)|SI-7(1)",
42955
42955
  "Rev": 4,
42956
42956
  "Source": "config-pack"
42957
42957
  },
@@ -43462,7 +43462,7 @@ const mappings$1 = [
43462
43462
  {
43463
43463
  "AwsConfigRuleSourceIdentifier": "GUARDDUTY_ENABLED_CENTRALIZED",
43464
43464
  "AwsConfigRuleName": "guardduty-enabled-centralized",
43465
- "NIST-ID": "AC-17(1)|AC-2(1)|AC-2(12)|AC-2(4)|AC-2(a)|AC-2(g)|AU-6(1)|AU-6(3)|CA-7(a)|CA-7(b)|RA-5|SA-10|SI-4(1)|SI-4(16)|SI-4(2)|SI-4(4)|SI-4(5)|SI-4(a)|SI-4(b)|SI-4(c)",
43465
+ "NIST-ID": "AC-17(1)|AC-2(1)|AC-2(12)(a)|AC-2(4)|AC-2(g)|AU-6(1)|AU-6(3)|CA-7(a)|CA-7(b)|RA-5|SA-10|SI-4(1)|SI-4(16)|SI-4(2)|SI-4(4)|SI-4(5)|SI-4(a)|SI-4(b)|SI-4(c)",
43466
43466
  "Rev": 4,
43467
43467
  "Source": "config-pack"
43468
43468
  },
@@ -43504,7 +43504,7 @@ const mappings$1 = [
43504
43504
  {
43505
43505
  "AwsConfigRuleSourceIdentifier": "IAM_PASSWORD_POLICY",
43506
43506
  "AwsConfigRuleName": "iam-password-policy",
43507
- "NIST-ID": "AC-2(1)|AC-2(f)|AC-2(j)|IA-2|IA-5(1)|IA-5(4)|IA-5(a)|IA-5(d)|IA-5(e)",
43507
+ "NIST-ID": "AC-2(1)|AC-2(f)|AC-2(j)|IA-2|IA-5(1)(a)|IA-5(1)(d)|IA-5(1)(e)|IA-5(4)",
43508
43508
  "Rev": 4,
43509
43509
  "Source": "config-pack"
43510
43510
  },
@@ -43595,7 +43595,7 @@ const mappings$1 = [
43595
43595
  {
43596
43596
  "AwsConfigRuleSourceIdentifier": "KMS_KEY_POLICY_NO_PUBLIC_ACCESS",
43597
43597
  "AwsConfigRuleName": "kms-key-policy-no-public-access",
43598
- "NIST-ID": "AC-21|AC-3|CA-9(1)|CM-3(6)|SC-13|SC-28|SC-28(1)|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
43598
+ "NIST-ID": "AC-21|AC-3|CM-3(6)|SC-13|SC-28|SC-28(1)|SC-7|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
43599
43599
  "Rev": 4,
43600
43600
  "Source": "crosswalk"
43601
43601
  },
@@ -43644,7 +43644,7 @@ const mappings$1 = [
43644
43644
  {
43645
43645
  "AwsConfigRuleSourceIdentifier": "LIGHTSAIL_BUCKET_ALLOW_PUBLIC_OVERRIDES_DISABLED",
43646
43646
  "AwsConfigRuleName": "lightsail-bucket-allow-public-overrides-disabled",
43647
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
43647
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(21)|SC-7(3)",
43648
43648
  "Rev": 4,
43649
43649
  "Source": "crosswalk"
43650
43650
  },
@@ -43707,7 +43707,7 @@ const mappings$1 = [
43707
43707
  {
43708
43708
  "AwsConfigRuleSourceIdentifier": "MQ_NO_PUBLIC_ACCESS",
43709
43709
  "AwsConfigRuleName": "mq-no-public-access",
43710
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
43710
+ "NIST-ID": "AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
43711
43711
  "Rev": 4,
43712
43712
  "Source": "crosswalk"
43713
43713
  },
@@ -43721,7 +43721,7 @@ const mappings$1 = [
43721
43721
  {
43722
43722
  "AwsConfigRuleSourceIdentifier": "MSK_CLUSTER_PUBLIC_ACCESS_DISABLED",
43723
43723
  "AwsConfigRuleName": "msk-cluster-public-access-disabled",
43724
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
43724
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
43725
43725
  "Rev": 4,
43726
43726
  "Source": "crosswalk"
43727
43727
  },
@@ -44246,7 +44246,7 @@ const mappings$1 = [
44246
44246
  {
44247
44247
  "AwsConfigRuleSourceIdentifier": "REDSHIFT_SERVERLESS_WORKGROUP_NO_PUBLIC_ACCESS",
44248
44248
  "AwsConfigRuleName": "redshift-serverless-workgroup-no-public-access",
44249
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
44249
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
44250
44250
  "Rev": 4,
44251
44251
  "Source": "crosswalk"
44252
44252
  },
@@ -44582,7 +44582,7 @@ const mappings$1 = [
44582
44582
  {
44583
44583
  "AwsConfigRuleSourceIdentifier": "SECURITYHUB_ENABLED",
44584
44584
  "AwsConfigRuleName": "securityhub-enabled",
44585
- "NIST-ID": "AC-17(1)|AC-2(1)|AC-2(12)|AC-2(4)|AC-2(a)|AC-2(g)|AU-6(1)|AU-6(3)|CA-7(a)|CA-7(b)|SA-10|SI-4(16)|SI-4(2)|SI-4(4)|SI-4(5)|SI-4(a)|SI-4(b)|SI-4(c)",
44585
+ "NIST-ID": "AC-17(1)|AC-2(1)|AC-2(12)(a)|AC-2(4)|AC-2(g)|AU-6(1)|AU-6(3)|CA-7(a)|CA-7(b)|SA-10|SI-4(16)|SI-4(2)|SI-4(4)|SI-4(5)|SI-4(a)|SI-4(b)|SI-4(c)",
44586
44586
  "Rev": 4,
44587
44587
  "Source": "config-pack"
44588
44588
  },
@@ -44631,7 +44631,7 @@ const mappings$1 = [
44631
44631
  {
44632
44632
  "AwsConfigRuleSourceIdentifier": "SSM_AUTOMATION_BLOCK_PUBLIC_SHARING",
44633
44633
  "AwsConfigRuleName": "ssm-automation-block-public-sharing",
44634
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
44634
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
44635
44635
  "Rev": 4,
44636
44636
  "Source": "crosswalk"
44637
44637
  },
@@ -44684,13 +44684,6 @@ const mappings$1 = [
44684
44684
  "Rev": 4,
44685
44685
  "Source": "crosswalk"
44686
44686
  },
44687
- {
44688
- "AwsConfigRuleSourceIdentifier": "USING_SERVICE_LINKED_ROLES",
44689
- "AwsConfigRuleName": "using-service-linked-roles",
44690
- "NIST-ID": "CM-3|CM-6(1)|CM-8|CM-8(2)",
44691
- "Rev": 4,
44692
- "Source": "crosswalk"
44693
- },
44694
44687
  {
44695
44688
  "AwsConfigRuleSourceIdentifier": "VPC_DEFAULT_SECURITY_GROUP_CLOSED",
44696
44689
  "AwsConfigRuleName": "vpc-default-security-group-closed",
@@ -44918,7 +44911,7 @@ const mappings$1 = [
44918
44911
  {
44919
44912
  "AwsConfigRuleSourceIdentifier": "APIGATEWAY_STAGE_ACCESS_LOGS_ENABLED",
44920
44913
  "AwsConfigRuleName": "apigateway-stage-access-logs-enabled",
44921
- "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
44914
+ "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7",
44922
44915
  "Rev": 5,
44923
44916
  "Source": "derived-theme"
44924
44917
  },
@@ -44939,7 +44932,7 @@ const mappings$1 = [
44939
44932
  {
44940
44933
  "AwsConfigRuleSourceIdentifier": "APPMESH_VIRTUAL_GATEWAY_LOGGING_FILE_PATH_EXISTS",
44941
44934
  "AwsConfigRuleName": "appmesh-virtual-gateway-logging-file-path-exists",
44942
- "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
44935
+ "NIST-ID": "AC-4(26)|AU-12|AU-6(3)|AU-6(4)|CA-7|SI-7(8)",
44943
44936
  "Rev": 5,
44944
44937
  "Source": "derived-theme"
44945
44938
  },
@@ -44953,7 +44946,7 @@ const mappings$1 = [
44953
44946
  {
44954
44947
  "AwsConfigRuleSourceIdentifier": "APPMESH_VIRTUAL_NODE_LOGGING_FILE_PATH_EXISTS",
44955
44948
  "AwsConfigRuleName": "appmesh-virtual-node-logging-file-path-exists",
44956
- "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
44949
+ "NIST-ID": "AC-4(26)|AU-12|AU-6(3)|AU-6(4)|CA-7|SI-7(8)",
44957
44950
  "Rev": 5,
44958
44951
  "Source": "derived-theme"
44959
44952
  },
@@ -44967,7 +44960,7 @@ const mappings$1 = [
44967
44960
  {
44968
44961
  "AwsConfigRuleSourceIdentifier": "APPRUNNER_SERVICE_NO_PUBLIC_ACCESS",
44969
44962
  "AwsConfigRuleName": "apprunner-service-no-public-access",
44970
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
44963
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
44971
44964
  "Rev": 5,
44972
44965
  "Source": "derived-theme"
44973
44966
  },
@@ -45002,7 +44995,7 @@ const mappings$1 = [
45002
44995
  {
45003
44996
  "AwsConfigRuleSourceIdentifier": "APPSYNC_LOGGING_ENABLED",
45004
44997
  "AwsConfigRuleName": "appsync-logging-enabled",
45005
- "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
44998
+ "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SI-7(8)",
45006
44999
  "Rev": 5,
45007
45000
  "Source": "derived-theme"
45008
45001
  },
@@ -45016,7 +45009,7 @@ const mappings$1 = [
45016
45009
  {
45017
45010
  "AwsConfigRuleSourceIdentifier": "ATHENA_WORKGROUP_LOGGING_ENABLED",
45018
45011
  "AwsConfigRuleName": "athena-workgroup-logging-enabled",
45019
- "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7(9)|SI-7(8)",
45012
+ "NIST-ID": "AC-4(26)|AU-10|AU-12|AU-2|AU-6(3)|AU-6(4)|CA-7",
45020
45013
  "Rev": 5,
45021
45014
  "Source": "derived-theme"
45022
45015
  },
@@ -45282,7 +45275,7 @@ const mappings$1 = [
45282
45275
  {
45283
45276
  "AwsConfigRuleSourceIdentifier": "CLOUDTRAIL_S3_BUCKET_PUBLIC_ACCESS_PROHIBITED",
45284
45277
  "AwsConfigRuleName": "cloudtrail-s3-bucket-public-access-prohibited",
45285
- "NIST-ID": "AC-21|AC-3|AC-4(26)|AU-10|AU-12|AU-2|AU-3|AU-6(3)|AU-6(4)|CA-7|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)|SI-7(8)",
45278
+ "NIST-ID": "AC-21|AC-3|AU-10|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)",
45286
45279
  "Rev": 5,
45287
45280
  "Source": "derived-theme"
45288
45281
  },
@@ -45611,7 +45604,7 @@ const mappings$1 = [
45611
45604
  {
45612
45605
  "AwsConfigRuleSourceIdentifier": "EBS_SNAPSHOT_BLOCK_PUBLIC_ACCESS",
45613
45606
  "AwsConfigRuleName": "ebs-snapshot-block-public-access",
45614
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
45607
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
45615
45608
  "Rev": 5,
45616
45609
  "Source": "derived-theme"
45617
45610
  },
@@ -45646,7 +45639,7 @@ const mappings$1 = [
45646
45639
  {
45647
45640
  "AwsConfigRuleSourceIdentifier": "EC2_INSTANCE_DETAILED_MONITORING_ENABLED",
45648
45641
  "AwsConfigRuleName": "ec2-instance-detailed-monitoring-enabled",
45649
- "NIST-ID": "CA-7(a)|CA-7(b)|SI-4(2)|SI-4(a)|SI-4(b)|SI-4(c)",
45642
+ "NIST-ID": "CA-7|SI-4|SI-4(2)",
45650
45643
  "Rev": 5,
45651
45644
  "Source": "crosswalk"
45652
45645
  },
@@ -46129,7 +46122,7 @@ const mappings$1 = [
46129
46122
  {
46130
46123
  "AwsConfigRuleSourceIdentifier": "EMR_KERBEROS_ENABLED",
46131
46124
  "AwsConfigRuleName": "emr-kerberos-enabled",
46132
- "NIST-ID": "AC-2(j)|AC-3|AC-5(c)|AC-6",
46125
+ "NIST-ID": "AC-2|AC-3|AC-5|AC-6",
46133
46126
  "Rev": 5,
46134
46127
  "Source": "crosswalk"
46135
46128
  },
@@ -46234,7 +46227,7 @@ const mappings$1 = [
46234
46227
  {
46235
46228
  "AwsConfigRuleSourceIdentifier": "GUARDDUTY_NON_ARCHIVED_FINDINGS",
46236
46229
  "AwsConfigRuleName": "guardduty-non-archived-findings",
46237
- "NIST-ID": "IR-4(1)|IR-6(1)|IR-7(1)|RA-5|SA-10|SI-4(a)|SI-4(b)|SI-4(c)",
46230
+ "NIST-ID": "IR-4(1)|IR-6(1)|IR-7(1)|RA-5|SA-10|SI-4",
46238
46231
  "Rev": 5,
46239
46232
  "Source": "crosswalk"
46240
46233
  },
@@ -46248,7 +46241,7 @@ const mappings$1 = [
46248
46241
  {
46249
46242
  "AwsConfigRuleSourceIdentifier": "IAM_GROUP_HAS_USERS_CHECK",
46250
46243
  "AwsConfigRuleName": "iam-group-has-users-check",
46251
- "NIST-ID": "AC-2(j)|AC-3|AC-5(c)|AC-6|SC-2",
46244
+ "NIST-ID": "AC-2|AC-3|AC-5|AC-6|SC-2",
46252
46245
  "Rev": 5,
46253
46246
  "Source": "crosswalk"
46254
46247
  },
@@ -46360,7 +46353,7 @@ const mappings$1 = [
46360
46353
  {
46361
46354
  "AwsConfigRuleSourceIdentifier": "KMS_KEY_POLICY_NO_PUBLIC_ACCESS",
46362
46355
  "AwsConfigRuleName": "kms-key-policy-no-public-access",
46363
- "NIST-ID": "AC-21|AC-3|CA-9(1)|CM-3(6)|SC-13|SC-28|SC-28(1)|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
46356
+ "NIST-ID": "AC-21|AC-3|CM-3(6)|SC-13|SC-28|SC-28(1)|SC-7|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
46364
46357
  "Rev": 5,
46365
46358
  "Source": "derived-theme"
46366
46359
  },
@@ -46409,7 +46402,7 @@ const mappings$1 = [
46409
46402
  {
46410
46403
  "AwsConfigRuleSourceIdentifier": "LIGHTSAIL_BUCKET_ALLOW_PUBLIC_OVERRIDES_DISABLED",
46411
46404
  "AwsConfigRuleName": "lightsail-bucket-allow-public-overrides-disabled",
46412
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
46405
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(21)|SC-7(3)",
46413
46406
  "Rev": 5,
46414
46407
  "Source": "derived-theme"
46415
46408
  },
@@ -46472,7 +46465,7 @@ const mappings$1 = [
46472
46465
  {
46473
46466
  "AwsConfigRuleSourceIdentifier": "MQ_NO_PUBLIC_ACCESS",
46474
46467
  "AwsConfigRuleName": "mq-no-public-access",
46475
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
46468
+ "NIST-ID": "AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
46476
46469
  "Rev": 5,
46477
46470
  "Source": "derived-theme"
46478
46471
  },
@@ -46486,7 +46479,7 @@ const mappings$1 = [
46486
46479
  {
46487
46480
  "AwsConfigRuleSourceIdentifier": "MSK_CLUSTER_PUBLIC_ACCESS_DISABLED",
46488
46481
  "AwsConfigRuleName": "msk-cluster-public-access-disabled",
46489
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
46482
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
46490
46483
  "Rev": 5,
46491
46484
  "Source": "derived-theme"
46492
46485
  },
@@ -46801,7 +46794,7 @@ const mappings$1 = [
46801
46794
  {
46802
46795
  "AwsConfigRuleSourceIdentifier": "RDS_IN_BACKUP_PLAN",
46803
46796
  "AwsConfigRuleName": "rds-in-backup-plan",
46804
- "NIST-ID": "CP-10|CP-9(b)|SI-12",
46797
+ "NIST-ID": "CP-10|CP-9|SI-12",
46805
46798
  "Rev": 5,
46806
46799
  "Source": "crosswalk"
46807
46800
  },
@@ -47011,7 +47004,7 @@ const mappings$1 = [
47011
47004
  {
47012
47005
  "AwsConfigRuleSourceIdentifier": "REDSHIFT_SERVERLESS_WORKGROUP_NO_PUBLIC_ACCESS",
47013
47006
  "AwsConfigRuleName": "redshift-serverless-workgroup-no-public-access",
47014
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
47007
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
47015
47008
  "Rev": 5,
47016
47009
  "Source": "derived-theme"
47017
47010
  },
@@ -47067,7 +47060,7 @@ const mappings$1 = [
47067
47060
  {
47068
47061
  "AwsConfigRuleSourceIdentifier": "S3_ACCOUNT_LEVEL_PUBLIC_ACCESS_BLOCKS",
47069
47062
  "AwsConfigRuleName": "s3-account-level-public-access-blocks",
47070
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
47063
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
47071
47064
  "Rev": 5,
47072
47065
  "Source": "derived-theme"
47073
47066
  },
@@ -47207,7 +47200,7 @@ const mappings$1 = [
47207
47200
  {
47208
47201
  "AwsConfigRuleSourceIdentifier": "SAGEMAKER_ENDPOINT_CONFIG_PROD_INSTANCE_COUNT",
47209
47202
  "AwsConfigRuleName": "sagemaker-endpoint-config-prod-instance-count",
47210
- "NIST-ID": "CP-10|SA-13|SC-36|SC-5",
47203
+ "NIST-ID": "CP-10|SC-36|SC-5",
47211
47204
  "Rev": 5,
47212
47205
  "Source": "security-hub"
47213
47206
  },
@@ -47396,7 +47389,7 @@ const mappings$1 = [
47396
47389
  {
47397
47390
  "AwsConfigRuleSourceIdentifier": "SSM_AUTOMATION_BLOCK_PUBLIC_SHARING",
47398
47391
  "AwsConfigRuleName": "ssm-automation-block-public-sharing",
47399
- "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(4)|SC-7(9)",
47392
+ "NIST-ID": "AC-21|AC-3|SC-7|SC-7(11)|SC-7(16)|SC-7(21)|SC-7(3)|SC-7(9)",
47400
47393
  "Rev": 5,
47401
47394
  "Source": "derived-theme"
47402
47395
  },
@@ -47449,13 +47442,6 @@ const mappings$1 = [
47449
47442
  "Rev": 5,
47450
47443
  "Source": "security-hub"
47451
47444
  },
47452
- {
47453
- "AwsConfigRuleSourceIdentifier": "USING_SERVICE_LINKED_ROLES",
47454
- "AwsConfigRuleName": "using-service-linked-roles",
47455
- "NIST-ID": "CM-3|CM-6(1)|CM-8|CM-8(2)",
47456
- "Rev": 5,
47457
- "Source": "security-hub"
47458
- },
47459
47445
  {
47460
47446
  "AwsConfigRuleSourceIdentifier": "VPC_DEFAULT_SECURITY_GROUP_CLOSED",
47461
47447
  "AwsConfigRuleName": "vpc-default-security-group-closed",
@@ -47569,6 +47555,204 @@ const mappings$1 = [
47569
47555
  "Source": "derived-theme"
47570
47556
  }
47571
47557
  ];
47558
+ //#endregion
47559
+ //#region src/data/awsconfig-suppressions.json
47560
+ var awsconfig_suppressions_default = [
47561
+ {
47562
+ "rule": "apigateway-stage-access-logs-enabled",
47563
+ "control": "SC-7(9)",
47564
+ "revisions": [4, 5]
47565
+ },
47566
+ {
47567
+ "rule": "apigateway-stage-access-logs-enabled",
47568
+ "control": "SI-7(8)",
47569
+ "revisions": [4, 5]
47570
+ },
47571
+ {
47572
+ "rule": "appmesh-virtual-gateway-logging-file-path-exists",
47573
+ "control": "AU-10",
47574
+ "revisions": [4, 5]
47575
+ },
47576
+ {
47577
+ "rule": "appmesh-virtual-gateway-logging-file-path-exists",
47578
+ "control": "AU-2",
47579
+ "revisions": [4, 5]
47580
+ },
47581
+ {
47582
+ "rule": "appmesh-virtual-gateway-logging-file-path-exists",
47583
+ "control": "AU-3",
47584
+ "revisions": [4, 5]
47585
+ },
47586
+ {
47587
+ "rule": "appmesh-virtual-gateway-logging-file-path-exists",
47588
+ "control": "SC-7(9)",
47589
+ "revisions": [4, 5]
47590
+ },
47591
+ {
47592
+ "rule": "appmesh-virtual-node-logging-file-path-exists",
47593
+ "control": "AU-10",
47594
+ "revisions": [4, 5]
47595
+ },
47596
+ {
47597
+ "rule": "appmesh-virtual-node-logging-file-path-exists",
47598
+ "control": "AU-2",
47599
+ "revisions": [4, 5]
47600
+ },
47601
+ {
47602
+ "rule": "appmesh-virtual-node-logging-file-path-exists",
47603
+ "control": "AU-3",
47604
+ "revisions": [4, 5]
47605
+ },
47606
+ {
47607
+ "rule": "appmesh-virtual-node-logging-file-path-exists",
47608
+ "control": "SC-7(9)",
47609
+ "revisions": [4, 5]
47610
+ },
47611
+ {
47612
+ "rule": "apprunner-service-no-public-access",
47613
+ "control": "SC-7(4)",
47614
+ "revisions": [4, 5]
47615
+ },
47616
+ {
47617
+ "rule": "appsync-logging-enabled",
47618
+ "control": "SC-7(9)",
47619
+ "revisions": [4, 5]
47620
+ },
47621
+ {
47622
+ "rule": "athena-workgroup-logging-enabled",
47623
+ "control": "AU-3",
47624
+ "revisions": [4, 5]
47625
+ },
47626
+ {
47627
+ "rule": "athena-workgroup-logging-enabled",
47628
+ "control": "SC-7(9)",
47629
+ "revisions": [4, 5]
47630
+ },
47631
+ {
47632
+ "rule": "athena-workgroup-logging-enabled",
47633
+ "control": "SI-7(8)",
47634
+ "revisions": [4, 5]
47635
+ },
47636
+ {
47637
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47638
+ "control": "AC-4(26)",
47639
+ "revisions": [5]
47640
+ },
47641
+ {
47642
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47643
+ "control": "AU-12",
47644
+ "revisions": [4, 5]
47645
+ },
47646
+ {
47647
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47648
+ "control": "AU-2",
47649
+ "revisions": [4, 5]
47650
+ },
47651
+ {
47652
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47653
+ "control": "AU-3",
47654
+ "revisions": [4, 5]
47655
+ },
47656
+ {
47657
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47658
+ "control": "AU-6(3)",
47659
+ "revisions": [4, 5]
47660
+ },
47661
+ {
47662
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47663
+ "control": "AU-6(4)",
47664
+ "revisions": [4, 5]
47665
+ },
47666
+ {
47667
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47668
+ "control": "CA-7",
47669
+ "revisions": [4, 5]
47670
+ },
47671
+ {
47672
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47673
+ "control": "SC-7(9)",
47674
+ "revisions": [4, 5]
47675
+ },
47676
+ {
47677
+ "rule": "cloudtrail-s3-bucket-public-access-prohibited",
47678
+ "control": "SI-7(8)",
47679
+ "revisions": [4, 5]
47680
+ },
47681
+ {
47682
+ "rule": "ebs-snapshot-block-public-access",
47683
+ "control": "SC-7(4)",
47684
+ "revisions": [4, 5]
47685
+ },
47686
+ {
47687
+ "rule": "kms-key-policy-no-public-access",
47688
+ "control": "CA-9(1)",
47689
+ "revisions": [4, 5]
47690
+ },
47691
+ {
47692
+ "rule": "kms-key-policy-no-public-access",
47693
+ "control": "SC-7(11)",
47694
+ "revisions": [4, 5]
47695
+ },
47696
+ {
47697
+ "rule": "lightsail-bucket-allow-public-overrides-disabled",
47698
+ "control": "SC-7(11)",
47699
+ "revisions": [4, 5]
47700
+ },
47701
+ {
47702
+ "rule": "lightsail-bucket-allow-public-overrides-disabled",
47703
+ "control": "SC-7(16)",
47704
+ "revisions": [4, 5]
47705
+ },
47706
+ {
47707
+ "rule": "lightsail-bucket-allow-public-overrides-disabled",
47708
+ "control": "SC-7(4)",
47709
+ "revisions": [4, 5]
47710
+ },
47711
+ {
47712
+ "rule": "lightsail-bucket-allow-public-overrides-disabled",
47713
+ "control": "SC-7(9)",
47714
+ "revisions": [4, 5]
47715
+ },
47716
+ {
47717
+ "rule": "mq-no-public-access",
47718
+ "control": "AC-21",
47719
+ "revisions": [4, 5]
47720
+ },
47721
+ {
47722
+ "rule": "mq-no-public-access",
47723
+ "control": "SC-7(4)",
47724
+ "revisions": [4, 5]
47725
+ },
47726
+ {
47727
+ "rule": "msk-cluster-public-access-disabled",
47728
+ "control": "SC-7(4)",
47729
+ "revisions": [4, 5]
47730
+ },
47731
+ {
47732
+ "rule": "redshift-serverless-workgroup-no-public-access",
47733
+ "control": "SC-7(4)",
47734
+ "revisions": [4, 5]
47735
+ },
47736
+ {
47737
+ "rule": "s3-account-level-public-access-blocks",
47738
+ "control": "SC-7(4)",
47739
+ "revisions": [5]
47740
+ },
47741
+ {
47742
+ "rule": "ssm-automation-block-public-sharing",
47743
+ "control": "SC-7(4)",
47744
+ "revisions": [4, 5]
47745
+ }
47746
+ ];
47747
+ //#endregion
47748
+ //#region src/awsconfig/index.ts
47749
+ const mappings$1 = awsconfig_mappings_default;
47750
+ /**
47751
+ * The maintainer-reviewed (rule, control) removals the generator applied to
47752
+ * the mapping table — exposed so a consumer can distinguish "removed by
47753
+ * review" from "never mapped by the sources".
47754
+ */
47755
+ const awsConfigSuppressions = awsconfig_suppressions_default;
47572
47756
  const byIdentifier = /* @__PURE__ */ new Map();
47573
47757
  const byRuleName = /* @__PURE__ */ new Map();
47574
47758
  for (const m of mappings$1) {
@@ -47750,6 +47934,6 @@ function getAllHipcheckMappings() {
47750
47934
  return [...mappings];
47751
47935
  }
47752
47936
  //#endregion
47753
- export { DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS, DEFAULT_CONFIG_MANAGEMENT_NIST_TAGS, DEFAULT_NIST_REVISION, DEFAULT_REMEDIATION_NIST_TAGS, DEFAULT_STATIC_ANALYSIS_NIST_TAGS, SUPPORTED_NIST_REVISIONS, awsConfigIdentifierExists, awsConfigMappedRevisions, awsConfigRuleNameExists, cciExists, cweExists, getAllAwsConfigIdentifiers, getAllAwsConfigMappings, getAllAwsConfigRuleNames, getAllCCIIds, getAllCweIds, getAllCweMappings, getAllHipcheckAnalyses, getAllHipcheckMappings, getAllNISTIds, getAllNessusMappings, getAllNessusPluginFamilies, getAllNiktoIds, getAllNiktoMappings, getAllOwaspIds, getAllOwaspMappings, getAllScoutsuiteMappings, getAllScoutsuiteRules, getAwsConfigNistControlByIdentifier, getAwsConfigNistControlByName, getAwsConfigNistControlsBySubstring, getAwsConfigNistMappingByIdentifier, getAwsConfigNistMappingByName, getCCIDescription, getCCINistMappings, getCurrentNistRevision, getCweName, getCweNistControl, getCweNistMapping, getHipcheckNistControls, getNISTDescription, getNISTFamily, getNessusNistControl, getNessusPluginFamilyMappings, getNiktoNistControl, getNistCCIMappings, getOwaspName, getOwaspNistControl, getOwaspNistMapping, getScoutsuiteNistControl, getScoutsuiteNistMapping, hipcheckAnalysisExists, isNistStrict, nessusPluginFamilyExists, niktoExists, nistControlsAtRevision, nistExists, nistRosterSize, nistToCci, owaspExists, resetNistRevision, scoutsuiteRuleExists, setCurrentNistRevision, setNistStrict, translateNistControl, translateNistControls };
47937
+ export { DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS, DEFAULT_CONFIG_MANAGEMENT_NIST_TAGS, DEFAULT_NIST_REVISION, DEFAULT_REMEDIATION_NIST_TAGS, DEFAULT_STATIC_ANALYSIS_NIST_TAGS, SUPPORTED_NIST_REVISIONS, awsConfigIdentifierExists, awsConfigMappedRevisions, awsConfigRuleNameExists, awsConfigSuppressions, cciExists, cweExists, getAllAwsConfigIdentifiers, getAllAwsConfigMappings, getAllAwsConfigRuleNames, getAllCCIIds, getAllCweIds, getAllCweMappings, getAllHipcheckAnalyses, getAllHipcheckMappings, getAllNISTIds, getAllNessusMappings, getAllNessusPluginFamilies, getAllNiktoIds, getAllNiktoMappings, getAllOwaspIds, getAllOwaspMappings, getAllScoutsuiteMappings, getAllScoutsuiteRules, getAwsConfigNistControlByIdentifier, getAwsConfigNistControlByName, getAwsConfigNistControlsBySubstring, getAwsConfigNistMappingByIdentifier, getAwsConfigNistMappingByName, getCCIDescription, getCCINistMappings, getCurrentNistRevision, getCweName, getCweNistControl, getCweNistMapping, getHipcheckNistControls, getNISTDescription, getNISTFamily, getNessusNistControl, getNessusPluginFamilyMappings, getNiktoNistControl, getNistCCIMappings, getOwaspName, getOwaspNistControl, getOwaspNistMapping, getScoutsuiteNistControl, getScoutsuiteNistMapping, hipcheckAnalysisExists, isNistStrict, nessusPluginFamilyExists, niktoExists, nistControlsAtRevision, nistExists, nistRosterSize, nistToCci, owaspExists, resetNistRevision, scoutsuiteRuleExists, setCurrentNistRevision, setNistStrict, translateNistControl, translateNistControls };
47754
47938
 
47755
47939
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["rawCrosswalk","rawNistDataRev4","rawNistDataRev5","NATIVE_REVISION","rawCCIData","rawNistCCIData","NATIVE_REVISION","atCurrentRevision","rawOwaspData","mappings","rawMappings","NATIVE_REVISION","atCurrentRevision","mappings","rawMappings","NATIVE_REVISION","atCurrentRevision","mappings","rawMappings","NATIVE_REVISION","mappings","rawMappings","mappings","rawMappings","rawMappings"],"sources":["../src/data/cci-mappings.json","../src/data/nist-cci-mappings.json","../src/data/nist-descriptions.json","../src/data/nist-descriptions-rev5.json","../src/data/nist-revision-crosswalk.json","../src/nist/crosswalk.ts","../src/nist/index.ts","../src/cci/index.ts","../src/data/owasp-nist-mappings.json","../src/owasp/index.ts","../src/data/cwe-nist-mappings.json","../src/cwe/index.ts","../src/data/nessus-nist-mappings.json","../src/nessus/index.ts","../src/data/nikto-nist-mappings.json","../src/nikto/index.ts","../src/data/scoutsuite-nist-mappings.json","../src/scoutsuite/index.ts","../src/data/awsconfig-mappings.json","../src/awsconfig/index.ts","../src/data/hipcheck-nist-mappings.json","../src/hipcheck/index.ts"],"sourcesContent":["","","","","","/**\n * NIST SP 800-53 Rev 4 <-> Rev 5 control crosswalk, generated from NIST's own\n * comparison workbooks (see scripts/generate-nist-crosswalk.mjs). Identity is\n * implicit: a control present in both revisions translates to itself; edges\n * cover only non-identity cases (withdrawn, moved, incorporated, Appendix J\n * pointers, and controls new in Rev 5).\n */\n\nimport rawCrosswalk from '../data/nist-revision-crosswalk.json';\n\n/**\n * Relations a translation can carry. `identity` means the control exists at\n * both revisions under the same ID; `moved`/`incorporated`/`pointer`/`family`\n * come from NIST's comparison workbooks; `none` means NIST names no successor;\n * `unknown` means the control is not part of the source revision's catalog (or\n * the revision pair is unsupported).\n */\nexport type NistCrosswalkRelation =\n | 'identity'\n | 'moved'\n | 'incorporated'\n | 'pointer'\n | 'family'\n | 'none'\n | 'unknown';\n\nexport interface NistControlTranslation {\n control: string;\n targets: string[];\n relation: NistCrosswalkRelation;\n /**\n * Set only for relation `family` (\"incorporated into <XX> family\"): a\n * marker, deliberately never expanded into member controls.\n */\n family?: string;\n /** NIST's raw comparison text for redirects. */\n detail?: string;\n}\n\ninterface CrosswalkEdge {\n from: number;\n control: string;\n targets: string[];\n relation: string;\n family?: string;\n detail: string;\n}\n\ninterface CrosswalkFile {\n rosters: Record<string, string[]>;\n edges: CrosswalkEdge[];\n}\n\nconst crosswalk = rawCrosswalk as unknown as CrosswalkFile;\n\nconst rosters = new Map<number, Set<string>>(\n Object.entries(crosswalk.rosters).map(([rev, ids]) => [Number(rev), new Set(ids)])\n);\n\nconst edges = new Map<number, Map<string, CrosswalkEdge>>();\nfor (const edge of crosswalk.edges) {\n let byControl = edges.get(edge.from);\n if (!byControl) {\n byControl = new Map();\n edges.set(edge.from, byControl);\n }\n byControl.set(edge.control, edge);\n}\n\nconst SUPPORTED = new Set([4, 5]);\n/** A trailing single-letter statement part, e.g. \"AC-2(j)\". */\nconst STATEMENT_LETTER = /^(.*)\\(([a-z])\\)$/;\n\nfunction fromEdge(control: string, edge: CrosswalkEdge): NistControlTranslation {\n const tr: NistControlTranslation = {\n control,\n targets: [...edge.targets],\n relation: edge.relation as NistCrosswalkRelation,\n detail: edge.detail,\n };\n if (edge.family) tr.family = edge.family;\n return tr;\n}\n\nfunction identity(control: string): NistControlTranslation {\n return { control, targets: [control], relation: 'identity' };\n}\n\n/**\n * Translates one NIST control ID between 800-53 revisions 4 and 5. A control\n * present in both revisions translates to itself (identity); withdrawn, moved,\n * incorporated, and Appendix J controls follow NIST's published successors; a\n * control with no equivalent at the target revision gets relation `none` and\n * no targets. Statement-letter suffixes (\"AC-2(j)\") survive identity\n * translation and are dropped on redirects.\n */\nexport function translateNistControl(\n control: string,\n from: number,\n to: number\n): NistControlTranslation {\n if (!control || !SUPPORTED.has(from) || !SUPPORTED.has(to)) {\n return { control, targets: [], relation: 'unknown' };\n }\n if (from === to) return identity(control);\n\n const edge = edges.get(from)?.get(control);\n if (edge) return fromEdge(control, edge);\n if (rosters.get(from)?.has(control) && rosters.get(to)?.has(control)) {\n return identity(control);\n }\n\n const base = STATEMENT_LETTER.exec(control)?.[1];\n if (base) {\n const baseEdge = edges.get(from)?.get(base);\n if (baseEdge) return fromEdge(control, baseEdge);\n if (rosters.get(from)?.has(base) && rosters.get(to)?.has(base)) {\n return identity(control);\n }\n }\n return { control, targets: [], relation: 'unknown' };\n}\n\n/**\n * Translates a list of control IDs between revisions, flattening redirect\n * targets and deduplicating while preserving first-seen order. Controls with\n * no target at the destination revision (withdrawn without successor,\n * family-level, or unknown) are returned in `unmapped`, in input order, so\n * callers can surface them instead of silently dropping.\n */\nexport function translateNistControls(\n controls: string[],\n from: number,\n to: number\n): { translated: string[]; unmapped: NistControlTranslation[] } {\n const translated: string[] = [];\n const unmapped: NistControlTranslation[] = [];\n const seen = new Set<string>();\n for (const control of controls) {\n const tr = translateNistControl(control, from, to);\n if (tr.targets.length === 0) {\n unmapped.push(tr);\n continue;\n }\n for (const target of tr.targets) {\n if (!seen.has(target)) {\n seen.add(target);\n translated.push(target);\n }\n }\n }\n return { translated, unmapped };\n}\n\n/**\n * Number of control IDs in the crosswalk's catalog for the given revision, or\n * 0 for unsupported revisions.\n */\nexport function nistRosterSize(rev: number): number {\n return rosters.get(rev)?.size ?? 0;\n}\n\n/**\n * A NIST-shaped base at the start of a longer reference, e.g. \"AC-1 a\",\n * \"AC-1.2 (i)\", \"SA-12 b 1\" — DISA-CCI statement-reference styles.\n */\nconst BASE_CONTROL = /^([A-Z]{2}-\\d+(?:\\(\\d+\\))?)/;\n\n/**\n * Translates a control list authored against `nativeRev` into `rev`. Identity\n * when the revisions are equal (or either is unsupported). Per token: the\n * crosswalk redirect is followed when one exists; statement-style suffixes\n * (\"AC-1 a\", \"AC-1.2 (i)\") are kept on identity and dropped on redirects;\n * tokens with no equivalent at the target revision are dropped (the analog of\n * the awsconfig empty-NIST-ID marker); tokens outside both NIST catalogs\n * (tool placeholders like \"UM-1\") pass through unchanged — they are not ours\n * to drop. Output is deduplicated preserving first-seen order.\n */\nexport function nistControlsAtRevision(\n controls: string[],\n nativeRev: number,\n rev: number\n): string[] {\n if (nativeRev === rev || !SUPPORTED.has(nativeRev) || !SUPPORTED.has(rev)) {\n return controls;\n }\n const seen = new Set<string>();\n const out: string[] = [];\n const add = (c: string): void => {\n if (c && !seen.has(c)) {\n seen.add(c);\n out.push(c);\n }\n };\n for (const c of controls) {\n const tr = translateNistControl(c, nativeRev, rev);\n if (tr.relation !== 'unknown') {\n tr.targets.forEach(add);\n continue;\n }\n const base = BASE_CONTROL.exec(c)?.[1];\n if (base && base !== c) {\n const btr = translateNistControl(base, nativeRev, rev);\n if (btr.relation === 'identity') {\n add(c);\n continue;\n }\n if (btr.relation !== 'unknown') {\n btr.targets.forEach(add);\n continue;\n }\n }\n add(c);\n }\n return out;\n}\n","/**\n * NIST SP 800-53 control description functions\n */\n\nimport type { NISTDescriptions } from './types.js';\nimport rawNistDataRev4 from '../data/nist-descriptions.json';\nimport rawNistDataRev5 from '../data/nist-descriptions-rev5.json';\n\n// Descriptions are revision-specific: Rev 5 renamed titles (\"... POLICY AND\n// PROCEDURES\" -> \"Policy and Procedures\"), added the SR and PT families, and\n// withdrew Rev 4 controls (AU-15, IR-10, SA-12, ...). Each revision has its own\n// dataset; lookups select by the (optionally overridden) global revision.\nconst nistDataByRev: Record<number, NISTDescriptions> = {\n 4: rawNistDataRev4 as NISTDescriptions,\n 5: rawNistDataRev5 as NISTDescriptions,\n};\n\n/**\n * NIST SP 800-53 revision selection.\n *\n * The revision is a module-global default that every NIST-emitting mapping\n * consults through its default lookups. Set it once at startup (the CLI's\n * `--nist-rev` flag does this) to switch the catalog all converters target.\n * For explicit, side-effect-free per-call selection, pass an explicit `rev` to\n * the mapping lookups instead of mutating this.\n */\n\n/** The revision mappings emit when nothing overrides it. */\nexport const DEFAULT_NIST_REVISION = 5;\n\n/**\n * The description dataset for a revision, falling back to the default revision's\n * data (then an empty set) for an unsupported revision.\n */\nfunction descriptionsFor(rev: number): NISTDescriptions {\n return nistDataByRev[rev] ?? nistDataByRev[DEFAULT_NIST_REVISION] ?? {};\n}\n\n/** Revisions every NIST-emitting mapping table has rows for. */\nexport const SUPPORTED_NIST_REVISIONS: readonly number[] = [4, 5];\n\nlet currentNistRevision = DEFAULT_NIST_REVISION;\n\n/** Get the module-global default NIST revision. */\nexport function getCurrentNistRevision(): number {\n return currentNistRevision;\n}\n\n/**\n * Set the module-global default NIST revision. Throws (without mutating state)\n * if the revision has no mapping data.\n */\nexport function setCurrentNistRevision(rev: number): void {\n if (!SUPPORTED_NIST_REVISIONS.includes(rev)) {\n throw new Error(\n `unsupported NIST revision ${rev} (supported: ${SUPPORTED_NIST_REVISIONS.join(', ')})`\n );\n }\n currentNistRevision = rev;\n}\n\n/** Restore the default revision. Intended for cleanup and tests. */\nexport function resetNistRevision(): void {\n currentNistRevision = DEFAULT_NIST_REVISION;\n}\n\nlet nistStrict = false;\n\n/** Report whether strict NIST revision alignment is enabled. */\nexport function isNistStrict(): boolean {\n return nistStrict;\n}\n\n/**\n * Toggle strict NIST revision alignment. When enabled, revision-divergent\n * mappings treat a rule mapped only at another revision as a hard error rather\n * than a silent omission.\n */\nexport function setNistStrict(strict: boolean): void {\n nistStrict = strict;\n}\n\n/**\n * Get the description for a NIST control ID at the selected revision.\n *\n * @param nistId - The NIST control ID (e.g., 'AC-01', 'AC-01 a', 'AC-02 01')\n * @param rev - NIST revision to look up; defaults to the module-global revision\n * @returns The control's Rev-specific description, or undefined if not found at\n * that revision (e.g. a Rev 5-only SR/PT control at Rev 4, or a Rev 4 control\n * withdrawn in Rev 5)\n *\n * @example\n * ```typescript\n * getNISTDescription('AC-01'); // Rev 5 default -> \"Policy and Procedures\"\n * getNISTDescription('AC-01', 4); // -> \"ACCESS CONTROL POLICY AND PROCEDURES\"\n * ```\n */\nexport function getNISTDescription(\n nistId: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n if (!nistId || typeof nistId !== 'string') {\n return undefined;\n }\n\n return descriptionsFor(rev)[nistId];\n}\n\n/**\n * Get all NIST control IDs present at the selected revision.\n *\n * @param rev - NIST revision to enumerate; defaults to the module-global revision\n * @returns Array of NIST control IDs for that revision (Rev 5 includes the\n * SR/PT families; Rev 4 includes controls withdrawn in Rev 5)\n *\n * @example\n * ```typescript\n * const ids = getAllNISTIds();\n * // Returns: ['AC-01', 'AC-01 a', 'AC-02', ...]\n * ```\n */\nexport function getAllNISTIds(rev: number = getCurrentNistRevision()): string[] {\n return Object.keys(descriptionsFor(rev));\n}\n\n/**\n * Check if a NIST control ID exists at the selected revision.\n *\n * @param nistId - The NIST control ID to check\n * @param rev - NIST revision to check against; defaults to the module-global revision\n * @returns true if the control exists at that revision (e.g. an SR/PT control is\n * present at Rev 5 but not Rev 4)\n *\n * @example\n * ```typescript\n * if (nistExists('AC-01')) {\n * console.log('NIST control found');\n * }\n * ```\n */\nexport function nistExists(nistId: string, rev: number = getCurrentNistRevision()): boolean {\n if (!nistId || typeof nistId !== 'string') {\n return false;\n }\n\n return nistId in descriptionsFor(rev);\n}\n\n/**\n * Extract the NIST family from a NIST control ID, if that family exists at the\n * selected revision.\n *\n * @param nistId - The NIST control ID (e.g., 'AC-01', 'AC-01 a')\n * @param rev - NIST revision to validate against; defaults to the module-global revision\n * @returns The NIST family code (e.g., 'AC'), or undefined if invalid or the\n * family is absent at that revision (the SR/PT families are Rev 5-only)\n *\n * @example\n * ```typescript\n * const family = getNISTFamily('AC-01');\n * // Returns: 'AC'\n *\n * const family2 = getNISTFamily('AC-01 a 01');\n * // Returns: 'AC'\n * ```\n */\nexport function getNISTFamily(\n nistId: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n if (!nistId || typeof nistId !== 'string') {\n return undefined;\n }\n\n // Extract family from format like \"AC-01\" or \"AC-01 a\"\n const match = nistId.match(/^([A-Z]{2})-/);\n if (!match) {\n return undefined;\n }\n\n const family = match[1];\n\n // Validate that this family exists at the selected revision by checking\n // if any controls start with this family (the SR/PT families are Rev 5-only).\n const familyPrefix = `${family}-`;\n const hasFamily = Object.keys(descriptionsFor(rev)).some((key) => key.startsWith(familyPrefix));\n\n return hasFamily ? family : undefined;\n}\n\n/**\n * Canonical NIST 800-53 fallback tags for converters when a finding has no\n * CWE or the CWE has no NIST mapping. Categories match heimdall2's global.ts.\n *\n * - SA-11: Developer Security Testing and Evaluation\n * - RA-5: Vulnerability Monitoring and Scanning\n * - SI-2: Flaw Remediation\n * - CM-8: System Component Inventory\n */\n\n/** Static analysis and vulnerability scanning tools (SA-11 + RA-5). */\nexport const DEFAULT_STATIC_ANALYSIS_NIST_TAGS: string[] = ['SA-11', 'RA-5'];\n\n/** Tools that identify outdated packages or flaws requiring patching (SI-2 + RA-5). */\nexport const DEFAULT_REMEDIATION_NIST_TAGS: string[] = ['SI-2', 'RA-5'];\n\n/** Dependency/inventory management tools (CM-8). */\nexport const DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS: string[] = ['CM-8'];\n\n/** Configuration-compliance checks with no specific mapping (CM-6: Configuration Settings). */\nexport const DEFAULT_CONFIG_MANAGEMENT_NIST_TAGS: string[] = ['CM-6'];\n\n// Rev 4 <-> Rev 5 crosswalk\nexport {\n translateNistControl,\n translateNistControls,\n nistRosterSize,\n nistControlsAtRevision,\n} from './crosswalk.js';\nexport type { NistControlTranslation, NistCrosswalkRelation } from './crosswalk.js';\n\n// Re-export types\nexport type { NISTDescriptions } from './types.js';\n","/**\n * CCI (Control Correlation Identifier) mapping functions\n */\n\nimport type { CCIMappings, NistCCIMappings } from './types.js';\nimport rawCCIData from '../data/cci-mappings.json';\nimport rawNistCCIData from '../data/nist-cci-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// The DISA CCI list's NIST references are Rev 4-era (they include Appendix J\n// privacy controls and SA-12/SA-19, all withdrawn or relocated in Rev 5).\n// getCCINistMappings translates to the current module-global revision.\nconst NATIVE_REVISION = 4;\n\nconst cciData = rawCCIData as CCIMappings;\nconst nistCCIData = rawNistCCIData as NistCCIMappings;\n\n/**\n * Get the definition/description for a CCI ID.\n *\n * @param cciId - The CCI ID (e.g., 'CCI-000001')\n * @returns The CCI definition, or undefined if not found\n *\n * @example\n * ```typescript\n * const def = getCCIDescription('CCI-000001');\n * // Returns: \"The organization develops an access control policy...\"\n * ```\n */\nexport function getCCIDescription(cciId: string): string | undefined {\n if (!cciId || typeof cciId !== 'string') {\n return undefined;\n }\n\n const item = cciData[cciId];\n return item?.def;\n}\n\n/**\n * Get the NIST control mappings for a CCI ID.\n *\n * @param cciId - The CCI ID (e.g., 'CCI-000001')\n * @returns Array of NIST control references, or undefined if not found\n *\n * @example\n * ```typescript\n * const mappings = getCCINistMappings('CCI-000001');\n * // Returns: ['AC-1 a', 'AC-1.1 (i and ii)', 'AC-1 a 1']\n * ```\n */\nexport function getCCINistMappings(cciId: string): string[] | undefined {\n if (!cciId || typeof cciId !== 'string') {\n return undefined;\n }\n\n const item = cciData[cciId];\n if (!item) return undefined;\n return nistControlsAtRevision(item.nist, NATIVE_REVISION, getCurrentNistRevision());\n}\n\n/**\n * Get all CCI IDs available in the database.\n *\n * @returns Array of all CCI IDs\n *\n * @example\n * ```typescript\n * const ids = getAllCCIIds();\n * // Returns: ['CCI-000001', 'CCI-000002', ...]\n * ```\n */\nexport function getAllCCIIds(): string[] {\n return Object.keys(cciData);\n}\n\n/**\n * Check if a CCI ID exists in the database.\n *\n * @param cciId - The CCI ID to check\n * @returns true if the CCI exists, false otherwise\n *\n * @example\n * ```typescript\n * if (cciExists('CCI-000001')) {\n * console.log('CCI found');\n * }\n * ```\n */\nexport function cciExists(cciId: string): boolean {\n if (!cciId || typeof cciId !== 'string') {\n return false;\n }\n\n return cciId in cciData;\n}\n\n/**\n * Extract the base NIST control identifier from a potentially qualified string.\n * For example, \"SI-10 a 1\" → \"SI-10\", \"AC-3 (2)\" → \"AC-3\".\n */\nfunction baseNistControl(control: string): string {\n const idx = control.search(/[ (.]/);\n return idx === -1 ? control : control.slice(0, idx);\n}\n\n/**\n * Get CCI IDs for a NIST control using the curated mapping table.\n * The input is normalized to its base control before lookup.\n *\n * @param nistControl - NIST control string (e.g., 'SI-10', 'AC-3 (2)')\n * @returns Array of CCI IDs, or undefined if not found\n *\n * @example\n * ```typescript\n * const ccis = getNistCCIMappings('SI-10');\n * // Returns: ['CCI-001310']\n * ```\n */\nexport function getNistCCIMappings(nistControl: string): string[] | undefined {\n if (!nistControl || typeof nistControl !== 'string') {\n return undefined;\n }\n const base = baseNistControl(nistControl);\n return nistCCIData[base];\n}\n\n/**\n * Map NIST 800-53 controls to their CCI IDs using the curated mapping table.\n * Results are deduplicated and sorted.\n *\n * @param nistControls - Array of NIST control strings\n * @returns Deduplicated, sorted array of CCI IDs (empty array if no mappings found)\n *\n * @example\n * ```typescript\n * const ccis = nistToCci(['AC-3', 'SI-10']);\n * // Returns: ['CCI-000213', 'CCI-001310']\n * ```\n */\nexport function nistToCci(nistControls: string[]): string[] {\n const seen = new Set<string>();\n for (const control of nistControls) {\n const ccis = getNistCCIMappings(control);\n if (ccis) {\n for (const cciId of ccis) {\n seen.add(cciId);\n }\n }\n }\n return Array.from(seen).sort();\n}\n\n// Re-export types\nexport type { CCIItem, CCIMappings, NistCCIMappings } from './types.js';\n","","/**\n * OWASP Top 10 to NIST mapping functions\n */\n\nimport type { OwaspNistMappings, OwaspNistMapping } from './types.js';\nimport rawOwaspData from '../data/owasp-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 4 (declared Rev: 4 in the data; every control it\n// carries is identical at both revisions today — a test guards that\n// invariant). Lookups translate to the current module-global revision.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst owaspData = rawOwaspData as OwaspNistMappings;\nconst owaspIndex = new Map<string, OwaspNistMapping>(\n owaspData.map(item => [item['OWASP-ID'], item])\n);\n\n/**\n * Get the NIST mapping for an OWASP Top 10 ID.\n *\n * @param owaspId - The OWASP ID (e.g., 'A1', 'A2')\n * @returns The mapping object, or undefined if not found\n *\n * @example\n * ```typescript\n * const mapping = getOwaspNistMapping('A1');\n * // Returns: { 'OWASP-ID': 'A1', 'OWASP Name': 'Injection', 'NIST-ID': 'SI-10', ... }\n * ```\n */\nexport function getOwaspNistMapping(owaspId: string): OwaspNistMapping | undefined {\n if (!owaspId || typeof owaspId !== 'string') {\n return undefined;\n }\n\n return owaspIndex.get(owaspId);\n}\n\n/**\n * Get the NIST control ID for an OWASP Top 10 ID.\n *\n * @param owaspId - The OWASP ID (e.g., 'A1', 'A2')\n * @returns The NIST control ID, or undefined if not found\n *\n * @example\n * ```typescript\n * const nistId = getOwaspNistControl('A1');\n * // Returns: 'SI-10'\n * ```\n */\nexport function getOwaspNistControl(owaspId: string): string | undefined {\n const mapping = getOwaspNistMapping(owaspId);\n return mapping ? atCurrentRevision(mapping['NIST-ID']) : undefined;\n}\n\n/**\n * Get the OWASP vulnerability name for an OWASP ID.\n *\n * @param owaspId - The OWASP ID (e.g., 'A1', 'A2')\n * @returns The OWASP vulnerability name, or undefined if not found\n *\n * @example\n * ```typescript\n * const name = getOwaspName('A1');\n * // Returns: 'Injection'\n * ```\n */\nexport function getOwaspName(owaspId: string): string | undefined {\n const mapping = getOwaspNistMapping(owaspId);\n return mapping?.['OWASP Name'];\n}\n\n/**\n * Get all OWASP IDs available in the database.\n *\n * @returns Array of all OWASP IDs\n *\n * @example\n * ```typescript\n * const ids = getAllOwaspIds();\n * // Returns: ['A1', 'A2', 'A3', ..., 'A10']\n * ```\n */\nexport function getAllOwaspIds(): string[] {\n return Array.from(owaspIndex.keys());\n}\n\n/**\n * Check if an OWASP ID exists in the database.\n *\n * @param owaspId - The OWASP ID to check\n * @returns true if the OWASP ID exists, false otherwise\n *\n * @example\n * ```typescript\n * if (owaspExists('A1')) {\n * console.log('OWASP ID found');\n * }\n * ```\n */\nexport function owaspExists(owaspId: string): boolean {\n if (!owaspId || typeof owaspId !== 'string') {\n return false;\n }\n\n return owaspIndex.has(owaspId);\n}\n\n/**\n * Get all OWASP to NIST mappings.\n *\n * @returns Array of all mappings\n *\n * @example\n * ```typescript\n * const mappings = getAllOwaspMappings();\n * // Returns all 10 OWASP Top 10 mappings\n * ```\n */\nexport function getAllOwaspMappings(): OwaspNistMappings {\n return owaspData;\n}\n\n// Re-export types\nexport type { OwaspNistMapping, OwaspNistMappings } from './types.js';\n","","/**\n * Query functions for CWE to NIST mappings.\n *\n * Lookups are revision-aware: each accepts an optional `rev` defaulting to the\n * module-global current revision, so existing callers keep getting the default.\n */\n\nimport type { CweNistMapping, CweNistMappings } from './types.js';\nimport { getCurrentNistRevision } from '../nist/index.js';\nimport rawMappings from '../data/cwe-nist-mappings.json';\n\nconst mappings = rawMappings as CweNistMappings;\n\n// revision → (CWE-ID → mapping)\nconst byRev = new Map<number, Map<number, CweNistMapping>>();\nfor (const m of mappings) {\n let idx = byRev.get(m.Rev);\n if (!idx) {\n idx = new Map<number, CweNistMapping>();\n byRev.set(m.Rev, idx);\n }\n idx.set(m['CWE-ID'], m);\n}\n\nfunction indexFor(rev: number): Map<number, CweNistMapping> {\n return byRev.get(rev) ?? new Map<number, CweNistMapping>();\n}\n\n/** Get the full mapping for a CWE ID at the given NIST revision. */\nexport function getCweNistMapping(\n cweId: number,\n rev: number = getCurrentNistRevision()\n): CweNistMapping | undefined {\n return indexFor(rev).get(cweId);\n}\n\n/** Get the NIST control ID for a CWE ID at the given NIST revision. */\nexport function getCweNistControl(cweId: number, rev: number = getCurrentNistRevision()): string | undefined {\n return getCweNistMapping(cweId, rev)?.['NIST-ID'];\n}\n\n/** Get the CWE name for a CWE ID at the given NIST revision. */\nexport function getCweName(cweId: number, rev: number = getCurrentNistRevision()): string | undefined {\n return getCweNistMapping(cweId, rev)?.['CWE Name'];\n}\n\n/** Get all CWE IDs present at the given NIST revision. */\nexport function getAllCweIds(rev: number = getCurrentNistRevision()): number[] {\n return Array.from(indexFor(rev).keys());\n}\n\n/** Check whether a CWE ID exists at the given NIST revision. */\nexport function cweExists(cweId: number, rev: number = getCurrentNistRevision()): boolean {\n return indexFor(rev).has(cweId);\n}\n\n/** Get all CWE to NIST mappings (all revisions). */\nexport function getAllCweMappings(): CweNistMappings {\n return [...mappings];\n}\n","","/**\n * Query functions for Nessus to NIST mappings\n */\n\nimport type { NessusNistMappings } from './types.js';\nimport rawMappings from '../data/nessus-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// The table was authored against NIST 800-53 Rev 4 (heimdall2's mapping; it\n// carries AU-8(1), withdrawn in Rev 5). Lookups translate to the current\n// module-global revision via the NIST crosswalk.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst mappings = rawMappings as NessusNistMappings;\n\n/**\n * Get the NIST control ID for a Nessus plugin family and plugin ID\n * @param pluginFamily - The Nessus plugin family\n * @param pluginId - The Nessus plugin ID (optional, defaults to \"*\")\n * @returns The NIST control ID or undefined if not found\n */\nexport function getNessusNistControl(\n pluginFamily: string,\n pluginId = '*'\n): string | undefined {\n // The mapping data carries numeric plugin IDs alongside the \"*\" wildcard, so\n // compare on the string form — a strict === against the raw value never\n // matches a scan's (string) plugin ID.\n const exactMatch = mappings.find(\n (m) => m.pluginFamily === pluginFamily && String(m.pluginID) === pluginId\n );\n if (exactMatch) {\n return atCurrentRevision(exactMatch['NIST-ID']);\n }\n\n // Fall back to wildcard match\n const wildcardMatch = mappings.find(\n (m) => m.pluginFamily === pluginFamily && String(m.pluginID) === '*'\n );\n return wildcardMatch ? atCurrentRevision(wildcardMatch['NIST-ID']) : undefined;\n}\n\n/**\n * Get all mappings for a plugin family\n * @param pluginFamily - The Nessus plugin family\n * @returns Array of mappings for the plugin family\n */\nexport function getNessusPluginFamilyMappings(\n pluginFamily: string\n): NessusNistMappings {\n return mappings.filter((m) => m.pluginFamily === pluginFamily);\n}\n\n/**\n * Get all plugin families\n * @returns Array of all plugin families\n */\nexport function getAllNessusPluginFamilies(): string[] {\n const families = new Set(mappings.map((m) => m.pluginFamily));\n return Array.from(families);\n}\n\n/**\n * Check if a plugin family exists in the mappings\n * @param pluginFamily - The plugin family to check\n * @returns True if the plugin family exists\n */\nexport function nessusPluginFamilyExists(pluginFamily: string): boolean {\n return mappings.some((m) => m.pluginFamily === pluginFamily);\n}\n\n/**\n * Get all Nessus to NIST mappings\n * @returns Array of all mappings\n */\nexport function getAllNessusMappings(): NessusNistMappings {\n return [...mappings];\n}\n","","/**\n * Query functions for Nikto to NIST mappings\n */\n\nimport type { NiktoNistMappings } from './types.js';\nimport rawMappings from '../data/nikto-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 4 (heimdall2's mapping; every control it carries is\n// identical at both revisions today — a test guards that invariant). Lookups\n// translate to the current module-global revision.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst mappings = rawMappings as NiktoNistMappings;\n\n/**\n * Get the NIST control ID for a Nikto test ID\n * @param niktoId - The Nikto test ID (string or number)\n * @returns The NIST control ID or undefined if not found\n */\nexport function getNiktoNistControl(niktoId: string | number): string | undefined {\n const id = typeof niktoId === 'number' ? niktoId.toString() : niktoId;\n const control = mappings[id];\n return control === undefined ? undefined : atCurrentRevision(control);\n}\n\n/**\n * Get all Nikto test IDs\n * @returns Array of all Nikto test IDs\n */\nexport function getAllNiktoIds(): string[] {\n return Object.keys(mappings);\n}\n\n/**\n * Check if a Nikto test ID exists in the mappings\n * @param niktoId - The Nikto test ID to check\n * @returns True if the Nikto test ID exists\n */\nexport function niktoExists(niktoId: string | number): boolean {\n const id = typeof niktoId === 'number' ? niktoId.toString() : niktoId;\n return id in mappings;\n}\n\n/**\n * Get all Nikto to NIST mappings\n * @returns Object mapping Nikto test IDs to NIST control IDs\n */\nexport function getAllNiktoMappings(): NiktoNistMappings {\n return { ...mappings };\n}\n","","/**\n * Query functions for ScoutSuite to NIST mappings\n */\n\nimport type { ScoutsuiteNistMapping, ScoutsuiteNistMappings } from './types.js';\nimport rawMappings from '../data/scoutsuite-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 4 (heimdall2's mapping; every control it carries is\n// identical at both revisions today — a test guards that invariant). Lookups\n// translate to the current module-global revision.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst mappings = rawMappings as ScoutsuiteNistMappings;\nconst indexByRule = new Map<string, ScoutsuiteNistMapping>(\n mappings.map(m => [m.RULE, m])\n);\n\n/**\n * Get the full mapping for a ScoutSuite rule\n * @param rule - The ScoutSuite rule name\n * @returns The mapping object or undefined if not found\n */\nexport function getScoutsuiteNistMapping(rule: string): ScoutsuiteNistMapping | undefined {\n return indexByRule.get(rule);\n}\n\n/**\n * Get the NIST control ID for a ScoutSuite rule\n * @param rule - The ScoutSuite rule name\n * @returns The NIST control ID or undefined if not found\n */\nexport function getScoutsuiteNistControl(rule: string): string | undefined {\n const mapping = getScoutsuiteNistMapping(rule);\n return mapping ? atCurrentRevision(mapping['NIST-ID']) : undefined;\n}\n\n/**\n * Get all ScoutSuite rule names\n * @returns Array of all rule names\n */\nexport function getAllScoutsuiteRules(): string[] {\n return Array.from(indexByRule.keys());\n}\n\n/**\n * Check if a ScoutSuite rule exists in the mappings\n * @param rule - The rule name to check\n * @returns True if the rule exists\n */\nexport function scoutsuiteRuleExists(rule: string): boolean {\n return indexByRule.has(rule);\n}\n\n/**\n * Get all ScoutSuite to NIST mappings\n * @returns Array of all mappings\n */\nexport function getAllScoutsuiteMappings(): ScoutsuiteNistMappings {\n return [...mappings];\n}\n","","/**\n * Query functions for AWS Config to NIST mappings.\n *\n * Lookups are revision-aware: each accepts an optional `rev` defaulting to the\n * module-global current revision, so existing callers keep getting the default.\n */\n\nimport type { AwsConfigNistMapping, AwsConfigNistMappings } from './types.js';\nimport { getCurrentNistRevision, SUPPORTED_NIST_REVISIONS } from '../nist/index.js';\nimport rawMappings from '../data/awsconfig-mappings.json';\n\nconst mappings = rawMappings as AwsConfigNistMappings;\n\n// revision → (key → mapping), for both source-identifier and rule-name lookup\nconst byIdentifier = new Map<number, Map<string, AwsConfigNistMapping>>();\nconst byRuleName = new Map<number, Map<string, AwsConfigNistMapping>>();\nfor (const m of mappings) {\n if (!byIdentifier.has(m.Rev)) {\n byIdentifier.set(m.Rev, new Map());\n byRuleName.set(m.Rev, new Map());\n }\n byIdentifier.get(m.Rev)!.set(m.AwsConfigRuleSourceIdentifier, m);\n byRuleName.get(m.Rev)!.set(m.AwsConfigRuleName, m);\n}\n\nfunction idIndex(rev: number): Map<string, AwsConfigNistMapping> {\n return byIdentifier.get(rev) ?? new Map();\n}\nfunction nameIndex(rev: number): Map<string, AwsConfigNistMapping> {\n return byRuleName.get(rev) ?? new Map();\n}\n\n/** Get the full mapping for an AWS Config rule by source identifier. */\nexport function getAwsConfigNistMappingByIdentifier(\n identifier: string,\n rev: number = getCurrentNistRevision()\n): AwsConfigNistMapping | undefined {\n return idIndex(rev).get(identifier);\n}\n\n/** Get the full mapping for an AWS Config rule by rule name. */\nexport function getAwsConfigNistMappingByName(\n ruleName: string,\n rev: number = getCurrentNistRevision()\n): AwsConfigNistMapping | undefined {\n return nameIndex(rev).get(ruleName);\n}\n\n/** Get the NIST control ID for an AWS Config rule by source identifier. */\nexport function getAwsConfigNistControlByIdentifier(\n identifier: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n return getAwsConfigNistMappingByIdentifier(identifier, rev)?.['NIST-ID'];\n}\n\n/** Get the NIST control ID for an AWS Config rule by rule name. */\nexport function getAwsConfigNistControlByName(\n ruleName: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n return getAwsConfigNistMappingByName(ruleName, rev)?.['NIST-ID'];\n}\n\n/**\n * Resolve NIST controls for a decorated rule name such as Security Hub's\n * \"securityhub-<canonical>-<hash>\", where an exact lookup fails. Returns the\n * split controls of the canonical rule whose name is contained in the given\n * name; the longest such match wins. Returns [] if none match.\n */\nexport function getAwsConfigNistControlsBySubstring(\n name: string,\n rev: number = getCurrentNistRevision()\n): string[] {\n if (!name) return [];\n const lower = name.toLowerCase();\n let best: AwsConfigNistMapping | undefined;\n let bestLen = 0;\n for (const [key, m] of nameIndex(rev)) {\n if (key && key.length > bestLen && lower.includes(key.toLowerCase())) {\n best = m;\n bestLen = key.length;\n }\n }\n if (!best) return [];\n return best['NIST-ID']\n .split('|')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Get all AWS Config rule source identifiers present at the given revision. */\nexport function getAllAwsConfigIdentifiers(rev: number = getCurrentNistRevision()): string[] {\n return Array.from(idIndex(rev).keys());\n}\n\n/** Get all AWS Config rule names present at the given revision. */\nexport function getAllAwsConfigRuleNames(rev: number = getCurrentNistRevision()): string[] {\n return Array.from(nameIndex(rev).keys());\n}\n\n/** Check if an AWS Config rule exists by source identifier at the given revision. */\nexport function awsConfigIdentifierExists(identifier: string, rev: number = getCurrentNistRevision()): boolean {\n return idIndex(rev).has(identifier);\n}\n\n/** Check if an AWS Config rule exists by rule name at the given revision. */\nexport function awsConfigRuleNameExists(ruleName: string, rev: number = getCurrentNistRevision()): boolean {\n return nameIndex(rev).has(ruleName);\n}\n\n/**\n * Get the supported NIST revisions at which the rule resolves (by source\n * identifier or rule name), sorted ascending. Mirrors the resolution\n * buildNistTags performs, so a revision is included exactly when a conversion\n * at that revision would emit NIST tags. Empty means unmapped everywhere — a\n * coverage gap, not a revision mismatch.\n */\nexport function awsConfigMappedRevisions(identifier: string, ruleName: string): number[] {\n const revs: number[] = [];\n for (const rev of SUPPORTED_NIST_REVISIONS) {\n const byId = identifier ? getAwsConfigNistControlByIdentifier(identifier, rev) : undefined;\n const byName = ruleName ? getAwsConfigNistControlByName(ruleName, rev) : undefined;\n if (byId || byName) {\n revs.push(rev);\n }\n }\n return revs;\n}\n\n/** Get all AWS Config to NIST mappings (all revisions). */\nexport function getAllAwsConfigMappings(): AwsConfigNistMappings {\n return [...mappings];\n}\n","","/**\n * Query functions for Hipcheck analysis to NIST 800-53 Rev 5 mappings.\n *\n * The mapping is a hand-curated, RMF-reviewed table (Hipcheck publishes no\n * analysis-to-controls crosswalk). The data file is byte-identical to its Go\n * peer at hdf-mappings/go/hipcheck/hipcheck-nist-mappings.json.\n */\n\nimport type { HipcheckNistMapping, HipcheckNistMappings } from './types.js';\nimport rawMappings from '../data/hipcheck-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 5 (declared Rev: 5 in the data; it carries SR-family\n// controls that do not exist at Rev 4). Lookups translate to the current\n// module-global revision.\nconst NATIVE_REVISION = 5;\n\nconst mappings = rawMappings as HipcheckNistMappings;\n\nconst byAnalysis = new Map<string, HipcheckNistMapping>();\nfor (const m of mappings) {\n byAnalysis.set(m.Analysis, m);\n}\n\n/**\n * Strip a plugin publisher prefix (\"mitre/binary\" -> \"binary\") so lookups key\n * on the analysis name regardless of publisher.\n */\nfunction bareName(analysis: string): string {\n const i = analysis.lastIndexOf('/');\n return i >= 0 ? analysis.slice(i + 1) : analysis;\n}\n\n/**\n * Get the NIST 800-53 controls for a Hipcheck analysis name.\n * Accepts bare (\"binary\") or publisher-prefixed (\"mitre/binary\") names.\n * @returns array of control IDs, or [] if the analysis has no mapping\n */\nexport function getHipcheckNistControls(analysis: string): string[] {\n const m = byAnalysis.get(bareName(analysis));\n if (!m) return [];\n const controls = m['NIST-ID']\n .split('|')\n .map((s) => s.trim())\n .filter(Boolean);\n return nistControlsAtRevision(controls, NATIVE_REVISION, getCurrentNistRevision());\n}\n\n/** Check whether a Hipcheck analysis name has a NIST mapping. */\nexport function hipcheckAnalysisExists(analysis: string): boolean {\n return byAnalysis.has(bareName(analysis));\n}\n\n/** Get all mapped Hipcheck analysis names, sorted. */\nexport function getAllHipcheckAnalyses(): string[] {\n return Array.from(byAnalysis.keys()).sort();\n}\n\n/** Get all Hipcheck to NIST mappings. */\nexport function getAllHipcheckMappings(): HipcheckNistMappings {\n return [...mappings];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AKqDA,MAAM,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.js","names":["rawCrosswalk","rawNistDataRev4","rawNistDataRev5","NATIVE_REVISION","rawCCIData","rawNistCCIData","NATIVE_REVISION","atCurrentRevision","rawOwaspData","mappings","rawMappings","NATIVE_REVISION","atCurrentRevision","mappings","rawMappings","NATIVE_REVISION","atCurrentRevision","mappings","rawMappings","NATIVE_REVISION","mappings","rawMappings","mappings","rawMappings","rawSuppressions","rawMappings"],"sources":["../src/data/cci-mappings.json","../src/data/nist-cci-mappings.json","../src/data/nist-descriptions.json","../src/data/nist-descriptions-rev5.json","../src/data/nist-revision-crosswalk.json","../src/nist/crosswalk.ts","../src/nist/index.ts","../src/cci/index.ts","../src/data/owasp-nist-mappings.json","../src/owasp/index.ts","../src/data/cwe-nist-mappings.json","../src/cwe/index.ts","../src/data/nessus-nist-mappings.json","../src/nessus/index.ts","../src/data/nikto-nist-mappings.json","../src/nikto/index.ts","../src/data/scoutsuite-nist-mappings.json","../src/scoutsuite/index.ts","../src/data/awsconfig-mappings.json","../src/data/awsconfig-suppressions.json","../src/awsconfig/index.ts","../src/data/hipcheck-nist-mappings.json","../src/hipcheck/index.ts"],"sourcesContent":["","","","","","/**\n * NIST SP 800-53 Rev 4 <-> Rev 5 control crosswalk, generated from NIST's own\n * comparison workbooks (see scripts/generate-nist-crosswalk.mjs). Identity is\n * implicit: a control present in both revisions translates to itself; edges\n * cover only non-identity cases (withdrawn, moved, incorporated, Appendix J\n * pointers, and controls new in Rev 5).\n */\n\nimport rawCrosswalk from '../data/nist-revision-crosswalk.json';\n\n/**\n * Relations a translation can carry. `identity` means the control exists at\n * both revisions under the same ID; `moved`/`incorporated`/`pointer`/`family`\n * come from NIST's comparison workbooks; `none` means NIST names no successor;\n * `unknown` means the control is not part of the source revision's catalog (or\n * the revision pair is unsupported).\n */\nexport type NistCrosswalkRelation =\n | 'identity'\n | 'moved'\n | 'incorporated'\n | 'pointer'\n | 'family'\n | 'none'\n | 'unknown';\n\nexport interface NistControlTranslation {\n control: string;\n targets: string[];\n relation: NistCrosswalkRelation;\n /**\n * Set only for relation `family` (\"incorporated into <XX> family\"): a\n * marker, deliberately never expanded into member controls.\n */\n family?: string;\n /** NIST's raw comparison text for redirects. */\n detail?: string;\n}\n\ninterface CrosswalkEdge {\n from: number;\n control: string;\n targets: string[];\n relation: string;\n family?: string;\n detail: string;\n}\n\ninterface CrosswalkFile {\n rosters: Record<string, string[]>;\n edges: CrosswalkEdge[];\n}\n\nconst crosswalk = rawCrosswalk as unknown as CrosswalkFile;\n\nconst rosters = new Map<number, Set<string>>(\n Object.entries(crosswalk.rosters).map(([rev, ids]) => [Number(rev), new Set(ids)])\n);\n\nconst edges = new Map<number, Map<string, CrosswalkEdge>>();\nfor (const edge of crosswalk.edges) {\n let byControl = edges.get(edge.from);\n if (!byControl) {\n byControl = new Map();\n edges.set(edge.from, byControl);\n }\n byControl.set(edge.control, edge);\n}\n\nconst SUPPORTED = new Set([4, 5]);\n/** A trailing single-letter statement part, e.g. \"AC-2(j)\". */\nconst STATEMENT_LETTER = /^(.*)\\(([a-z])\\)$/;\n\nfunction fromEdge(control: string, edge: CrosswalkEdge): NistControlTranslation {\n const tr: NistControlTranslation = {\n control,\n targets: [...edge.targets],\n relation: edge.relation as NistCrosswalkRelation,\n detail: edge.detail,\n };\n if (edge.family) tr.family = edge.family;\n return tr;\n}\n\nfunction identity(control: string): NistControlTranslation {\n return { control, targets: [control], relation: 'identity' };\n}\n\n/**\n * Translates one NIST control ID between 800-53 revisions 4 and 5. A control\n * present in both revisions translates to itself (identity); withdrawn, moved,\n * incorporated, and Appendix J controls follow NIST's published successors; a\n * control with no equivalent at the target revision gets relation `none` and\n * no targets. Statement-letter suffixes (\"AC-2(j)\") survive identity\n * translation and are dropped on redirects.\n */\nexport function translateNistControl(\n control: string,\n from: number,\n to: number\n): NistControlTranslation {\n if (!control || !SUPPORTED.has(from) || !SUPPORTED.has(to)) {\n return { control, targets: [], relation: 'unknown' };\n }\n if (from === to) return identity(control);\n\n const edge = edges.get(from)?.get(control);\n if (edge) return fromEdge(control, edge);\n if (rosters.get(from)?.has(control) && rosters.get(to)?.has(control)) {\n return identity(control);\n }\n\n const base = STATEMENT_LETTER.exec(control)?.[1];\n if (base) {\n const baseEdge = edges.get(from)?.get(base);\n if (baseEdge) return fromEdge(control, baseEdge);\n if (rosters.get(from)?.has(base) && rosters.get(to)?.has(base)) {\n return identity(control);\n }\n }\n return { control, targets: [], relation: 'unknown' };\n}\n\n/**\n * Translates a list of control IDs between revisions, flattening redirect\n * targets and deduplicating while preserving first-seen order. Controls with\n * no target at the destination revision (withdrawn without successor,\n * family-level, or unknown) are returned in `unmapped`, in input order, so\n * callers can surface them instead of silently dropping.\n */\nexport function translateNistControls(\n controls: string[],\n from: number,\n to: number\n): { translated: string[]; unmapped: NistControlTranslation[] } {\n const translated: string[] = [];\n const unmapped: NistControlTranslation[] = [];\n const seen = new Set<string>();\n for (const control of controls) {\n const tr = translateNistControl(control, from, to);\n if (tr.targets.length === 0) {\n unmapped.push(tr);\n continue;\n }\n for (const target of tr.targets) {\n if (!seen.has(target)) {\n seen.add(target);\n translated.push(target);\n }\n }\n }\n return { translated, unmapped };\n}\n\n/**\n * Number of control IDs in the crosswalk's catalog for the given revision, or\n * 0 for unsupported revisions.\n */\nexport function nistRosterSize(rev: number): number {\n return rosters.get(rev)?.size ?? 0;\n}\n\n/**\n * A NIST-shaped base at the start of a longer reference, e.g. \"AC-1 a\",\n * \"AC-1.2 (i)\", \"SA-12 b 1\" — DISA-CCI statement-reference styles.\n */\nconst BASE_CONTROL = /^([A-Z]{2}-\\d+(?:\\(\\d+\\))?)/;\n\n/**\n * Translates a control list authored against `nativeRev` into `rev`. Identity\n * when the revisions are equal (or either is unsupported). Per token: the\n * crosswalk redirect is followed when one exists; statement-style suffixes\n * (\"AC-1 a\", \"AC-1.2 (i)\") are kept on identity and dropped on redirects;\n * tokens with no equivalent at the target revision are dropped (the analog of\n * the awsconfig empty-NIST-ID marker); tokens outside both NIST catalogs\n * (tool placeholders like \"UM-1\") pass through unchanged — they are not ours\n * to drop. Output is deduplicated preserving first-seen order.\n */\nexport function nistControlsAtRevision(\n controls: string[],\n nativeRev: number,\n rev: number\n): string[] {\n if (nativeRev === rev || !SUPPORTED.has(nativeRev) || !SUPPORTED.has(rev)) {\n return controls;\n }\n const seen = new Set<string>();\n const out: string[] = [];\n const add = (c: string): void => {\n if (c && !seen.has(c)) {\n seen.add(c);\n out.push(c);\n }\n };\n for (const c of controls) {\n const tr = translateNistControl(c, nativeRev, rev);\n if (tr.relation !== 'unknown') {\n tr.targets.forEach(add);\n continue;\n }\n const base = BASE_CONTROL.exec(c)?.[1];\n if (base && base !== c) {\n const btr = translateNistControl(base, nativeRev, rev);\n if (btr.relation === 'identity') {\n add(c);\n continue;\n }\n if (btr.relation !== 'unknown') {\n btr.targets.forEach(add);\n continue;\n }\n }\n add(c);\n }\n return out;\n}\n","/**\n * NIST SP 800-53 control description functions\n */\n\nimport type { NISTDescriptions } from './types.js';\nimport rawNistDataRev4 from '../data/nist-descriptions.json';\nimport rawNistDataRev5 from '../data/nist-descriptions-rev5.json';\n\n// Descriptions are revision-specific: Rev 5 renamed titles (\"... POLICY AND\n// PROCEDURES\" -> \"Policy and Procedures\"), added the SR and PT families, and\n// withdrew Rev 4 controls (AU-15, IR-10, SA-12, ...). Each revision has its own\n// dataset; lookups select by the (optionally overridden) global revision.\nconst nistDataByRev: Record<number, NISTDescriptions> = {\n 4: rawNistDataRev4 as NISTDescriptions,\n 5: rawNistDataRev5 as NISTDescriptions,\n};\n\n/**\n * NIST SP 800-53 revision selection.\n *\n * The revision is a module-global default that every NIST-emitting mapping\n * consults through its default lookups. Set it once at startup (the CLI's\n * `--nist-rev` flag does this) to switch the catalog all converters target.\n * For explicit, side-effect-free per-call selection, pass an explicit `rev` to\n * the mapping lookups instead of mutating this.\n */\n\n/** The revision mappings emit when nothing overrides it. */\nexport const DEFAULT_NIST_REVISION = 5;\n\n/**\n * The description dataset for a revision, falling back to the default revision's\n * data (then an empty set) for an unsupported revision.\n */\nfunction descriptionsFor(rev: number): NISTDescriptions {\n return nistDataByRev[rev] ?? nistDataByRev[DEFAULT_NIST_REVISION] ?? {};\n}\n\n/** Revisions every NIST-emitting mapping table has rows for. */\nexport const SUPPORTED_NIST_REVISIONS: readonly number[] = [4, 5];\n\nlet currentNistRevision = DEFAULT_NIST_REVISION;\n\n/** Get the module-global default NIST revision. */\nexport function getCurrentNistRevision(): number {\n return currentNistRevision;\n}\n\n/**\n * Set the module-global default NIST revision. Throws (without mutating state)\n * if the revision has no mapping data.\n */\nexport function setCurrentNistRevision(rev: number): void {\n if (!SUPPORTED_NIST_REVISIONS.includes(rev)) {\n throw new Error(\n `unsupported NIST revision ${rev} (supported: ${SUPPORTED_NIST_REVISIONS.join(', ')})`\n );\n }\n currentNistRevision = rev;\n}\n\n/** Restore the default revision. Intended for cleanup and tests. */\nexport function resetNistRevision(): void {\n currentNistRevision = DEFAULT_NIST_REVISION;\n}\n\nlet nistStrict = false;\n\n/** Report whether strict NIST revision alignment is enabled. */\nexport function isNistStrict(): boolean {\n return nistStrict;\n}\n\n/**\n * Toggle strict NIST revision alignment. When enabled, revision-divergent\n * mappings treat a rule mapped only at another revision as a hard error rather\n * than a silent omission.\n */\nexport function setNistStrict(strict: boolean): void {\n nistStrict = strict;\n}\n\n/**\n * Get the description for a NIST control ID at the selected revision.\n *\n * @param nistId - The NIST control ID (e.g., 'AC-01', 'AC-01 a', 'AC-02 01')\n * @param rev - NIST revision to look up; defaults to the module-global revision\n * @returns The control's Rev-specific description, or undefined if not found at\n * that revision (e.g. a Rev 5-only SR/PT control at Rev 4, or a Rev 4 control\n * withdrawn in Rev 5)\n *\n * @example\n * ```typescript\n * getNISTDescription('AC-01'); // Rev 5 default -> \"Policy and Procedures\"\n * getNISTDescription('AC-01', 4); // -> \"ACCESS CONTROL POLICY AND PROCEDURES\"\n * ```\n */\nexport function getNISTDescription(\n nistId: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n if (!nistId || typeof nistId !== 'string') {\n return undefined;\n }\n\n return descriptionsFor(rev)[nistId];\n}\n\n/**\n * Get all NIST control IDs present at the selected revision.\n *\n * @param rev - NIST revision to enumerate; defaults to the module-global revision\n * @returns Array of NIST control IDs for that revision (Rev 5 includes the\n * SR/PT families; Rev 4 includes controls withdrawn in Rev 5)\n *\n * @example\n * ```typescript\n * const ids = getAllNISTIds();\n * // Returns: ['AC-01', 'AC-01 a', 'AC-02', ...]\n * ```\n */\nexport function getAllNISTIds(rev: number = getCurrentNistRevision()): string[] {\n return Object.keys(descriptionsFor(rev));\n}\n\n/**\n * Check if a NIST control ID exists at the selected revision.\n *\n * @param nistId - The NIST control ID to check\n * @param rev - NIST revision to check against; defaults to the module-global revision\n * @returns true if the control exists at that revision (e.g. an SR/PT control is\n * present at Rev 5 but not Rev 4)\n *\n * @example\n * ```typescript\n * if (nistExists('AC-01')) {\n * console.log('NIST control found');\n * }\n * ```\n */\nexport function nistExists(nistId: string, rev: number = getCurrentNistRevision()): boolean {\n if (!nistId || typeof nistId !== 'string') {\n return false;\n }\n\n return nistId in descriptionsFor(rev);\n}\n\n/**\n * Extract the NIST family from a NIST control ID, if that family exists at the\n * selected revision.\n *\n * @param nistId - The NIST control ID (e.g., 'AC-01', 'AC-01 a')\n * @param rev - NIST revision to validate against; defaults to the module-global revision\n * @returns The NIST family code (e.g., 'AC'), or undefined if invalid or the\n * family is absent at that revision (the SR/PT families are Rev 5-only)\n *\n * @example\n * ```typescript\n * const family = getNISTFamily('AC-01');\n * // Returns: 'AC'\n *\n * const family2 = getNISTFamily('AC-01 a 01');\n * // Returns: 'AC'\n * ```\n */\nexport function getNISTFamily(\n nistId: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n if (!nistId || typeof nistId !== 'string') {\n return undefined;\n }\n\n // Extract family from format like \"AC-01\" or \"AC-01 a\"\n const match = nistId.match(/^([A-Z]{2})-/);\n if (!match) {\n return undefined;\n }\n\n const family = match[1];\n\n // Validate that this family exists at the selected revision by checking\n // if any controls start with this family (the SR/PT families are Rev 5-only).\n const familyPrefix = `${family}-`;\n const hasFamily = Object.keys(descriptionsFor(rev)).some((key) => key.startsWith(familyPrefix));\n\n return hasFamily ? family : undefined;\n}\n\n/**\n * Canonical NIST 800-53 fallback tags for converters when a finding has no\n * CWE or the CWE has no NIST mapping. Categories match heimdall2's global.ts.\n *\n * - SA-11: Developer Security Testing and Evaluation\n * - RA-5: Vulnerability Monitoring and Scanning\n * - SI-2: Flaw Remediation\n * - CM-8: System Component Inventory\n */\n\n/** Static analysis and vulnerability scanning tools (SA-11 + RA-5). */\nexport const DEFAULT_STATIC_ANALYSIS_NIST_TAGS: string[] = ['SA-11', 'RA-5'];\n\n/** Tools that identify outdated packages or flaws requiring patching (SI-2 + RA-5). */\nexport const DEFAULT_REMEDIATION_NIST_TAGS: string[] = ['SI-2', 'RA-5'];\n\n/** Dependency/inventory management tools (CM-8). */\nexport const DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS: string[] = ['CM-8'];\n\n/** Configuration-compliance checks with no specific mapping (CM-6: Configuration Settings). */\nexport const DEFAULT_CONFIG_MANAGEMENT_NIST_TAGS: string[] = ['CM-6'];\n\n// Rev 4 <-> Rev 5 crosswalk\nexport {\n translateNistControl,\n translateNistControls,\n nistRosterSize,\n nistControlsAtRevision,\n} from './crosswalk.js';\nexport type { NistControlTranslation, NistCrosswalkRelation } from './crosswalk.js';\n\n// Re-export types\nexport type { NISTDescriptions } from './types.js';\n","/**\n * CCI (Control Correlation Identifier) mapping functions\n */\n\nimport type { CCIMappings, NistCCIMappings } from './types.js';\nimport rawCCIData from '../data/cci-mappings.json';\nimport rawNistCCIData from '../data/nist-cci-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// The DISA CCI list's NIST references are Rev 4-era (they include Appendix J\n// privacy controls and SA-12/SA-19, all withdrawn or relocated in Rev 5).\n// getCCINistMappings translates to the current module-global revision.\nconst NATIVE_REVISION = 4;\n\nconst cciData = rawCCIData as CCIMappings;\nconst nistCCIData = rawNistCCIData as NistCCIMappings;\n\n/**\n * Get the definition/description for a CCI ID.\n *\n * @param cciId - The CCI ID (e.g., 'CCI-000001')\n * @returns The CCI definition, or undefined if not found\n *\n * @example\n * ```typescript\n * const def = getCCIDescription('CCI-000001');\n * // Returns: \"The organization develops an access control policy...\"\n * ```\n */\nexport function getCCIDescription(cciId: string): string | undefined {\n if (!cciId || typeof cciId !== 'string') {\n return undefined;\n }\n\n const item = cciData[cciId];\n return item?.def;\n}\n\n/**\n * Get the NIST control mappings for a CCI ID.\n *\n * @param cciId - The CCI ID (e.g., 'CCI-000001')\n * @returns Array of NIST control references, or undefined if not found\n *\n * @example\n * ```typescript\n * const mappings = getCCINistMappings('CCI-000001');\n * // Returns: ['AC-1 a', 'AC-1.1 (i and ii)', 'AC-1 a 1']\n * ```\n */\nexport function getCCINistMappings(cciId: string): string[] | undefined {\n if (!cciId || typeof cciId !== 'string') {\n return undefined;\n }\n\n const item = cciData[cciId];\n if (!item) return undefined;\n return nistControlsAtRevision(item.nist, NATIVE_REVISION, getCurrentNistRevision());\n}\n\n/**\n * Get all CCI IDs available in the database.\n *\n * @returns Array of all CCI IDs\n *\n * @example\n * ```typescript\n * const ids = getAllCCIIds();\n * // Returns: ['CCI-000001', 'CCI-000002', ...]\n * ```\n */\nexport function getAllCCIIds(): string[] {\n return Object.keys(cciData);\n}\n\n/**\n * Check if a CCI ID exists in the database.\n *\n * @param cciId - The CCI ID to check\n * @returns true if the CCI exists, false otherwise\n *\n * @example\n * ```typescript\n * if (cciExists('CCI-000001')) {\n * console.log('CCI found');\n * }\n * ```\n */\nexport function cciExists(cciId: string): boolean {\n if (!cciId || typeof cciId !== 'string') {\n return false;\n }\n\n return cciId in cciData;\n}\n\n/**\n * Extract the base NIST control identifier from a potentially qualified string.\n * For example, \"SI-10 a 1\" → \"SI-10\", \"AC-3 (2)\" → \"AC-3\".\n */\nfunction baseNistControl(control: string): string {\n const idx = control.search(/[ (.]/);\n return idx === -1 ? control : control.slice(0, idx);\n}\n\n/**\n * Get CCI IDs for a NIST control using the curated mapping table.\n * The input is normalized to its base control before lookup.\n *\n * @param nistControl - NIST control string (e.g., 'SI-10', 'AC-3 (2)')\n * @returns Array of CCI IDs, or undefined if not found\n *\n * @example\n * ```typescript\n * const ccis = getNistCCIMappings('SI-10');\n * // Returns: ['CCI-001310']\n * ```\n */\nexport function getNistCCIMappings(nistControl: string): string[] | undefined {\n if (!nistControl || typeof nistControl !== 'string') {\n return undefined;\n }\n const base = baseNistControl(nistControl);\n return nistCCIData[base];\n}\n\n/**\n * Map NIST 800-53 controls to their CCI IDs using the curated mapping table.\n * Results are deduplicated and sorted.\n *\n * @param nistControls - Array of NIST control strings\n * @returns Deduplicated, sorted array of CCI IDs (empty array if no mappings found)\n *\n * @example\n * ```typescript\n * const ccis = nistToCci(['AC-3', 'SI-10']);\n * // Returns: ['CCI-000213', 'CCI-001310']\n * ```\n */\nexport function nistToCci(nistControls: string[]): string[] {\n const seen = new Set<string>();\n for (const control of nistControls) {\n const ccis = getNistCCIMappings(control);\n if (ccis) {\n for (const cciId of ccis) {\n seen.add(cciId);\n }\n }\n }\n return Array.from(seen).sort();\n}\n\n// Re-export types\nexport type { CCIItem, CCIMappings, NistCCIMappings } from './types.js';\n","","/**\n * OWASP Top 10 to NIST mapping functions\n */\n\nimport type { OwaspNistMappings, OwaspNistMapping } from './types.js';\nimport rawOwaspData from '../data/owasp-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 4 (declared Rev: 4 in the data; every control it\n// carries is identical at both revisions today — a test guards that\n// invariant). Lookups translate to the current module-global revision.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst owaspData = rawOwaspData as OwaspNistMappings;\nconst owaspIndex = new Map<string, OwaspNistMapping>(\n owaspData.map(item => [item['OWASP-ID'], item])\n);\n\n/**\n * Get the NIST mapping for an OWASP Top 10 ID.\n *\n * @param owaspId - The OWASP ID (e.g., 'A1', 'A2')\n * @returns The mapping object, or undefined if not found\n *\n * @example\n * ```typescript\n * const mapping = getOwaspNistMapping('A1');\n * // Returns: { 'OWASP-ID': 'A1', 'OWASP Name': 'Injection', 'NIST-ID': 'SI-10', ... }\n * ```\n */\nexport function getOwaspNistMapping(owaspId: string): OwaspNistMapping | undefined {\n if (!owaspId || typeof owaspId !== 'string') {\n return undefined;\n }\n\n return owaspIndex.get(owaspId);\n}\n\n/**\n * Get the NIST control ID for an OWASP Top 10 ID.\n *\n * @param owaspId - The OWASP ID (e.g., 'A1', 'A2')\n * @returns The NIST control ID, or undefined if not found\n *\n * @example\n * ```typescript\n * const nistId = getOwaspNistControl('A1');\n * // Returns: 'SI-10'\n * ```\n */\nexport function getOwaspNistControl(owaspId: string): string | undefined {\n const mapping = getOwaspNistMapping(owaspId);\n return mapping ? atCurrentRevision(mapping['NIST-ID']) : undefined;\n}\n\n/**\n * Get the OWASP vulnerability name for an OWASP ID.\n *\n * @param owaspId - The OWASP ID (e.g., 'A1', 'A2')\n * @returns The OWASP vulnerability name, or undefined if not found\n *\n * @example\n * ```typescript\n * const name = getOwaspName('A1');\n * // Returns: 'Injection'\n * ```\n */\nexport function getOwaspName(owaspId: string): string | undefined {\n const mapping = getOwaspNistMapping(owaspId);\n return mapping?.['OWASP Name'];\n}\n\n/**\n * Get all OWASP IDs available in the database.\n *\n * @returns Array of all OWASP IDs\n *\n * @example\n * ```typescript\n * const ids = getAllOwaspIds();\n * // Returns: ['A1', 'A2', 'A3', ..., 'A10']\n * ```\n */\nexport function getAllOwaspIds(): string[] {\n return Array.from(owaspIndex.keys());\n}\n\n/**\n * Check if an OWASP ID exists in the database.\n *\n * @param owaspId - The OWASP ID to check\n * @returns true if the OWASP ID exists, false otherwise\n *\n * @example\n * ```typescript\n * if (owaspExists('A1')) {\n * console.log('OWASP ID found');\n * }\n * ```\n */\nexport function owaspExists(owaspId: string): boolean {\n if (!owaspId || typeof owaspId !== 'string') {\n return false;\n }\n\n return owaspIndex.has(owaspId);\n}\n\n/**\n * Get all OWASP to NIST mappings.\n *\n * @returns Array of all mappings\n *\n * @example\n * ```typescript\n * const mappings = getAllOwaspMappings();\n * // Returns all 10 OWASP Top 10 mappings\n * ```\n */\nexport function getAllOwaspMappings(): OwaspNistMappings {\n return owaspData;\n}\n\n// Re-export types\nexport type { OwaspNistMapping, OwaspNistMappings } from './types.js';\n","","/**\n * Query functions for CWE to NIST mappings.\n *\n * Lookups are revision-aware: each accepts an optional `rev` defaulting to the\n * module-global current revision, so existing callers keep getting the default.\n */\n\nimport type { CweNistMapping, CweNistMappings } from './types.js';\nimport { getCurrentNistRevision } from '../nist/index.js';\nimport rawMappings from '../data/cwe-nist-mappings.json';\n\nconst mappings = rawMappings as CweNistMappings;\n\n// revision → (CWE-ID → mapping)\nconst byRev = new Map<number, Map<number, CweNistMapping>>();\nfor (const m of mappings) {\n let idx = byRev.get(m.Rev);\n if (!idx) {\n idx = new Map<number, CweNistMapping>();\n byRev.set(m.Rev, idx);\n }\n idx.set(m['CWE-ID'], m);\n}\n\nfunction indexFor(rev: number): Map<number, CweNistMapping> {\n return byRev.get(rev) ?? new Map<number, CweNistMapping>();\n}\n\n/** Get the full mapping for a CWE ID at the given NIST revision. */\nexport function getCweNistMapping(\n cweId: number,\n rev: number = getCurrentNistRevision()\n): CweNistMapping | undefined {\n return indexFor(rev).get(cweId);\n}\n\n/** Get the NIST control ID for a CWE ID at the given NIST revision. */\nexport function getCweNistControl(cweId: number, rev: number = getCurrentNistRevision()): string | undefined {\n return getCweNistMapping(cweId, rev)?.['NIST-ID'];\n}\n\n/** Get the CWE name for a CWE ID at the given NIST revision. */\nexport function getCweName(cweId: number, rev: number = getCurrentNistRevision()): string | undefined {\n return getCweNistMapping(cweId, rev)?.['CWE Name'];\n}\n\n/** Get all CWE IDs present at the given NIST revision. */\nexport function getAllCweIds(rev: number = getCurrentNistRevision()): number[] {\n return Array.from(indexFor(rev).keys());\n}\n\n/** Check whether a CWE ID exists at the given NIST revision. */\nexport function cweExists(cweId: number, rev: number = getCurrentNistRevision()): boolean {\n return indexFor(rev).has(cweId);\n}\n\n/** Get all CWE to NIST mappings (all revisions). */\nexport function getAllCweMappings(): CweNistMappings {\n return [...mappings];\n}\n","","/**\n * Query functions for Nessus to NIST mappings\n */\n\nimport type { NessusNistMappings } from './types.js';\nimport rawMappings from '../data/nessus-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// The table was authored against NIST 800-53 Rev 4 (heimdall2's mapping; it\n// carries AU-8(1), withdrawn in Rev 5). Lookups translate to the current\n// module-global revision via the NIST crosswalk.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst mappings = rawMappings as NessusNistMappings;\n\n/**\n * Get the NIST control ID for a Nessus plugin family and plugin ID\n * @param pluginFamily - The Nessus plugin family\n * @param pluginId - The Nessus plugin ID (optional, defaults to \"*\")\n * @returns The NIST control ID or undefined if not found\n */\nexport function getNessusNistControl(\n pluginFamily: string,\n pluginId = '*'\n): string | undefined {\n // The mapping data carries numeric plugin IDs alongside the \"*\" wildcard, so\n // compare on the string form — a strict === against the raw value never\n // matches a scan's (string) plugin ID.\n const exactMatch = mappings.find(\n (m) => m.pluginFamily === pluginFamily && String(m.pluginID) === pluginId\n );\n if (exactMatch) {\n return atCurrentRevision(exactMatch['NIST-ID']);\n }\n\n // Fall back to wildcard match\n const wildcardMatch = mappings.find(\n (m) => m.pluginFamily === pluginFamily && String(m.pluginID) === '*'\n );\n return wildcardMatch ? atCurrentRevision(wildcardMatch['NIST-ID']) : undefined;\n}\n\n/**\n * Get all mappings for a plugin family\n * @param pluginFamily - The Nessus plugin family\n * @returns Array of mappings for the plugin family\n */\nexport function getNessusPluginFamilyMappings(\n pluginFamily: string\n): NessusNistMappings {\n return mappings.filter((m) => m.pluginFamily === pluginFamily);\n}\n\n/**\n * Get all plugin families\n * @returns Array of all plugin families\n */\nexport function getAllNessusPluginFamilies(): string[] {\n const families = new Set(mappings.map((m) => m.pluginFamily));\n return Array.from(families);\n}\n\n/**\n * Check if a plugin family exists in the mappings\n * @param pluginFamily - The plugin family to check\n * @returns True if the plugin family exists\n */\nexport function nessusPluginFamilyExists(pluginFamily: string): boolean {\n return mappings.some((m) => m.pluginFamily === pluginFamily);\n}\n\n/**\n * Get all Nessus to NIST mappings\n * @returns Array of all mappings\n */\nexport function getAllNessusMappings(): NessusNistMappings {\n return [...mappings];\n}\n","","/**\n * Query functions for Nikto to NIST mappings\n */\n\nimport type { NiktoNistMappings } from './types.js';\nimport rawMappings from '../data/nikto-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 4 (heimdall2's mapping; every control it carries is\n// identical at both revisions today — a test guards that invariant). Lookups\n// translate to the current module-global revision.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst mappings = rawMappings as NiktoNistMappings;\n\n/**\n * Get the NIST control ID for a Nikto test ID\n * @param niktoId - The Nikto test ID (string or number)\n * @returns The NIST control ID or undefined if not found\n */\nexport function getNiktoNistControl(niktoId: string | number): string | undefined {\n const id = typeof niktoId === 'number' ? niktoId.toString() : niktoId;\n const control = mappings[id];\n return control === undefined ? undefined : atCurrentRevision(control);\n}\n\n/**\n * Get all Nikto test IDs\n * @returns Array of all Nikto test IDs\n */\nexport function getAllNiktoIds(): string[] {\n return Object.keys(mappings);\n}\n\n/**\n * Check if a Nikto test ID exists in the mappings\n * @param niktoId - The Nikto test ID to check\n * @returns True if the Nikto test ID exists\n */\nexport function niktoExists(niktoId: string | number): boolean {\n const id = typeof niktoId === 'number' ? niktoId.toString() : niktoId;\n return id in mappings;\n}\n\n/**\n * Get all Nikto to NIST mappings\n * @returns Object mapping Nikto test IDs to NIST control IDs\n */\nexport function getAllNiktoMappings(): NiktoNistMappings {\n return { ...mappings };\n}\n","","/**\n * Query functions for ScoutSuite to NIST mappings\n */\n\nimport type { ScoutsuiteNistMapping, ScoutsuiteNistMappings } from './types.js';\nimport rawMappings from '../data/scoutsuite-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 4 (heimdall2's mapping; every control it carries is\n// identical at both revisions today — a test guards that invariant). Lookups\n// translate to the current module-global revision.\nconst NATIVE_REVISION = 4;\nconst atCurrentRevision = (nistId: string): string =>\n nistControlsAtRevision(nistId.split('|'), NATIVE_REVISION, getCurrentNistRevision()).join('|');\n\nconst mappings = rawMappings as ScoutsuiteNistMappings;\nconst indexByRule = new Map<string, ScoutsuiteNistMapping>(\n mappings.map(m => [m.RULE, m])\n);\n\n/**\n * Get the full mapping for a ScoutSuite rule\n * @param rule - The ScoutSuite rule name\n * @returns The mapping object or undefined if not found\n */\nexport function getScoutsuiteNistMapping(rule: string): ScoutsuiteNistMapping | undefined {\n return indexByRule.get(rule);\n}\n\n/**\n * Get the NIST control ID for a ScoutSuite rule\n * @param rule - The ScoutSuite rule name\n * @returns The NIST control ID or undefined if not found\n */\nexport function getScoutsuiteNistControl(rule: string): string | undefined {\n const mapping = getScoutsuiteNistMapping(rule);\n return mapping ? atCurrentRevision(mapping['NIST-ID']) : undefined;\n}\n\n/**\n * Get all ScoutSuite rule names\n * @returns Array of all rule names\n */\nexport function getAllScoutsuiteRules(): string[] {\n return Array.from(indexByRule.keys());\n}\n\n/**\n * Check if a ScoutSuite rule exists in the mappings\n * @param rule - The rule name to check\n * @returns True if the rule exists\n */\nexport function scoutsuiteRuleExists(rule: string): boolean {\n return indexByRule.has(rule);\n}\n\n/**\n * Get all ScoutSuite to NIST mappings\n * @returns Array of all mappings\n */\nexport function getAllScoutsuiteMappings(): ScoutsuiteNistMappings {\n return [...mappings];\n}\n","","","/**\n * Query functions for AWS Config to NIST mappings.\n *\n * Lookups are revision-aware: each accepts an optional `rev` defaulting to the\n * module-global current revision, so existing callers keep getting the default.\n */\n\nimport type { AwsConfigNistMapping, AwsConfigNistMappings, AwsConfigSuppressions } from './types.js';\nimport { getCurrentNistRevision, SUPPORTED_NIST_REVISIONS } from '../nist/index.js';\nimport rawMappings from '../data/awsconfig-mappings.json';\nimport rawSuppressions from '../data/awsconfig-suppressions.json';\n\nconst mappings = rawMappings as AwsConfigNistMappings;\n\n/**\n * The maintainer-reviewed (rule, control) removals the generator applied to\n * the mapping table — exposed so a consumer can distinguish \"removed by\n * review\" from \"never mapped by the sources\".\n */\nexport const awsConfigSuppressions = rawSuppressions as AwsConfigSuppressions;\n\n// revision → (key → mapping), for both source-identifier and rule-name lookup\nconst byIdentifier = new Map<number, Map<string, AwsConfigNistMapping>>();\nconst byRuleName = new Map<number, Map<string, AwsConfigNistMapping>>();\nfor (const m of mappings) {\n if (!byIdentifier.has(m.Rev)) {\n byIdentifier.set(m.Rev, new Map());\n byRuleName.set(m.Rev, new Map());\n }\n byIdentifier.get(m.Rev)!.set(m.AwsConfigRuleSourceIdentifier, m);\n byRuleName.get(m.Rev)!.set(m.AwsConfigRuleName, m);\n}\n\nfunction idIndex(rev: number): Map<string, AwsConfigNistMapping> {\n return byIdentifier.get(rev) ?? new Map();\n}\nfunction nameIndex(rev: number): Map<string, AwsConfigNistMapping> {\n return byRuleName.get(rev) ?? new Map();\n}\n\n/** Get the full mapping for an AWS Config rule by source identifier. */\nexport function getAwsConfigNistMappingByIdentifier(\n identifier: string,\n rev: number = getCurrentNistRevision()\n): AwsConfigNistMapping | undefined {\n return idIndex(rev).get(identifier);\n}\n\n/** Get the full mapping for an AWS Config rule by rule name. */\nexport function getAwsConfigNistMappingByName(\n ruleName: string,\n rev: number = getCurrentNistRevision()\n): AwsConfigNistMapping | undefined {\n return nameIndex(rev).get(ruleName);\n}\n\n/** Get the NIST control ID for an AWS Config rule by source identifier. */\nexport function getAwsConfigNistControlByIdentifier(\n identifier: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n return getAwsConfigNistMappingByIdentifier(identifier, rev)?.['NIST-ID'];\n}\n\n/** Get the NIST control ID for an AWS Config rule by rule name. */\nexport function getAwsConfigNistControlByName(\n ruleName: string,\n rev: number = getCurrentNistRevision()\n): string | undefined {\n return getAwsConfigNistMappingByName(ruleName, rev)?.['NIST-ID'];\n}\n\n/**\n * Resolve NIST controls for a decorated rule name such as Security Hub's\n * \"securityhub-<canonical>-<hash>\", where an exact lookup fails. Returns the\n * split controls of the canonical rule whose name is contained in the given\n * name; the longest such match wins. Returns [] if none match.\n */\nexport function getAwsConfigNistControlsBySubstring(\n name: string,\n rev: number = getCurrentNistRevision()\n): string[] {\n if (!name) return [];\n const lower = name.toLowerCase();\n let best: AwsConfigNistMapping | undefined;\n let bestLen = 0;\n for (const [key, m] of nameIndex(rev)) {\n if (key && key.length > bestLen && lower.includes(key.toLowerCase())) {\n best = m;\n bestLen = key.length;\n }\n }\n if (!best) return [];\n return best['NIST-ID']\n .split('|')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Get all AWS Config rule source identifiers present at the given revision. */\nexport function getAllAwsConfigIdentifiers(rev: number = getCurrentNistRevision()): string[] {\n return Array.from(idIndex(rev).keys());\n}\n\n/** Get all AWS Config rule names present at the given revision. */\nexport function getAllAwsConfigRuleNames(rev: number = getCurrentNistRevision()): string[] {\n return Array.from(nameIndex(rev).keys());\n}\n\n/** Check if an AWS Config rule exists by source identifier at the given revision. */\nexport function awsConfigIdentifierExists(identifier: string, rev: number = getCurrentNistRevision()): boolean {\n return idIndex(rev).has(identifier);\n}\n\n/** Check if an AWS Config rule exists by rule name at the given revision. */\nexport function awsConfigRuleNameExists(ruleName: string, rev: number = getCurrentNistRevision()): boolean {\n return nameIndex(rev).has(ruleName);\n}\n\n/**\n * Get the supported NIST revisions at which the rule resolves (by source\n * identifier or rule name), sorted ascending. Mirrors the resolution\n * buildNistTags performs, so a revision is included exactly when a conversion\n * at that revision would emit NIST tags. Empty means unmapped everywhere — a\n * coverage gap, not a revision mismatch.\n */\nexport function awsConfigMappedRevisions(identifier: string, ruleName: string): number[] {\n const revs: number[] = [];\n for (const rev of SUPPORTED_NIST_REVISIONS) {\n const byId = identifier ? getAwsConfigNistControlByIdentifier(identifier, rev) : undefined;\n const byName = ruleName ? getAwsConfigNistControlByName(ruleName, rev) : undefined;\n if (byId || byName) {\n revs.push(rev);\n }\n }\n return revs;\n}\n\n/** Get all AWS Config to NIST mappings (all revisions). */\nexport function getAllAwsConfigMappings(): AwsConfigNistMappings {\n return [...mappings];\n}\n","","/**\n * Query functions for Hipcheck analysis to NIST 800-53 Rev 5 mappings.\n *\n * The mapping is a hand-curated, RMF-reviewed table (Hipcheck publishes no\n * analysis-to-controls crosswalk). The data file is byte-identical to its Go\n * peer at hdf-mappings/go/hipcheck/hipcheck-nist-mappings.json.\n */\n\nimport type { HipcheckNistMapping, HipcheckNistMappings } from './types.js';\nimport rawMappings from '../data/hipcheck-nist-mappings.json';\nimport { getCurrentNistRevision, nistControlsAtRevision } from '../nist/index.js';\n\n// Authored against Rev 5 (declared Rev: 5 in the data; it carries SR-family\n// controls that do not exist at Rev 4). Lookups translate to the current\n// module-global revision.\nconst NATIVE_REVISION = 5;\n\nconst mappings = rawMappings as HipcheckNistMappings;\n\nconst byAnalysis = new Map<string, HipcheckNistMapping>();\nfor (const m of mappings) {\n byAnalysis.set(m.Analysis, m);\n}\n\n/**\n * Strip a plugin publisher prefix (\"mitre/binary\" -> \"binary\") so lookups key\n * on the analysis name regardless of publisher.\n */\nfunction bareName(analysis: string): string {\n const i = analysis.lastIndexOf('/');\n return i >= 0 ? analysis.slice(i + 1) : analysis;\n}\n\n/**\n * Get the NIST 800-53 controls for a Hipcheck analysis name.\n * Accepts bare (\"binary\") or publisher-prefixed (\"mitre/binary\") names.\n * @returns array of control IDs, or [] if the analysis has no mapping\n */\nexport function getHipcheckNistControls(analysis: string): string[] {\n const m = byAnalysis.get(bareName(analysis));\n if (!m) return [];\n const controls = m['NIST-ID']\n .split('|')\n .map((s) => s.trim())\n .filter(Boolean);\n return nistControlsAtRevision(controls, NATIVE_REVISION, getCurrentNistRevision());\n}\n\n/** Check whether a Hipcheck analysis name has a NIST mapping. */\nexport function hipcheckAnalysisExists(analysis: string): boolean {\n return byAnalysis.has(bareName(analysis));\n}\n\n/** Get all mapped Hipcheck analysis names, sorted. */\nexport function getAllHipcheckAnalyses(): string[] {\n return Array.from(byAnalysis.keys()).sort();\n}\n\n/** Get all Hipcheck to NIST mappings. */\nexport function getAllHipcheckMappings(): HipcheckNistMappings {\n return [...mappings];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AKqDA,MAAM,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mitre/hdf-mappings",
3
- "version": "3.5.1",
3
+ "version": "3.6.0-rc.2",
4
4
  "description": "CCI/NIST/CIS/CMMC security framework mappings for HDF",
5
5
  "publishConfig": {
6
6
  "access": "public"