From 4dfef62023257137f9f2024baf0303ff79f33d99 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 9 Nov 2023 19:32:37 -0800 Subject: [PATCH 01/58] Added help and made fault_region mandatory --- cosmos/scripts/chaos/chaos_script.ps1 | 22 +++++++++++++++++ cosmos/scripts/chaos/chaos_script.sh | 24 +++++++++++++++++++ .../delay/recipes/read-delay/README.md | 2 +- .../delay/recipes/read-patch-delay/README.md | 2 +- 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/cosmos/scripts/chaos/chaos_script.ps1 b/cosmos/scripts/chaos/chaos_script.ps1 index 5a61240e..b5947e6c 100644 --- a/cosmos/scripts/chaos/chaos_script.ps1 +++ b/cosmos/scripts/chaos/chaos_script.ps1 @@ -29,6 +29,28 @@ param ( [string] $waitForFaultToStartInSec ) +function Show-Help { + Write-Host "This script introduces network faults into a Cosmos DB environment for testing purposes." + Write-Host "Parameters:" + Write-Host " -endpoint: The Cosmos DB endpoint." + Write-Host " -masterKey: The master key for the Cosmos DB account." + Write-Host " -databaseId: The ID of the database." + Write-Host " -containerId: The ID of the container." + Write-Host " -durationOfFaultInSec: The duration of the fault in seconds." + Write-Host " -dropPercentage: The percentage of packets to drop (optional)." + Write-Host " -delayInMs: The delay to introduce in milliseconds (optional)." + Write-Host " -faultRegion: The region where the fault should be introduced." + Write-Host " -waitForFaultToStartInSec: The time to wait before starting the fault in seconds (optional)." + Write-Host "Note: Both dropPercentage and delayInMs cannot be null together." + Write-Host "Usage:" + Write-Host " .\chaos_script.ps1 -endpoint -masterKey -databaseId -containerId -durationOfFaultInSec -faultRegion [-dropPercentage ] [-delayInMs ] [-waitForFaultToStartInSec ]" +} + +if (!$endpoint -or !$masterKey -or !$databaseId -or !$containerId -or !$durationOfFaultInSec -or !$faultRegion) { + Show-Help + return +} + if (!$dropPercentage -and !$delayInMs) { throw "Both dropPercentage and delayInMs cannot be null together" diff --git a/cosmos/scripts/chaos/chaos_script.sh b/cosmos/scripts/chaos/chaos_script.sh index f58e495f..47dbbb2c 100644 --- a/cosmos/scripts/chaos/chaos_script.sh +++ b/cosmos/scripts/chaos/chaos_script.sh @@ -1,5 +1,10 @@ #!/bin/bash +if [ -z "$fault_region" ]; then + echo "Error: fault_region parameter cannot be null. Please provide a value for this parameter." + exit 1 +fi + fetch_host_port() { url=$1 # extract the host and port @@ -30,6 +35,25 @@ install_powershell() { # Start PowerShell pwsh } +if [ "$1" == "-h" | "$1" == "--help" ]; then + echo "Usage: ./chaos_script.sh [OPTIONS]" + echo "Simulates network faults by dropping packets and adding latency." + echo + echo "Options:" + echo " --endpoint ENDPOINT The endpoint to target." + echo " --databaseid DATABASEID The ID of the database." + echo " --containerid CONTAINERID The ID of the container." + echo " --wait_for_fault_to_start_in_sec The time to wait before starting the fault, in seconds." + echo " --duration_of_fault_in_sec The duration of the fault, in seconds." + echo " --fault_region FAULT_REGION The region where the fault should occur." + echo " --drop_probability DROP_PROB The probability of dropping a packet (0-1)." + echo " --delay_in_ms DELAY The delay to add to packets, in milliseconds." + echo " --help Display this help message." + echo + echo "Example:" + echo " ./chaos_script.sh --endpoint http://example.com --databaseid mydatabase --containerid mycontainer --wait_for_fault_to_start_in_sec 10 --duration_of_fault_in_sec 60 --fault_region uswest --drop_probability 0.1 --delay_in_ms 100" + exit 0 +fi if ! command -v pwsh &>/dev/null; then install_powershell diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/README.md b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/README.md index fa689403..4ae61428 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/README.md +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/README.md @@ -10,7 +10,7 @@ This recipe encapsulates a read workload that executes for 20-25 minutes. Around | Benchmarking tool | YCSB | | Workload | Read | | Duration | 20-25 minutes | -| Fault Type | Packet Drop | +| Fault Type | Network Delay | | Fault Start | 5 Minutes after the workload starts | | Fault duration | 5 minutes | | Number of documents in DB | 30 | diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/README.md b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/README.md index cd725a52..1f07ef6c 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/README.md +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/README.md @@ -10,7 +10,7 @@ This recipe encapsulates a read and patch workload that executes for 20-25 minut | Benchmarking tool | YCSB | | Workload | Read & Patch (80:20) | | Duration | 20-25 minutes | -| Fault Type | Nertwork Delay | +| Fault Type | Network Delay | | Fault Start | 5 Minutes after the workload starts | | Fault duration | 5 minutes | | Number of documents in DB | 30 | From bdd84c9892c236403608171e9a8c85c944d0083a Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 10 Nov 2023 16:19:57 -0800 Subject: [PATCH 02/58] Updated the usage/help --- .vs/ProjectSettings.json | 3 + .vs/VSWorkspaceState.json | 10 + ...09336a42-748d-4803-851e-0f12bd65a669.vsidx | Bin 0 -> 336320 bytes .../config/applicationhost.config | 1021 +++++++++++++++++ .vs/azure-db-benchmarking/v17/.wsuo | Bin 0 -> 20480 bytes .vs/slnx.sqlite | Bin 0 -> 114688 bytes cosmos/scripts/chaos/chaos_script.ps1 | 50 +- cosmos/scripts/chaos/chaos_script.sh | 53 +- 8 files changed, 1092 insertions(+), 45 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/azure-db-benchmarking/FileContentIndex/09336a42-748d-4803-851e-0f12bd65a669.vsidx create mode 100644 .vs/azure-db-benchmarking/config/applicationhost.config create mode 100644 .vs/azure-db-benchmarking/v17/.wsuo create mode 100644 .vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 00000000..f8b48885 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 00000000..2492e94c --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,10 @@ +{ + "ExpandedNodes": [ + "", + "\\cosmos", + "\\cosmos\\scripts", + "\\cosmos\\scripts\\chaos" + ], + "SelectedNode": "\\cosmos\\scripts\\chaos\\chaos_script.sh", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/azure-db-benchmarking/FileContentIndex/09336a42-748d-4803-851e-0f12bd65a669.vsidx b/.vs/azure-db-benchmarking/FileContentIndex/09336a42-748d-4803-851e-0f12bd65a669.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..00b055b220c55a8cad773fd9791f0970a998b4a8 GIT binary patch literal 336320 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 E0kpHfdH?_b literal 0 HcmV?d00001 diff --git a/.vs/azure-db-benchmarking/config/applicationhost.config b/.vs/azure-db-benchmarking/config/applicationhost.config new file mode 100644 index 00000000..269dc55d --- /dev/null +++ b/.vs/azure-db-benchmarking/config/applicationhost.config @@ -0,0 +1,1021 @@ + + + + + + + + +
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vs/azure-db-benchmarking/v17/.wsuo b/.vs/azure-db-benchmarking/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..0dbd0761a7ea5cd55726084c79d99270bfad0ffe GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..af23b01b4e11bfe19cb0e611b733c409cc385352 GIT binary patch literal 114688 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 Xn+IozOpbop4m^d7#L`XX+uHvPgNTz6 literal 0 HcmV?d00001 diff --git a/cosmos/scripts/chaos/chaos_script.ps1 b/cosmos/scripts/chaos/chaos_script.ps1 index b5947e6c..dffd12b9 100644 --- a/cosmos/scripts/chaos/chaos_script.ps1 +++ b/cosmos/scripts/chaos/chaos_script.ps1 @@ -1,3 +1,31 @@ +<# +.SYNOPSIS +This script introduces network faults into a Cosmos DB environment for testing purposes. +.DESCRIPTION +The script takes several parameters to configure the fault injection, including the endpoint, master key, database ID, container ID, duration of fault, drop percentage, delay in milliseconds, fault region, and wait time for fault to start. It then uses these parameters to introduce network faults using the Clumsy utility. +.PARAMETER endpoint +The endpoint for the Cosmos DB instance. +.PARAMETER masterKey +The master key for the Cosmos DB instance. +.PARAMETER databaseId +The ID of the database in the Cosmos DB instance. +.PARAMETER containerId +The ID of the container in the database. +.PARAMETER durationOfFaultInSec +The duration of the network fault in seconds. +.PARAMETER dropPercentage +The percentage of packets to drop (optional). +.PARAMETER delayInMs +The delay to introduce in milliseconds (optional). +.PARAMETER faultRegion +The region where the fault should be introduced. +.PARAMETER waitForFaultToStartInSec +The time to wait before starting the fault in seconds (optional). +.EXAMPLE +.\chaos_script.ps1 -endpoint "https://my-cosmos-db.documents.azure.com:443/" -masterKey "my-master-key" -databaseId "my-database" -containerId "my-container" -durationOfFaultInSec 60 -dropPercentage 50 -delayInMs 200 -faultRegion "West US" -waitForFaultToStartInSec 10 +This example introduces a network fault that drops 50% of packets and introduces a 200ms delay for 60 seconds in the "West US" region of the specified Cosmos DB instance. It waits 10 seconds before starting the fault. +#> + param ( [parameter(Mandatory = $true)] [ValidateNotNull()] @@ -29,28 +57,6 @@ param ( [string] $waitForFaultToStartInSec ) -function Show-Help { - Write-Host "This script introduces network faults into a Cosmos DB environment for testing purposes." - Write-Host "Parameters:" - Write-Host " -endpoint: The Cosmos DB endpoint." - Write-Host " -masterKey: The master key for the Cosmos DB account." - Write-Host " -databaseId: The ID of the database." - Write-Host " -containerId: The ID of the container." - Write-Host " -durationOfFaultInSec: The duration of the fault in seconds." - Write-Host " -dropPercentage: The percentage of packets to drop (optional)." - Write-Host " -delayInMs: The delay to introduce in milliseconds (optional)." - Write-Host " -faultRegion: The region where the fault should be introduced." - Write-Host " -waitForFaultToStartInSec: The time to wait before starting the fault in seconds (optional)." - Write-Host "Note: Both dropPercentage and delayInMs cannot be null together." - Write-Host "Usage:" - Write-Host " .\chaos_script.ps1 -endpoint -masterKey -databaseId -containerId -durationOfFaultInSec -faultRegion [-dropPercentage ] [-delayInMs ] [-waitForFaultToStartInSec ]" -} - -if (!$endpoint -or !$masterKey -or !$databaseId -or !$containerId -or !$durationOfFaultInSec -or !$faultRegion) { - Show-Help - return -} - if (!$dropPercentage -and !$delayInMs) { throw "Both dropPercentage and delayInMs cannot be null together" diff --git a/cosmos/scripts/chaos/chaos_script.sh b/cosmos/scripts/chaos/chaos_script.sh index 47dbbb2c..0281b76b 100644 --- a/cosmos/scripts/chaos/chaos_script.sh +++ b/cosmos/scripts/chaos/chaos_script.sh @@ -1,10 +1,5 @@ #!/bin/bash -if [ -z "$fault_region" ]; then - echo "Error: fault_region parameter cannot be null. Please provide a value for this parameter." - exit 1 -fi - fetch_host_port() { url=$1 # extract the host and port @@ -35,25 +30,37 @@ install_powershell() { # Start PowerShell pwsh } -if [ "$1" == "-h" | "$1" == "--help" ]; then - echo "Usage: ./chaos_script.sh [OPTIONS]" - echo "Simulates network faults by dropping packets and adding latency." - echo - echo "Options:" - echo " --endpoint ENDPOINT The endpoint to target." - echo " --databaseid DATABASEID The ID of the database." - echo " --containerid CONTAINERID The ID of the container." - echo " --wait_for_fault_to_start_in_sec The time to wait before starting the fault, in seconds." - echo " --duration_of_fault_in_sec The duration of the fault, in seconds." - echo " --fault_region FAULT_REGION The region where the fault should occur." - echo " --drop_probability DROP_PROB The probability of dropping a packet (0-1)." - echo " --delay_in_ms DELAY The delay to add to packets, in milliseconds." - echo " --help Display this help message." + +print_help() { + echo "This script is a network fault injection system that introduces network faults such as packet loss and delay to specific endpoints for testing purposes." + echo "Parameters: The script uses several environment variables as parameters. These include endpoint, databaseid, containerid, wait_for_fault_to_start_in_sec, duration_of_fault_in_sec, fault_region, drop_probability, and delay_in_ms. These parameters need to be set in the environment before running the script." echo - echo "Example:" - echo " ./chaos_script.sh --endpoint http://example.com --databaseid mydatabase --containerid mycontainer --wait_for_fault_to_start_in_sec 10 --duration_of_fault_in_sec 60 --fault_region uswest --drop_probability 0.1 --delay_in_ms 100" - exit 0 -fi + echo "Example: To execute the script, you would typically do the following in a bash shell: + + # Set the environment variables + export endpoint="your_endpoint" + export databaseid="your_databaseid" + export containerid="your_containerid" + export wait_for_fault_to_start_in_sec="your_wait_time" + export duration_of_fault_in_sec="your_duration" + export fault_region="your_fault_region" + export drop_probability="your_drop_probability" + export delay_in_ms="your_delay" + + # Make the script executable + chmod +x chaos_script.sh + + # Run the script + sudo ./chaos_script.sh" +} + +while getopts ":h" option; do + case $option in + h) # display Help + print_help + exit;; + esac +done if ! command -v pwsh &>/dev/null; then install_powershell From dfbbd5da56fa5b06d8e44cbcc323117a40c67446 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 10 Nov 2023 16:22:59 -0800 Subject: [PATCH 03/58] Revert "Updated the usage/help" This reverts commit bdd84c9892c236403608171e9a8c85c944d0083a. --- .vs/ProjectSettings.json | 3 - .vs/VSWorkspaceState.json | 10 - ...09336a42-748d-4803-851e-0f12bd65a669.vsidx | Bin 336320 -> 0 bytes .../config/applicationhost.config | 1021 ----------------- .vs/azure-db-benchmarking/v17/.wsuo | Bin 20480 -> 0 bytes .vs/slnx.sqlite | Bin 114688 -> 0 bytes cosmos/scripts/chaos/chaos_script.ps1 | 50 +- cosmos/scripts/chaos/chaos_script.sh | 53 +- 8 files changed, 45 insertions(+), 1092 deletions(-) delete mode 100644 .vs/ProjectSettings.json delete mode 100644 .vs/VSWorkspaceState.json delete mode 100644 .vs/azure-db-benchmarking/FileContentIndex/09336a42-748d-4803-851e-0f12bd65a669.vsidx delete mode 100644 .vs/azure-db-benchmarking/config/applicationhost.config delete mode 100644 .vs/azure-db-benchmarking/v17/.wsuo delete mode 100644 .vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json deleted file mode 100644 index f8b48885..00000000 --- a/.vs/ProjectSettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CurrentProjectSetting": null -} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index 2492e94c..00000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ExpandedNodes": [ - "", - "\\cosmos", - "\\cosmos\\scripts", - "\\cosmos\\scripts\\chaos" - ], - "SelectedNode": "\\cosmos\\scripts\\chaos\\chaos_script.sh", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/.vs/azure-db-benchmarking/FileContentIndex/09336a42-748d-4803-851e-0f12bd65a669.vsidx b/.vs/azure-db-benchmarking/FileContentIndex/09336a42-748d-4803-851e-0f12bd65a669.vsidx deleted file mode 100644 index 00b055b220c55a8cad773fd9791f0970a998b4a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336320 zcmd?S4^-Ueb?5z=-wZH}5gtY(j1ZQFKN4sn5C|hAEL+0}&+`qG>f6LDHrmih}sva1+#Z=t@O@l`tdEn?H z2Sy(}^l;K;<IrUlqP#p$z!7jjvqaG|04&EBp*v2I63&p z!2=Hu4~`xie&oOu3o8$e-aq~OYq4~^;zs4^nl$ZhZfx4od;@B^?2ad{*A`65_%&&I zcsMz9pr*R=_~E0EK9YQJsPf@sk5t+xt=+q_vVLmkyz%MEG+l#(_YBW3pVr*~pZ@T% z`Q_8BG+l#Ft!L+#PqjC|r|6Z6fd z;}4`dfKvy^ss{Fl(^1lAJerx;jl){YB2)SQ_&K3$EbtFeif{^dOL z>2mWl2R@;1KPp`i`&wRSv6wHB7FJ728f9JmY>@;1KPv8HCdFIn)reF?i zqWfp_EKjr2bX7L-|AwBt!MNa&!G}kW9e?CNa%AM;;Sohj{SQ2P|MAgd_Ye1*`au7~ z!;k3uN2-pUOvh?-{r{i+#p#=+$rKpfe7*AFM<1+u0H6@QH4<;WOZX6su`sjnlZ=AC4-SNSjl<_H=c5UCCd~js=#%W25 z+K=zOX_}5c_}K8n$5qYmzyIh+|M8>!gO5CR0~R1nk$MSVx@npoedPGj2P!93?k2_C z5>|TVW^F;!(ZOFCe%P4FUwqP=dvx=5eE9LRj~-Al^~O#5P0;kv{WD7At_~i2boBnA%9BSQeYo=Ii3e3vG4=B6=*;}~!#5f~ zJ#w8iT|E|WR@~)8B1wk01Mb@PAxq|8BBoe`P*BIDGuX z(T9Jf@=($QD+h*#?@ykb>Ufx{d8PZ*l@h9te(ctt-CSw9(rKQ`{BYrYi*G0{xZ>Ge zo2FyQIJv70%&=`_vcR{otYSIje?jy`%kIWl~yKutb3yF`6>`@GB3 zRcM;YBcqv5J^X@FMZ)D$XZeOaua4Y>?x@CT8WN;lJfhGFZ%J>y%x=zNu^ut?u zc4?Y!7+PTY^tm72N}HLc={gy6nV8KFpWHTna(k>(tM1(USB@3Xhk7Nq%f zC7R~OzrV=+)m!LWE~V)PTIQBhcZ|&+pJt zIWX$S2j-1Wmsjhp;Lm|g%p;#>rD+aq;-5b_Z+yDET0dt#^-?*=U*rqvnxM)8R975u+(v zesb%)$+mWfItMIbd`Scn3q&ndZ%nQD6P9^U9~$X}SiZdLNueK3yIe%#BSHmwsR#Z06*fUxB7; zu!(u))8&!D9QpLI-KHV6jzFsq*e43S}YclGS`{s{Nm%HG(%2Rdge8dIr zyU$M3HQB_!`L+4u)8#IBu6&wLd77Q3h2_)bE_kkdnooI}ou+H^=^LM!KY5zrg6GJn zA3rsJ_UQ^VU6WCN{n~Z&Y4icL!6(s=2Ob!Ge0ZqRZSSUW1#Sez!LuAjf&uiJk2 z-(7FsG7C+nR9SheNFw&}nv2&tM|}xRx0V{0qYcrGH${`gR-^m3j765HA066ogEVQP zJEOIc5db%cSQd0o1|%IG^s@tj~pKzyj3#wQp33$r0J29 zj~pL<;1;vU%KNLOuihX{)_GOVhmb$>*ypd8rnYTcn%g^@?MIrIFW-OSy7z`$(}&(H zp*KKNXY-b>-P`u`+`zVkxlwx~G{Urq{Nqnt_u07$cVN)0t*IP+aP)Z9 z@yCy+U+-4@|6eWoRU50Edfsba&U`JS?QuM%c-G*l#1qA{5>FPsY@FNhFCut5zQy>K z;JX7S5C5I`m*QK2Zy8Q8{@dM21lJL~3nz;+>+x+MyMfqdI!_RBc-PC{ZsPGZ z#G*{B!WZRCDZvW-dR$Hdsl%zoiQ_ckY{IF>xfiDeCx+9C(~i@H(}9z~ z>BQ;AX~XHo>A~s4N#gY54C9R8jN%NMkMLY2&qdA0xucT1qP!X9VkwbI!w_Eu&MG|R z_)GCu;*a7)`T0tI&2leirTLu?I(WRK%1AwC80A|<=4xX4b|t0wJP+4YP$ z1ikn}L<$Jz6R9E=Cenq!1Aiy}Zv4IYd+=Kc^xclL$cUe_7{^MWZz)bA&K8_zd|UBt z!?zvZ4tzWD?Z(-Qvj=A%&VHN&I46vFNJxS@eIGstpBG;SzD#@pa{T1v5Y8nhNKS}w z0Xg}Emy=ONP9Yg#!VxlRXeuIOBWvo&uVpOGSQBHL7^^4$UVJT##TaX4tevqg#yS{F zFxJUfH)Cy#^)lAOSRZ9c!u^DY36BsSB|J#j;rG4#et;}LSvh3nk`*K?L`DHw`G$a9 z%V{p8IYM*T(D20~nm4koj?=Xy<0P9%ZemwGr(+~rNVbw}C)q`^gJdVkZjuR-Z6te1 z_K@sjTaxB}nulo~p?Q?%L7E->Vuh<6Vve6kz-Zb3@bYF3v0NfSA|YZ0MDmF($5%xp zf-g+05MK?RB77T3)#1NXnEeuC3G;MGcEwoooEGDhL^?^VpV%<55n`jn28~w6WO?q! zznKErA6b$Tf?1@ph;ODWi^ygpgp}7!FVP?hyUs2!2nDBEX|=Xm!(0LhA1px zX+DKjd}KKr3)vW9W0=AkwiK~(Bjt50ujQ#YPc`w>CT_21`Mm^VJk`QetvuDvQ(ZjO z!Bd?)mEfsvo@(Q%UY_dVsXoe+e59X`4D*o@J~GNj2Kk8WiA6_nIJEn4*xE|tA1Y1p(mGDgX{>=Q^2eF^epGk3;FXZ{w_>U zgg-Ch&ujR^M!s1`Wi4CcbT-ksiP!6?jM3RbXDglUbav6%L1%)_PCC2kY@@T6&K^4Z zcs)Nma2sOsa<9M*MZ8YKg>& zG!fav?s`%&A}vH(iL@J27U>|;Nu--df=Dls9wL4C+lVCb_2V1HH-c{z-yps+b111* zM*d}}#fkziIa2=`5*yi7$3U%7^8xu936<2r$4Z9@FJH}|%o?!|`}uGVOLF;ekPnAg zQox7vSyIJo%UM#$k}yjmEU96*h$S02QO8Ivuf=(-iPtvqT0JB8Qr5z2F92Tu4ac#%2Wk~#vljK>*oVtfNduc6!cRtOu+~RqZABMAm=MZtD<@%r|Zb9r%Z;zAy&nO8Vc-tC2A?I z=YoO|tCITqk6!*!mQeCgK}5dWeO}JmF}_m1;KD}o>WEusnyKfrI4ye^H5Rhf&v<}w zhme=X9Ex)px9aRI;8Z@|1f77sMCB zUw|(k|8k>To(QQh{z9W-u_96%iP%Uf6(`k1Y7-tsN-m`v zUQ#`z`iQiVN)qfRI81Pa;3&aC6SP#zK5sUhai#}virf^xEmZLKgbB11Z|l$xdO7GY zdxdeg)LgW+>$T#LIu$)98 zi7+`45)$9cGVJ&6K*2BiHv%7 z#R#_$ZYA7KxQlQH;ZDNcgcF2&3HK20BcqLQlGFX19_I82r$;$G$ms<)bbf*XBSMF~ zjN}l>B^V?)6MzDooE5UYxT?9J_b`tC+m>}3ou!mqDzBYo%8A*_o z$WJU_gyB!U{GRpQv7pIH3yyE+VOSa>%iBEuNz+iUoXBMe0_M@@Fhw0lNu&9LTZ%Mpow1ov%`N(yK=8}mb%iteco6 zFV;iMvPk4zo+sLXS;TDcQjmc^)6k>1v?7N@E)_v4LL>^P$S1Mf=x;?KIbjkJa%#vf zB4;CKY^WcI6KEn}Lq7k##z)9G23iTU6X+t)K_Ee(lR&re4uM_*Jp}qVlO)kkVwl7T ziBS@RBvu;zmFd%wU6O{Z$FqS*gOO(iIX@5ZZ9m`6;ao1?4)W~~=L-0CKIf|V8~HN1 zurTN3&T6>VIKddO%&C$u7#o)MXeOIQ`ALK2So{rIw|U=sEwjtih3yO zV{wvm{hS--+z97JIXB3;b$ISF&g&l8I_q8o${%g!m6(29;>tWVL_<9YWDdOuJ`Rh8eYI!A2a}&**`1kb;-)rK=<`$Y;X>O;v zi&r{$B|&p1uXOWD8_m7E(!(o#>`7A9Pt`D0BUFu2HAq#I^QHXHO3v7nR{B0E>Q!V) z$R#$LD3icUk44=;)M41mo&be@3T?Vn7^KjqONBOFI=h_0LJE~DMNGQ%p&|-5a@Lye zvvJNgads1Dt?547!r4~NwsW?NvmKmGaJG}P-JEUXY%gbfINQhBBxn0MJIvV;&W>_+ zkh59Fp-B8>G<5ohy&TKoLM~F+3n4C8g}qQ^e20mVtf8)sQ{7}Dv0abVq9q9LMs>AxzNRh z4lZZ{F0^r>mkT{ykeN!7*-z#$nImM5k~v7GA8!C}4w<=l?K@@`;LRsVWyqNW0s^A3+@aGd;jz^`=2%a#(LOeFc@NDF= z7(@Q+W@3zd%ZkXA$yGN;vSb4E5z*X|%dl{XX8oPP166C48SUK{{)Y!4Xd_qFqF?>)mxVHcZH_vayY`@)v&0DzuU;i>v+7D!Z?LZ6mH_r>Ulgy zVGD(=6t+{?MPUbp2?{$Y?541d!d?n{DD30oN%r@%f0+Fv>>p+SAp0F2_wsmv@A&zS z&2+vK3nY^|EG@sR?Ee7rt>HD{I^Rpor@h@ z?Bt@&bS~OV=VA{R`}jXee%8;=hWXhDKO5y|gZxa1vtu&Qyc&wF(4MMgpq_DsC}nt+ zM?37Q;+X0@8K(TAG**GG&y9G~;jYU5k#sftl=4|CU5dA-l37WY!d-uSGMQBwT)Hql znf*oe+a|N70NzK+CbO4UN-HQ?MP4~)l+s3dVKXHeBz(jJe8r*E%jf)jC5L~?JuTeR%02De z)5Sd<+|$WD-Q1Jlo;L33<(?ky>EnG#KHASmhxzCTA06eRgM9R)DdDQ@BmPM2T_3m2 z&$b*sl*_gt+d_P(fNlAFsEV&GH$i4ago-d9s^PXGDmIc;$DUg9_mMR-FVmSS*ml*;;TE;2gs%PE%de`m zt}>L(&LXz1E@@F+J))xea+8-SIf^JnszJ6$$&pGQ5gYkOY=JRSPh@6+F_Eq@s;-!> zF-B%)XX)CD!fcst|7^9F`89@9{g)F2S90vKR->vh)mY4tgj`K<%?^Qn%R_)$Mo|<5_|y&orvkCv}$M zS%GI6sbZY9L~KJd)nGcLzAbo~akk>v?v=9xXD803-7Al}SNGu?z&C{NApS%6591uc zS%>c~L&Jb5*+o#vubK`|n5L~FOw%`!K~n?emN#&B849nXhif?&5pAMM@r+pKS_auw zmxtN-ZX>ve$nE$S<6naR4uW|^?j*Pr{|fxe@D&qWi_fwyXjvE8g1?#IR)X7zY$v#b z$W9`=3GOAhhu}Vf`|%$jcps4gVnd`35<5idFp(ofY)&Vp8AjQEIz&AdJs(`jfX%1A zX>+|5QQoz^RF#qcXeGb15_L;`PZ;|q8LqJ1)gC>gf2-&&21n?4SMa&0aZjttcvZZTG)DQ;QeLm*b(h*Q zJ}fp?@Io116W_$cQa0;dN_lk^MHOtaZ#q%Ve<-6%AH))G;wagQ3=>TmLm?{>Sh&jV zDt1+{OAMDJm$IjlJz}r>8I_o?;@cH`TR$r2LuHhdl4Flszgb;r&Q9(4`l!J$T&Une zxjB*hD)^mp{ycBSktgw=e&v zwz={QGRF)g9QS>hr zwy?3_6F^f0X;7~iI^bWUrC-Cb`>U_m-bCQur}d?B?MKyPaC?3{(R~erXG|q zv6^ndSMYTdTCb;036`t0&- z*~DbZHqcUyS2?npT*{GEe>PQU6`yStS|w;t5h_7Dwhr&aahePqC}r~krv;~V8Wv~@ zLDBXL5QQ`I>}=C8;-%OzP$-W;P;L#!%QFtoEC{dC1mrjdY2(;Z(tCPXZr@xkMuNSX zg4O(RwehF=*66jLP=HVlWe#8S@`GGLK|&$Q3JB#>ww$gvYGZXvss>~^xd$nGG!lk9G?6J+<2-9vUC@iwxP6!%j+Oz{ZCqZAKP z>`HYBj%afq2Qa$tT7b}UK2^oG2%icQD&$i&v=;HHjXY=D!Oz8c zu8HSt-V~4VTno>&@?1O5b@5yW&vo)#H_s(_u9xR}c&^VNl%7ix?Eh z<+~DYsX8{5=ekeMc7oZ{nmg*DD}O1o^i1{8)le2a*X*H}*&ceRpU^O&5kjMc1_|ll zT+ZmortE;y0X45{O^T<$z*L_sFhflxRfHn(NnnQZCUs0A*8*llEHLBpma%==m~9fN zF%+}ksUUx0WuaY|55WKdat`yUO(fCfzfCB?>K=Di*?Lk%2y;4yq=B z2fjiCJWxkWFDp|ZFqK+zZbwZ0?$o6nvFR;2b;R73oC;9EnFT1zmWccAX&qeauy#Ro zP~OdNY*8vFZN@FMMs{GTei*CbV8q}6RX>cW4pW3UpQxj_ma;hUCgPh|RZl2JyoGox z@pj@}lyy+nNm(~#3F5t!^-yLNEk0Ax{I);1Af3T<0$!_*`GO?iR*}!SnqnWTl=`NM z5)Oam<*0ooSYk}#R1or(m$w3(@pC4J>|D+SITIqgfHV1IS25l)>f5y#08G@s8jf#XE@CVV{?MB^C%#V!~r}E0ixNoc5Ja7NFWsbq)h* z<*K$7m3RTg`NVDea)TO|Vd83H+A6);m#6B;spWLKefhz95|>u#Pj_&-lhfUtR+YY& z(>Mp%oL0P7Vqi8YYXnqJC*knF6foy7o=YM~BE)zBiG0SF8+}n5Jv+>JAySr55!oBbu4CLcBy46OIx<=HUlIc>t}43u@S~b85?BG&!+=?+Tkl+Q}x}R%cp~U zI>hz@KAq3@<$Os9*a%+=v%Qcn)i7Gbmp1aHI=0vHdYsprczqM2^=yyvdJC_&@_IY3 zcky}$uXpl#H?Jpny_eT}c)gD=wHesthQ>!xl6lv~Q z`dg3i9)6AoIIc+5YjCGO%H?>FABFf)0mt+C(Qhw#-8I}<#O{r>*74z5 z8saoG(XfgA^?W!+LkkV9G_=#uMMDP-oiudQkf5QLh8`OF*xg1$lGXjJ9%l6jt4CQq z$ZDB8a7GOpP;hHAs!(QNpRp;qa(_*Uyt+lUny1MHy}OAVl>4lvYc*lX zq5ds+y!uNJoyrnQ>C~8>%nIN8h%_z6TLg!;STeQ0KRGSt?6~2Wa}IH%(3=9Rx^d$f z8#k6%Y)0O+xKXgW=}4;Uh#TFHmQJz%e;zTqnAHUf+g6h?Jx)uPWiC2gT)@~&!I&F~ zDF#y{wt!*SRJi3j;&e_i6>g2q7H%cx7;a4&XTKSa$jzb1RgGM7?W|By0lE1UE$8Vf z@*_MQrl^poYxralPg{6)UMS9yuXN-Hu6#(->c>A zIBz%c_9lK@&-Y@y-NM_gyxq>*UA*1F+nv1K&D#my?&a+s-tOb2Hr`J1WCLOa=N46L|9yvHVcXnUqDV5!loORi$c;wi zXDy^Tq9R^^0Y3v4IXn<#z#@kSgdDD7z^%0kIjkmi4JEeLT5J)9WpUidO%S{4nUPx} zot7$KO9yYoNzV6kewgzkoFC=3A>V;@s@Op}t0lx-oqnb1~3+bG*kXa^-bDcMbE zFQGkz_7U1o_5nioQ8qx+5Mu{P9OBGjN{&#njtun{vv~M!KCzjO@QYS^VLGKQ-MO?`A!g1&o>*-ZTJ@9*C?Nc_%zCQ z2R=JVYDW21;4H&aY?=!m3;xsym`C_e%@{V~--6RTIpycKQ-1Cwsc$d7J^1$Fvr~S) z`|uAC93pa%;2|Q1@gGT7vDOj03;#(&=bHhOM#UDS2(Z?SB6=P-RY%iO%rcDz389L# zzilJTF-fnwW9l>72vf1;n;u@yX2oqBS;Sx8PTgYamQZ&G^?4k*lOs#1TS472RuuE( zTK;}LAKSo@2I}k(?$$=0*utI7G;F0|8^^cPu!Dx3H0&a@n|t;8ka3O zdEAUMlqg|eO|?F$;#Dc2KDabdVRjkKC3vln_~py&gI#KQ>@p|i7919^a$d2)z2Th|tco^Ri zeB$RiB2qLBMaqr|&MLO+pJVL*uiZv0o5&(!w-Z@RWC@Wwh~yDlY8vQ~6-1U1DK-Xh ziK|u(q#B8AA<|52E3s|FwiDYyY$vhZMD`NdLu4P3{X`BBvE6fNQ$#u?g*sw%N|In$ zq_%>4#Fj03eXqk`c=?g?7kj2kie2Q7M`5IwFDz8m(X~{zJ*uoKqLY;im}d4P3bq#r zkQ0+3S`aHF-#3+$y2`tnmlwR#H}@X&JT;(YnNJb~uiS*3-AQ)cO^ICFN%Op((O30+ zWdLQgRRoZ^%dkyhkN!lMhbPkW^`)dL4Ibc(VEO6CX6{~psDJuRJy~ie@%4x5FIO7> zXx`5K<*7GyUqNr}J})xdze-c0cZs-Ql~VIS->R4(Ad2j>paN=1o5%K_YNz_={xoJ= z+oqf)OK$svc`9P4`=D$;$t;2Nom#ewp1?d+!={AAaR@n5_eK7rb_n8H(>Q9m6 zQZ@Ch9!!5co#ymoQ&v&|d8IiB10GX=B=DHF94sbp33+#rx0F1&6$>6Sp;03t3m7Ze zijxM6DWVJR;)l~vPr(D^-G?K<*g=CCa}MD8MZ79^-b{oI7 zh(B1uw{GWKi}}_aY|rB(OZnEF{MHISw2Z$f=F@A5ujktvc)5Yk+|8Lr_HN-Xn)%JG z{N^@3vz_1E!Efy3H+HjqFWdL9eIMKR^Q{AHzmJa$@Tr4*ZitT`;`fj6p~HM=9pAo- zuV-;!Gv5&&Pa7w+P(@H2RRRURigLdm*feB~eMaX#kYzTClx!xEWj?~62x@4bEQ#_Z z?K;qpEVB1q&8w~0=EwJMl@FfqIvLId2^~J+nvb*wW}~nk-en0A&SONUD@Z$-9-?Y()%L zlA?sgOU$8G6?-8rW-P2wWBSGyRyb&%!>eM#)cZzx%hrU0>&e+bP6IjX$hnK0_gUYe z*drVNZKlf>vte6sF~KDS)1b%5Qi3Z8F2k>|O<}VQBh4tB{?JBl{!4L>!JPyz#XZUb zxVT3}ZZR9V#STv{)k$fVZ5o}5h=ls{$n0DApJN|H^hPr+Ko%j1-)6j7d@g&=OM#+% z@zT9O-@eJcK#n;|6+qmuEoNKlkfUKHgYBMvJi~ZK@QmUa#Iw#WCK4;6oKrk0C6$_62MIHre5&sFlHCpDj|`5vt@@=If1*0+2TXSZ267>He2MdGi@`^RLUbiC2ysa zXA;}2G}AG2Si&~Ca_3t)PxP^>n0$T}e zBfOo!4gxy~*i?PdUKZ_P(LNUKC*uH%?xS#kyAE>K5Uq#UbA%;_St52xI~G(m3hpAH z)|H)e6b?Bk=D7NzC$o(E`?zWyO2OpjEZ?&2S9!_%?Soe=PS`-%g|W0IG$tb{8?IqV z>6+NCwAZyKcXL6j##C*X_WGs`C)IEzN53z7YeD0BeeDo4Ce$&bpus0t?@slq0k@JR z*#wnDXYt8Jq%KRM@3eWeO`?Ov#N1cgVB}mzvaFHV7J|)0wi2;SB=HviHxm~ppCD6#pX#VC-)yNN zC>6LSqgIiqU@Xo2H5*6@Bi%raPI0>e{?jE${ zZQ8Vy7Q6j?vyI2B?aG$b5<1#O2r(P9r}U|(++rC+GDi|Z*Ke*Tyn)-wjW{)mMT+#4 zjjC2DEmol>iyEQj3ZBbM-X~M31Jb0!wcUi0%A0f$*%aJn!pjSbxNtkw zi>Y2h^&M2_F|d@HI~iC(^)d>I8CXlpdY<0E;Rf#7OiLpNx3ILCbz51tjiK$V+rhe> ztlLe^UTXGGvyYnn)EuDZJ`N5rbdZ;aICzMck5F@%nsq#V7l)rPBL)h3AC+~@;^()K z$R@Oi@!KhzR-sBL{wnsYWo$jCqLgjmn}W^X&8Y?kHuIB4c5NZtOvP3zwy|qF z6+5WdNyTh6t66kSbx2Fw1?4zV+H^*<#xR#{HJmk8nIoj!t*gxW#Gk*(6L*DEGFDD% z4a*%P&&Fm>59FlyZZ?;;kYkEoR7?)$=D@!U*Up^mFi zvgD=gs$`eS{z_7mq0EJ!rNk?VZ<(;}Aic1iS4nUT%>b~bma*q+6ARcu$uJza0FyR_bZ zXEDdua>(k=5!Kr_v$c^US1z{K?WJxHb^EBZ#rC@UIAV+Ke|>4O-EXDzhzzejZ-p5l z*(J-F#TPg8HT6*BymWRdo2y{%wcwC|oycAgoVm?O<#0XX>PE}By-Z_%0F7Kryt2H&9${8zhDV=ns2nJLmA^G{`n!K};wYwRRl~BweeV_9C zYL(t?8l5I|%p&+cayA>~Qn0E(MbGPTY^qf5GZQ_k+W9hm2^NQ{G9ZhcMdM~NWR@*$ zpVQEHnzluL7TJA(i-Ih&`v4bdAD~@odcZC<)jmKik^4Kl)O5Ixr|eRiSDJWb6MtRL zQ+BE8D=}Va<&}0`NiU^&CB2m9mGn}Y;Ur!CbPdxrLf0r=gLJu6Ih^-$K0t<_47=Ji zBS?l_ZJLo@ZJHrUM21~$dfrmfXjhvy#%XM#F}>Qfv4zG~8rx~?qOpUR@Hnq8nkUp=>7K@n<>wz5l&T21riAF!l!@Y z*JMh#`ers}V`y+kE zBdhrrWfZE^uQovmWvfk&CTU-=X*(q^Dj3=trq|XmompqS?aH!wpY@)~AJqg=;9X+G zAY$9@uP6*q=l#+!V3xLfsWB0ny$!qlcfE*O@a3FOcj4c-Rb6;nWj$*7w$}2^t5rF+ zHRJBdaqONP4ak>hPfj5v+O!s-#4fulvEzZ-6&Xs82Wnm^Zfn09rU*@+5Y%j-J0y7Z z2|>lTE+jw=eY@>*vWl2Rh48VfP3WjB@>5edG5JcHZl{!^+3cXB)CBg5ABu$~P+6?P zR>qXQt|1)d-^&QghP&x-)MUPz9aGNhDdU@N$ZDY`YI05fpnq9g3h1>O%T4Uhl&< z%E13UYpyi+eebSKP-R2nz2LH)wh5A`JS%1%i)B*LAZ{xmk#vzQlCD3$cY8cE9bdv9 zOf#V_yB5-fD*RAyS{bOC2tq4avw5cys7nD$??nQoOjdv;YnoJuI3l~G&~5=eoeQ0M z!sOlNIs}#BLMB&X^JL(3 zS@3NCFuRnWzs~@rbZ>$&JGPel-xO(=*wL-1!L|t}cEXk%mAPwaQZPW!qHf;nC8cGi zdN23XWJmHReOB5$3PiE{eXLkRq5Ui`2yo>!#ZOHND{6XcHJ_UL2xYeQynv$RN|d`| zqMWBlmxXn*3iFhHma=M!+Ev6WXtb+HbleJZgl*fV2P&aRB+7U>%1>9BrkSTMMS#~=?4 zjKM-IejP*P0@pMou?hu+_gFxIxy+=eEvKoP+G?cWuPW0O3jjY=NPO@8pj$<>bzP4< zvOPz0o5qbscPb49x6CNp&ON%b9@%(6NxNGv4%oG#UKS8tHkE{4ErQZusq)amdA`0! zT4pOwaJ`gsb>9$J-m%-&J0 z8;zK~qh_$$4*$mN-5jy_(J% zJ}O&DwbORy|6E$Bm?hp;fm)?ewJmfH!nDqX3KU0fvU4FaY9v(WNX| z!IEVxD&{VQbGoZ*EeE4Ctmn)Iq75wB%M4N(y z1y$0RYelD3GeR2K&Y>i|S*XNr7Amn7PA%}!r3@t!m>N!7X^HEOm|DDXyiIsF;jJgr zR_eSlysdcK@pj?uz?;C^iMJbX8{S^LJ$SYDBuPm>CBu}AP%=u%pc&?JJ#U`4q*Qb& zJ-?>8n7{s}P!I~aFTGW87QEbaAjeI17~QtD*UZvpdPu34YCCso9IGER-3UwuZ-V;U zQlvt0bI+YZy9Jae_XO7>K&jF$17{UVr;*eaV$GzslG=u6JE9#1#u zE2gCPy$`Atq`Cejje|OKO&nBOfMXUg_FUsF06xiQrP41OQ6pQD;L7&(%ja!E&{^=| z&4%|fEUt)J3}l9c>QW43hKqr;0LYAD!Y9mNV4f-u>b=UJI(*&BAt5B!GO*qNwgW;% zs@B>_;0lmPXEzyp$=E~2J~AvMGUGl11B4F}9wKmv@DVZ&lVRa50qtp&I?H>O+QA$J zQ70&PEZz1Mf=jMMPDB};e1}$ZTt6qBTg6G2jT-rJX!Fu`bwuCN$;HAR&4#QcW?AQN zu)BXP^w-lo%WmPxiI07F_S=z=`?zFOC(1Zc-TvAmceMLs3IdQtVmoxk{Qh6 zL#6E1Z&tF`LY4ltEebtuLsKOVDZgERXO~o@LMVq#DTlS20R0iO(Zy3}HUS3hMi*U_ zrk;KzKDowF$OPrEk(O)RFR8n+BFP!|ODfvYzcfP0XW=4E-d{jjbn8l{EjVNb$+Y{# zGV{@j!lo*oETk!HY7R~I-p?j`<;ru@_Eu>x;&T=*q6L_jtgf1E0Yc79+Jw_k&s|@m zES;K#(G<*d(6VOVnkkXWYmdQh1K!BIbmUFw-%IS6D|Id^viy?81!h|3vcVj61cbQL zsZG_#rVxWu$h4W|ubD`~ff=YpAxVTe(MOwx()s+{P&)rcZ7G%Bglvb#bbLQ=NRGn^Or+wQ;JKPxSDKJ~kxTkiPtM!zdec`DwGg z`CS*jAHaXm>=4jyf3y8S;+IX{ZIoDyqUTCOuTxQtoqo-e5!gzJU1?I1HU)EqdwRGJAbwr(RP=(-kFR#S1#HF3_CRkgkLTr20=&BdeV zIyl$Kxo*xSIM>FxUe5J!PB;9{yaCn?sM5G=Ib4mLL^ScI`H`(=<$`-*ff+vXoBEPM zVwtJG%wg66w}>tO#-?2nn7V}*aJxkQQq_S~E)!QRNtrgfyIRHG7FFiGVn5|s-0@HM z)O21hKr{^ti50w8*QTqZZQt6t!;J7ZSzeV`UWIHVT(W>;!qOu_E2lW7yk3RVZhKwt zFn*;WLL_Q9U6l=0B@w3T(oGYol{}#0zi{uX`J#$8Y3=ySS+&D1YjT?-^Q9dk zUVCh`drg;v>z->bPl?;YVM>K%fn{l@rs*}Do~G7>91En&2Ci(Q8clRM>g;Rnl9n&s zfg>ZVwM#anpMt?(V?@-o4DO_r3yPKlQgCI1$&6{iWRBm|gu}Vy*d=M<0&?;RTkP>! z8`bF2Kw*!YEaG=f9eZmTi!;{5m|cRp*G4sCF~(XMYiF#Bu@1%(jCC^BZPt~K^)lAO zSfAO08tx}NOn8LwDB;0LK(ElS5e44AR7TA08rT@y?H5e#?3Fi~R*lrK^v&+g?hgj}S0@VRMP$paGK$`ks=#QWmhwT)k?< zvH(YcP{gF1saAWzdbhb>EY)l8RabK=X|6bojMys<#f@Jor>w;b@*2AMW;JE*+D|7nh2%P^>Ea}A|B}oR*u+X_ZI0V@vMcbo(k@Y#oU0wP1fNn} z*GIeAu?)L5S8TQ8aziGtFd81&Vvi z@cvQ>i9Vx_#@!II;0{`$kt;baB?}lpN<73Ctpkc%*XcE0K$(a~eclBDU8o?r)j+Bw zX2FPi1uRyl|e7~2h;$jI!ALSLx-Y2aaT9o z+FprX*=?GL=b~rEe7yo)UBY5tgdG3hwOf0yBNhqt)|%$*za#EL2Qy7WwayWoUL zjOXbiFZf4GhZc@LqjY?)RdeaDtF02eskvr}{j8(S3of@7xFsx;u6GxjPAHVfMssJk zS`WIf!BOhbPAoyJo7k`!j#H>(uuoU{WrZ0Eo8?N}iiDlDbS%zX5r{KjL$b?ko$UM~ zv$k}RYGNBOP0Vd(m5MgrXcelEkWE2@epF}Vg1y7VR3=rEY{%0{q?^11dCF^gOyeUm zOmM{JIOA+=PhH2b}gP0$Pn?(_zmx1GZEp(8)JY&xnTR3hni~aSSd?H+n06 zmWz>pJY=t$QW?;Ob_)ikb+ucr*-M2(#jFn6Ud68D$Uq_mjJ#e{q|2zbtD+(uyPi>Q zS`{aC30-HcGR};odm&3tIw^%QwtS>fUkQVWCDe3_nC`z{SM+LJVkeGjP|Drh7(>Us zi!q(Jl~|=q`m2=WQ{5;v&7156J)Oj+n3E(nLTuCsNkD%k6v5QZsxe}H#MCi#<7!3J zC1yazU&4QvBB-V?6(VdGUlW~LD6N*CR8PTP2a$gB*;Q4WMOzg}PbsV}?$lW*=hf>dy>$h3 z=AnqaI@XvudS&ZM{LO>KwtSkfIl}a0dFljrnR1^Dg_;GaB2qd*_Yaj)slwA@st2h- zYkBN-E$W$?Lvgt+s`UC2C#i|eyUhr{Xi)aODm}+4F$}%A**dm+LLcu(&|J{S`PuL z;}%EVO00v}Wy0T|mVe2%+PEeBTyJNMz%NU!-ljJHAlhWWB^7GuSR1}nC1tC#ruZ!4 zrIliZG-B$5tVVzJL^DL*?^7Q65iElotz*rHiL!z4cFg zQxDx0VA*6nqnO{lL1}8(S&n{cO~;ffP5qjt7pH#HV~|4bj`~^uL;$c@xn0z`+Te;k zLQSkR-wHjh9WMqoYQGKJ2l=*jULc#VRj%6OT4HLgN7RZg{nNiqKa-mFYWk@@seWHC64UUYy>I%R5X#kff6*=B>3w{X;bTzNKXmvN>)Ve zDn+fSahOOe?}Y8~P58~-a}&8t1epjiQNTn#6U&*G)jZuz)1Fb2>_t(g(Eg4QnC)-NZo= zuMD6}jXb_092-}d)K3{uftjc>Nl=x^8YWXAZHBj(`RcmcSgnb&+572m!#vzIi(RhTs!{nVnOFT-w zoLM({70CBj@)aAU$JSC3Wzl-HxHa=`5)F7CW9)I0V&qkEY$G4k;6^<|Dtg;d$CKH7 z@iyXFeD-$pxyBY#yoBOAIGD%FcM@M}K2-5CzF5qktuZ@EKDM5Z%G7T#+sKsy_ig4^ z8+myP#m&UG65qzycH%pDc_%OL=AZ_4_Hu9!2lsJsKg9<)cponh@bp2R9%A<)e&YzA zI?SgYGXe8hfHC)e2YZq0SdcM$k?WW)a$U}N70*N%50hQUcn#%6jBg~rj>=lv<0P8U zZCRC@&`qg{780!_+DUYg=pfNaqMJm5L@$XR5`E@c`9zZJezJ$j9wB>_>_M{E@xonv zri`wY{C9EEE(a@I#9g^GOrdqt$0)j z>cZ1u%0ZrPQ|Fl)aaEq~QBg>lqwQKoMs34OZZwNOtg!32qui-@?{1U1|Eg~JIbn(_ zyYQrc%zj!+IgdkH#&HulQ$B)(ajreywS@WJ-pG!TS?yP=dEGh8sV)`-Wues zGG5D`rIdZ^+n2JXYs`{l#igIHi*3UVD5h;XLFP#kkDFRwxt9+q<5q5)hA!y3;h2kS zs^WR&i4l`03U8w-)6+^7H!@VmE49?bS=_|pdJb%2U5v#oEN*3SJBz!h>7b^Qnr>0{N((kjC(*ip|7COuj}Dz6$boxvNr3 z^?3yVu5M)JDv#^9rfQD&2VFA?Rs5+a^aesuAz0Sgd$O#f(Wm=2S{LRRl!)rsG4?WL_2YAEJ8&==n2=a#2_cyG*_b=xsh5RJKPo(lSyi>$a zHu95N{<)4Xr1kwL^?YGgeV4LJ<)`WUPm+9~pAQW4fe}71$_EDdKpB6kM6bjY7Isw- zkZh|+SdL#}aDuN|(2M2{R0mV?6*y^%6%u%fN;2DY5>t!J#WAtP#Fh}dgIFG^J4r1i zwu0C)bNN?FbL$!&)Fh*wN%80ku+98tBc3g@&kv^d8d!*GM5+B|elT?(o&hsF=s9R^ zlW`7{I$}Uy;~9)+n*Q}Sy!?HDWqy|BaBnWlf-DPhZvo5lxwnchFX#P*yg$PG!`xfL zH;Q=wMn>wmx0Yw)Jln*xn^;lLz4sdQ&a*8%+sd=;Jln;y9X#8~vk9K<=Giu$?d91X zp6z2K$(Q^2@-SZ>;mf0Zd5|w#6XEfg8jd*TFXcid7nDZ_c-ha(4j=RKUvhXQmzRUQ z65<;Lypqp1s`w9KW58dm<9ID^#d)ZShc@vq>p33dp%xx$<)L;S>f)^q-sr`c4EM}8p6TY91kbebOfS#$@Jt_1C;4VS-yG(f zBYbm|Zw~TJ)laOxTyR6#P2?+1Q-H0-`!cq!1j=qi`JgP)-DZ%aQV%MrjPkGC%76=x zSKzAP%B?Wy6;|`FB+2Vd2p6#}Ky?_U>Wt zKKAaX@&J49<8uRa9i(T7XAbc@hxyDAK68TN$ISs%d)eg_n1nh3ofW16@S1sW<;U>bH$f##mjBpF#R>JLsy9jp>?j+nzI6=6Va1Y@=GTI0y zIo;3cVNQ>5dX&?HoLg3ET4se`F0x!_U*Gw?4n zU?DkrkNX*IP}g`BWQ)RyDY$}=MHZY8w0DoH4yop&dW$mtW~%X|2|iu6s4TBs;DVnE zIh@MnLXZm~P8Dz=pHs`xt@H(9P8Cv6WR|*AH=%2ht6QjUrMipi4yrq;?xs3HbuZOD zRQHk7Ms;bJm+`VOay=&1{x&d(2!|EI%%j^&4K!1#stcQ^IuzNvRJjsDN6rLPWa_U-e`o z<_bB}`L$bp1d>U`?N*;nrmL8W%~(Ra-gjOUWgm$zfjhEPBnGz)85IZH_ zQ#)@mV`95gr%i0m+et&4*9JGX$K&xdCQX~1(wdU?Oj2iDkv0jg3GiOO-_4^43k+To z`p2B(qa#4z`?>Gm{avo_bzR>zcIkFzCa1I5@1okDRX&-viVe9U>nS`enA8V*D(R?C z40Y~6pc%Q!d@0yXus`p(cs`8q2!gHm`%4Lo$MI4=e=2QM3@^!QCdu%84qLaGwqib8 zNV`wM`KKj>UoPQnZ>PPJ_8!{hxZY2DAMFFQ$$EX5oI!HN$(bN$ikwk$e2+lPK+Rk( zjnW)#eh5!3<5dfGb;mNkobhPJ;~8JUtBH)K@M;=$EBU8%zL!ISws@>1cLUR<{Ae{n z<+NAw@hbkPhNtRiYM`l!?`@)KGfi7)>R@~;<6VsRGQN%R?Tqi>)git&LiZT2?xcH~ zx=HE+xEN?EwA_!XQN4w!58SJ+XS#?Vsp{6K&K_5f9#|ctmlszv zu2x*#hRNe<#MNo!Ij$C5{kZyY4d7ZjC$jOxtJfr$jx|O{ug?034aT=t#H~$&YIW;e z4El2_lzndYh4D@V`y$yF#XAY?i{qVCp3gVX&GRw5lf?4{Je$n(W&EI+!9oVB8LVZn zg2567y$sef*vw!ngWU|aGuX*s4}*;i_A}VW-~fXy3=Z?`AkU8T>;%tF@$4wiuIHXi zwuDf!jK2@&yUV#XoabV>HJV%F=~=;3iQJmP->30AE2&K9@AZyr(7cwE4QS%uP|E+e zkuA1y*jU9AHLR^;pn-uVp4-I0X5QMuKXouD($Q81yBO?ca2xx#GdRRsJ2*VT?~L)? zoqTti^OKyP;cI$5mC^PXua{1dO`l?yd74TMf0%3Fciji& zPdf+7V-+C!xf>Ybru7kRrmp22>-XzI=VnH551qsMF>FFE`BHu9e| zQryLGK5YdwmZ2(WsF1c2AIvVIkxajTJ5!iNL-4EaUr1zbF`3-SU)J;~L@<7-;oJBr zomu0onko*|Fjt3v1O80}Zo+>v{#)?xU~VgOUCi||w~e{&%=X}amWr<)*{u7qAg!q80%@IpN5f@T4X(ON8^PX73cZ5>k=REJE7fqqrwuhX zK=qq5s8YMJms_$Z_OmvF&esJ}ipE31><{7aG7f|jxSXnJLwKl)r)dQTQaF%ERT@<* zIh<}5iiKq}m&2UKTWiVLKtw4AR-0$N(+Xq1vdPVULYSZ7y3$+L*adKd_1}XBm_8`rkyChOip?sC5;!!{TY4 zKq3Q7_%e|{6o0$!CpZHCNP?pXw(EX^Q%TMzIf-Ns$uR^M@DIr(7xF?iFVylv1)ufu zLOm}u^Fk{xbn`+xFLd%k4=*(GLJKeS^Fkjl2!~k;!Z_VrFpoPCK94(W)2%%IX**FB z;-^G;O>W8Ei?}73mRk~4OnM=W4!1DC+UY2hocst8?kUB*92<2nkv6DNdNu4Bh7sphB>J19zEjMq4(I3HEk?fD6KY_R6 z=uhRxN&GmU`55{={J4PmWPV)68^zpO$f;^h)pDwWH%hqG%c*)!HFK(!Q{9|u=Tsx7 zIyu$DsTNN4bE=P11N_Y}pBm&-<9up@PfhWuQ9iYvJBo-{W9MH!N9Y@{fyHsiv~x!J zluDZCczS3I^lgQj8M9Kvn?+cz*^R4kEiRDa;r(`k79ei?;)TV&v9+HfwvB{cIke?6 zuT*{$VQcxmeU86VN`+QrZlu4QTPhi}xv#2@0}ULox$nSc4s79og|e%*Qq@IOFI6@q zR_)+`FZ~^`>91;%su>eWZud9%@bBewv&DyBEavwL8LKekDor%50N||WcZ$sD>S7if zgLx{%E|tD!`z8X$S~DQ4*SlYemN2$da!-|UcJ?XXMjY`GaahbELXZs~* z*V!>_c)Ki3^hP#xng#~*S0OyKjI40#VtHse z4@L7(JP)lPE0KqmF#R@&>6dFs3qIiM8f)hZ9@@r3+j;0}l)v3{?=ch+GcUFP+P4?Yiv^&)XaO|Mi(m51i*NVMi@&mD zUVM8yw|8=T54YQS@$G%wu6glZ!#Wd0sUAm%~Yo z&m)$O6%$E}rDMfdI@SR@LpdNiRuTsas7mHQ8HbArE#yEo2WmNBXDFdwGf6zq%z;)8 zbaSAc1Dzb`;Xoq?`Z>_YfdLM;aA26WLE6S?o1krqwo%%$NVf&NC?#4~tr}iw*Swn& zOvM{H?PZjbwRmhbC2L~UpI(PXB3s%ztKe=zrIgF(6{#N9)rG6qO0Kr!a!M)HQ6on3 zEOoQ$d3A_7v8Haf(PLKEpfX-Pf=VoPh{7m>`S^7*AF>V9quMD_J60_An=bB0IS*74 zZ#xce-4*Y>xBj}B!H;UZ}^v1C} zpNCV~l*A?vn_}2q!181^l@VP`Q6Z_-q}GyJK~f1tmIaYoPiix%t)zC7+D>XGsg0!e zklI3OKdF7B4j8V~!-G6L&chQtJjKJKJZu5vbajr|d?JUh+vlQNx2u#@tNGvMtk}pa zmYbT9$=}QPTK7{exxVI^JwZv8MNC{nD;_8WOCa#sZZsOXB>m;s+xJKeyi0db= zkGKJXmyYm)`8`VpUS&hXgUfj^ng@L$;=vSFSu*g0>C`Ncfi1#+x6KH1rOf&G!1q?N zp^B$!c(9ID4Xm>9Vb!Aekg%17`0${O4_QMrjnFhk!A{zziJc@?l;DpFH2x5Xae5Jf znVeGS(2*9pE^&uy7&U!%Qk+mkuxt>tuyPrn6mGnnl5qYmmXc^n;?dg5PbN~5!Y9)x zSxH(tzq^WC^tiM6_Z)tiYxZ7gO5(DK^~d%${^wFenYiDM7>aF~B;0s!4QX}U(!ecE z{O%@h*~~3lxTV7kQ>3x2?4q)l%59Wvr*a3Mwi~X0KE@|^^7CnKp5$ix)}-v=f!*BZ z;+#EZ6K*EL_{#_;B58=?jRbCu;|&!{sRpupCx$mXyi>rZlX<6%{l%OscsTxjG%Cl`9S(87g&F7$C>fXZPWALQ|I9-rXxDIOo?@x4T? z=kJTSHIsi4|H{EzGFX+%4|f~g%F$(fFPO@3z8K5Ya;Bo0iszLTJe3g1iPc1zy= z-YVX(ck;Dd?#khiz`dJzV=cw@Hl8o#Usm&sowg5Z>Qu!SYM83ydkuWAi7#&Adz*Q9 z3lFPP=-}0@yxPU9y}Y`OsqMVFgD(ydKf=l};&zfc&BK#CJj2*7zO|cQ2&W3Pwaiy=zJz%% z^YzR(GvCU5H}mbxH!|PJd=K+2%=a_j$NT^nhq*Y&#c?i9aB+%@qg-6i|0?3AnfxM) z3&P(r$yh~@YCJX9B9U5hMMp4y6wXu2$&DsAmfUzc1dXQ9kw|VDxemD^n{7FKe+@Zn zc_fdq4LqXNX0|SBs${=?k#pFA=PmyT`ZZl_}hPw6cl z;~~AsV#13CFEYG(?-sTeO-mesnbOHu%()JQK{zHYE0ogy?C~vQq8jiN9N-hGcq5~w3)Cg zqj`M6_R0g4>lg2Qh`{oTBKF&wuT?xyLuMU~4Kz0Kz$O|u zbI%s;>7a2dja@YM(zuPx?KJM-fg#ezs2(xWjOs}qn6`@md}C;J(?d6eEVQ1KA~IBy z=#{S|V;3tmgV3l>rJb-){bnxx8uSO#SZP$uQWlFoq1<}N!c(fIB;r=5BO|_mctg;= zra8&$??K^M;BQDC?xS$%fO$t2Ny!BM3kkV_{_PHnKzB)fUxvYZ#cJMXZ`8d4w^y-K z&7FWd>w|G^>}~<36Hd}#Y$Dz_QfF}(-4g@yhY=Zpvx71+fyg+!OiF}dp+lC|F6Ns{ zV-e95s|lzjpaQR#fO-O&31}stn}Bu#Itl0@pwVcZ0{RK)BVYjU@DfO0A6Xw(%Ug4K zVU=yl)TU*bD%b31QMoIaTAEOGg1+yyzDM|Ei;Iwa1MFym`J(;dfJ`dYM=Qo^+?j`0 zVYZSX6>|FPmU5Z3k$d#7WpOT#lD%fhnu4B+c}F(z(E zLK0xN@@W+A5tpDEcP(x^3io(%*W+%+-HN*#cRTJ*+&#D(arfiy!>u8Bi?NUP8^muM zzX|-N@EbMi5)&fSQ|FOvsZAMqM(QX~OYNJ)>>`k-YvZJjuAY=ygB+`27YRoJ;U*JO z-c)8+S{I+eXOb3~L!^3#n@k@ut68BooxR6^)i*kc^lf-?zxRfh-`p}6gmpf)@sw;sal)4}EL} zs}fn-hb}->2G3bbrc?kHb5J+xpj9ta5_hF;bk!DC39Y(PD_Un;(X5>`O%pvyw1)dG zp0w)Jz#`^sKltqsW5%dlAo)+&a{Qz5kHtTppcRCr5R{028vZMpOD8DLU^S*eE+?Ui zup0bT!_*PfKv0v}s1mf9uq}jjnDq)lT?F+Kv1HaDj*`6q%!=A&5$Cwn&euN zD@ZIM*-LUg$;~9UlH5&lJIS3S_mJF3azDv^BoC0-Lh>+&201j&p$QI6acGo7S*)|5 zM}P}|-I-tm76~TuT5v;HsHygqC`AC?KvgO0HnKt=U$TNd%=zZyf}31dnvc&e6@^I= zR)JCxW*%;MovK2y%hk7#Cb^W`&(lXhky z-++^LW^vNC9`lyFb<$&e12nU^xM*f^v6hRznZ<%)OEZhBnFhQu%-KQCj&pW`vs0WM z<*YNauu!=k(Bt8FWN@^w(O?ChL=*8MMEDW3XcL)0MUTc$4S1T2Et2ejJX`Q|SW^W> zhQ&tu3XGv7`4ggPpqr#Hk|IcoBq@rd1d`&+v6P4KXOj4ghtI^AlUb9@XDk&wq>zKv z9IWMF1+^uFcsW?l!DbG&aFc>Oduy$zw>pl~tO5-KQD(gw>4vZWN!envqYWl9tb(cu0%k z6G@~MaDOssWsDZ{Tp?-Iq}7sE!O9Yz^O9CiS~F>_q;-?lPFg2vJ)|{~)=yd=X#=cm zA#Ip14Dy9>zA(WTruf1rUwB`V_Doa5?|JW9U8^>;@ra+GtZgSXoq7D*YIEk_$AsP9 zmV4Ayi5{74tm9X#HXFN?>@qXWmX`M=tN*hNJT55aqm|X`Ia-!xeJD@4dCGwY!^n-` zsYsrRA~%7j;>b>7XR?n;Noj`39VB<0+zE20$Q>njJvfZ74C^3NXG}Ulsi$4+ zSNc=%agcDK-#Of)?tV3SyUg#aD)_9jl8bNq^X*X1yEz}md<5qsIUmJ*0_WqH&*v{w zxsb#K4;NyXFW`JK7s@CpW}=XD)tsy4Tm}E9gbA;KMyk8=Z*46|{NjpJ;bVB-`UN7<;iRkQn0TWMQs{jGATT0+C_5ame*>F;t!ub{&Y z>pk_?SdDaLgY-bWwi8KL+ZD=VZXOHcNCb~XawLi)2|O0ZkyIx0$@VZA!;vH=3y4c* z(k?y^T6iK}VL73eFawi8@vewTK>cGR^nTXAW&vdi!&^lu8|x?Zz|QhvXj zy7#bIxE_y%J;dl-S;^ADOoN2DRCU+@D0Y_Y7nBDzZg@f(G{r;x6qr4GJ0u^7w=*DA82(pI{vIAbZSLujN-9--!Rsrg8Ig zq@x;r$~o%)f?y$JFEa&dU^pw5QyWcfEVc2}ui%~(?n$IJjoOuDr<;w3$8X~JTJG6k z7Egawye~1nY~j~i#bZlA)W$6|TKJ`9D=l5L^wP48+U>OL;ISc&j8HJfE1G9b(lt$& z%@O5#SfP}=DVOwE0^~66jG#P{^-(lf;H4pzmV6F*Xo;aAiIxJglWDP=q2h%^Rnt;S zO9ii#aJ!e5dRm%kX{Du`7u$KUlNWnwv~Kc4t2^hjE(=|LB-3)T~S=i+!iCkiOD@9h65WVnRa^Ne~|e^ixEdI3>o++9pmA=M%# ziF=U2kgm-ch+pS4eDNs!1JA*o@weWrOygf6$OTXp)XtejU&N-@pg zl+#@#_!B1bYB0Cx6bW?{j%UwOfVE3HY;{8|RyU-vUG;A2Tx|B|i;Jkm_3uqBc8Fm% zxhNbNJ;ic@!ik9`D4HOr@k}Hrg)kp(5aTd{7LhGOYY3_{`vt<9h}lHgl^V|=U*j1w zV)nX*?KFE`FC$ypuTyRLAiKjyEy4iQ}7@+rnH2$G394i{rf<-^S2( zj_+V@2>&sHM)2QB&?Ixy%-J!MDyv%G$avn(d>GF}FdxZ$6wf3uAICFxzWI|ReiFko z9)425x0Crv8OMq_zi7Vss}jy@xTz86wdR}0hIwX?XU2JEf@h|9W|U{_vIalvhHS^AMI8A;iP>dMds2GiUsHJCsM@DkB$sinh};xBMp)rbf!!Tg2g zy5DV;8nLB(%qle`|Lj#UJYz<{!=gQ0Nwu*;W7$lz3Pg!dq%V^k*ATMWqHR_qkfAQm z4x8Rf*Cr%iBH7=xt}W9%O5xHe)^=>nTEXaG_gmYs1~(01G(^x~`7kQR8sccMwqq*8 z8dQvVXei(($uwBou_p^TQO${3PFUNqC%v4g=R`9nS~=0piFQtOa-xwFJ)CIaL_a6` zI5EJ9VNMKkVw@8boS5RoC?~ETko=gTtZhaZ4^%kyJxO9mx$O+mbSQGs#;>?l8=>&@SW!=j|nQ z8xh+H-9gL{MI#iA(Y4d`L@|@Z*ktOppxM6l#1s*y=o<1{G2(MD)hi-D?}7O&BGWp6 zk0|Rpw|eeM2TrdfFwiAaAbA1VX})W*%b!3(O-%B+XCX5>55ijQE!Q|qnNivBh9^N) zI6kGol}CPyl>$~1=XQ38D2dy<=Xa$R%x|mp)$he`8-Cl(au(OnB~_Per`?z=DV(Lt zx-IhjC)r4VpuGvA%l@mFQEJLU$XLeR!5mvowZvSpR7X=CPxT7!PNX`;h#b9^Jm#1M z=`Tu*A5_ZSw%4e&l(qvkW&l^)K&|z6t=&xR7HT`F-b!^B)xA`2qk22lJD44^JpVCf z7pVTb_-D;HT!t(yR{s@d92#)so4mg;<7lumj=v}-cae42ff91BXdNcsFu8{1-KdeTxC6^f#ve8J+J?q%MrS7vm4{mXI$t{=&#Ro1h#+y!>y1M=}``A6Pz7 z;sc8ntdC|X!QWp(37$@)*r5cgC6slxj3xE%ujPMl;7fU&)#?E?i5po~j%dI#PEn-Y zyNCvS=K>Ab0#KDpXux}YG~nr-e1DqaNs4!IvlUzjZdHxF-&SSEECtBlYTRV_BaNHC zbsO-HGbLF@KC2cjAb2&Ij54HEf4Pu{9i!0-qDpw#Qh=gWZ~MGPquYs=%V;OjJw(f5 zw4dlcq6erSCS#C{aWW>zm?C48jJ-zu`=uhLGx=#2$3i%^j9cxIm|xDf!Z{Vox1#x0 zJjYgWYa-uD;npJ7wz<4e9-|Pduo3T&(<;6 zz+e*>H!--G!7WDMzpaB~TRGOnv0jdC~c zp+ZIY0)nkLAR6hR1CVIZ2%xN0-rWDZ$^2zxg$8RCi%gK69 zHgmF-lii$b=VT)%J2~0I$reubbFz<<1MDBBe~|uh`X}h0qJNbB_4He#m4;=U5m=;B zEu7QK*&WU9Sa!#=dj)4wIFrckG@ zIo8gxMxO8FSP#cqc)p)weH@8Hf|-VjX{xdi zRxV>&0XdxSFQ+(~;#i8~DO|yH3e$-c+c>;3olj&Kh_ZSuFWU%wi?jSisnedTo+|FB zA*GJ;2FjaI_$}W|`4-AMD6>PrvM$PcDceTzcFJ~e#}H#9{FAk>d~uqBNeX1|teVOp z28WplY~Tf-J%}p-KO1sAaxnJ%Cbs}M!B)s^FnMd(kw>?TP;NE|)lYWukcDpEt53Op zbD?EsM{Or=KtVV$@IM;f-hy@C0pSxOpo#cX4wsH`^z8^A4_%Kotyy?8(|%?Viu88@>{!cZZQ^!djW63b?w3_m)=*N%CmZ-=6FWBX$<2In3!l{MCh60Xg6EbY z_KvW3jJ;MNe#<1c$WkMa#sI37qg}?9=T}$R)v{lw+D51SN$j^$o&7e9OR96Rnv0fm zwZDXmOOLd(rA6yn7A0 zdKU<;D!nc@gYEU1!6p@Qq?#kO9I0Sk2}xd#)N`bnBdr|i=14n7IyutAkw%X6bEJn=fw7=%Wz&?PC+yUu@uBpu!4~kMyywG!AcU-8M8H; zcJqlM+hGZ!>dxluFlg3J$F@`%fseb6$Oa-U-%MNiBDWY#N0dW3^YP6Rw99V?M&L7M zSNZJp?eUqRWf$SPPQ9(F&;rQ}ARv@)y7{KCJ{50aOhoX_NWK}xL;~N8VsKUbm6X+cxtdi{RtZ|Ksb7tOj@*2S}Kg>{EcStR4~(O+k)SXaZkIzz+rHZau0 z&?bg9Gqi=F4%TgDT^H+mS+|XK+gay4+!6bHcly*@4)SL2|)7^94i*0h_VHI-cn=_6?0D^hpIVL%b^Mmm2i)jL-ibL z=1?n#x;fO&p+*jMa;S$xEgb6SP#=c|IJA@^YfEdbFxw#xxlW@$_qhnS6K!3#Y$7zk zoqZ3FCW{?K>OthO)-sVo%1w8?$!e%)>n?elyB51P*-~V->ynN9?Dne~H|Yg`#6_$R zdJ=}2p?5jM-c0=?)fv6RU3V#4SOeJtX?mfu7;&7)L2T_$$;u5=)41vv?Z0tidjdB(K+CEe%*yUYfAKH2OZpQ)RWvxj{!&W&_mpWgt0P$kVuwAu`+>>I96)WPbw)%qmt`vS{|_cmz?_03kDhs5mmMiS!DO zF_F%+Cen8&BNJ(-cnGN`q?V8hR+QlJ5>ih{Ga;>nbQ97}NGBmZgftS;Pe>mj1BA8^ zGECqgf#U>D5I9BPD1idfGt9;!B_=a@)M<1;HfLg$VKA0;P8p+oq2sDpD(po|@kF*1 zjwHQ?LV<8F1yxo4E<1#>am;Ns2>wFmHS>}{V?UpwaWOY&_vEifCO{T4o8^(FH|^D%Ytx*^SY^?AGBp9j?c4B?B*SR2cu;S4P2 z(P$ox=g}41l*pqgtW6_+C0|UZM>`9$IjaM+NQp1Tj;xA4Yim)}By+2Id?N$pe5sN@ zwf6Fl*0HvMwM`6cV(n&b+QLm8Jl=*34Ib~}@m?O^#-rPLdb9s>uK0G+#gbkis{6er~+xOR>~er-r-b1RPZw z?=8ZT_9~6Ql?0{}vzDO^Xc`h~jRC8x5bY|kj?e}|?TjpRGof3|XiNod;8p^=2<#TXl+9fnRu3Y2d7&wcvz-9qtPRq(p!c~XNK3)Yk|1peTC^1GLoNxDzwv&5 zj<^_FfNp$Y?Y9ToWc$>GLT;7aq$1Q^RRyjtOjyLiFZbdSaYbovh8$n6(a*2c&jb^6 zC3h_E3bVJ!n|P^Kk4!g3prPex=aCG2ls7H7Dk!+4>Iw!~vs=t&^R|vFdt~{I;To}i zp_6ud(F~2dSnf!}RC($o{0EtJhLE$2HZ7+Mr!AJ8<>W+@6Hm?x+7ii0xwPpOw*+$NGa(1w8$VmCt zNzf-X-?S0*t@E+*Z*X2%kC;3wGzHM(7G$KYRU7$B%Yx8!TL8Ff>DAI-6!K5&i7lc; zTKFu!yRauq0aN&ZzySfRc0Man*g)*0#CV-Kw{*mvmG)?+i$N4NglD|uEJ zy7lFr72;Yuo)w2>STV+NtrMN3ZJIVa;acraiH2Nu!qw@fGmIx9=!~Q@iYF52jN^$^ z^783SA}@v~JjStHJz!oL4aICNB)*#XTH-5+FJY^laK(FxZzjH#_-^9ciEkvnllUIu zTZr!`zK?h<)EnlBL7o`ri3y&V;)zk7aOl?RS?rJ{RJK3Py0JBc$@xd%yxLVuNosGi zt+%Qvz2*yN~Pve$ry3F?SAf=QwvxaOV_vjv7!X zPozGJ48Q4|glmGszXjuzOu`&-jgH(kmzfG>5?CQouItw6^DPdq5mBh3}~6vf-nB~eSrW1D((8Jq>luy z%w&Texr+hdClU}~M@oH9_Vk`ZT5GuXG4y#;f!)oIqE3=(8 ztzEM{>3Qc3&Ev4lBK*ywt4n2ezG+nqc2~iJ;*)nX+wR-))6Z<5(I^S2u3E(gtsK?c zZQBQxRTr*%$EedjoVONjrxxuPJ@z4XjGFer=Yt{gq_gT*pI1H@XUcf8*yL!<1^nz> z;GBfstN4F!GFv`f0hc5Oo=`H~WLjNDW+a)`k~Gs=k{-@C+rtlgI4oDv0s@mcT*f`c zBoq=_O=vBl6(p39;6;00LYoO~CA6E+c0xM|?IE<$0CA!Hg!U0Sz&*n>4$?SI;{=UU zG>+03irbA_eoam;i@+U;I|{irx#KRmHpzpcA@V)! zn|$6)ek}wHFCnXE8;D6gh&$69n>V!RQu-X8mOsTJx@7XSm{&^5tEkPR z*=@qIu(H_*ypd?EHk*Li;E-xedc7Xp5?dwNotVkEmt3<9hd=l=Yp17kyL5UNHhWq| zlR~KG>;kbL)Xu(LhC>)?^&ml3)U2l#ribOjz73nvT?tHI5l6OrWztUJrVq3dA?@)lHhq-*KuddDz6RBRr7-#e>uaAq?>*J!0 zKMQkb5o0cD>D33`)0D%3Y^qip%d&qE$p5a4 zB-xBRb$?VXhvF#pPFbbixhPIqrQWH0e(Ef-@|gQ`%4dY46+-(LnYTY*!v3Y^?T&N1 zEZi5FxBp<6pAPcVaeg|%PpA0lC_l|0(Awf@dMF6Rn@f*s9(|v2>6ae;GT7SMQ%adl zV-9!wNJK-b*2-BY?dnHyNka;o3oEveod zX-m)ehY(_x(HPDH%gKx;GnUMFGFQ-;LZb{<(~Re8OuE?}Zwe9%nmws`L8*BQ+~tPR z@nRK?HN@1B(?E{J26Hx(vxS@vGPjc1MP@IV)_FB^2aQ9tjqt!2jXQZ@lFVr`6>1#u zsgP1}y7b_jaiQi@PQe^Xm7A(Csv@Y0q$-N41gheUpuR1YswApBRK-wLKu$7McHPop zty`+5t(LY5vv=vRm$rJ^nrUmLt(&%X+B#`#q^-y7nr!Q*t&cYCom^^GpJ^`UvMKX# zGnH6;&(Re+_}-0Nui)f0O^9qIBlultiK^Cne1*-2y|#KoQE)ZC|3!X+WOXG{Qdsy) z>=9MVZhuoMSE&-P<&7toB4>P{)j1j{*hSJY*}R^^>vDl!m@KGm)PJjp&~|vOxy)m= zFNQpQ%^2cDk31eIWynU4M?Pfqus8O`P6^eo4OwJQ@hW_oG0kXPPHZ?`(Zt3Q8&B*C z@>0l4BsPuMm4v5LWaZL-v4ML^$&-Li43;YLY6!m^giP8(lAR33ZY8#h*j{3{5xbq( z9pqW{T-O+RRy}7-@-=fWB2QL7>hy!n@*}mtH|(u+UIh6Y+^B*?d_P}J;&;REgR@Q8 zfq(6Lr$&C(eS<7*E#4Bd+JGv4>RA?w0sB%rZl(V$M@K=vT2YZtSY?(jL$O}RiULtO3;;g5j5=D)_Rci{eNU_R`YwyEyG@fhOsbyyy zxYugmo{;dZ63H&6uPD2)5wdtI#a$HlQfx{4#XFd`s<-ctF}+CjW=7=BhAgQ^?ZDAM z;(}siRxH)FYEGfwyIAIIBXY*md(B^QJMHQRm5`KQzl3Bf*P|Z^u*aavN#Z{8zsfMv zU+99>Sv#Gq-dQ2KF00kL;bCyb^vk;2L9Q!#KnXt5AIV!oL1w89REBw{(sRxJvRMJt zxzt)_f}yDC=k<3*AaMly);#>8l_!_RTL2%pab<1b zZ$U(3U(yY#(jBU~OgS{}RB7rQZ(*t$SlCDv7|eHMUu>1s{xUI+$A1NZvM)~gHKQp| znmbFsyv^!0!ej+tIdaFXukW|5t+9U%{&fUaq6ijfcfbX1CU6UZ9r$lGHd&Ef`1j&( zosIo>5I97jU4a_7)2u)>G$&nN051lT9ArEpce&Z+&zEFW7{=KMc13bFin9sqisP*H zXq7i+S`24B#-mlxnLJuwEatUE;>z!q@S3ITpOwDyTH?yrhS@pD&T)25uycx?qwHMI z>qQi0@;5%3T!2O@!TgIOcDNp;gC>=Zld1(?%uOpLQ?9B4Nh|_$>S_qg`w=_He{BCA z>U`7ra}ql^st2F5=tZBi=tb)+s_pQV`TTs5H1%7_NSb=Kn2JSiipNT*(A|@pqC6EB z8!F05(eYGVWT<%dNI)NdV7875a^zJbEZIu2s^<61a1c{H3{jN~&;*{NB ze#6uOKAhhp?!6Gj1zgUlU_}?vX{j`Wi~tectuW;0VK;*1E=sn|m1=op7#JWEB#Ux* z9Acy%v7IUk^pnZJ18U8dI$UW{axf7YmRDAZVY#RTbs2TJTY< zx)!U-9P($~Z=c}jv`(T`uj06{aTR+`mbbOHCJtemoNBV^3?1?bDlkU43B}wdJNFXe zg01e`Wh^OfBpj_XtfQiyROPNS?r|_F}vMT#th%h{Bqq?Wg6lQlcn02DwO}}0z>e+f7JF5Nz z)DPx;e~;x9iN9X$9l44MOC|}?<1QsbOAkLJwZ__G#)`Kf|7UyDdy6?!h@@@5Z+Dbu zsA9JugW&XICmTbd?KD*jUAzY7R=#r4m(s{ae5s#Z;B=Krjg@7_hP%PWjv2>Za^E2FO;)S`)$P=siN&Fxcy>I zuNKUS)7xfo`@>_j?d0$zIn(4=T6>{r`T49Z;Qy4drt@+E0gbJk*AoiAaA)n!k1}6;)qWr zF`q;ai7~_{kyt=WvSBi;Dki^>d#ib@md7li=to{2tLL$19&6>XZtiX8-cIiA;oe3b z>*wA+?j11OtR5RCWssC{QYJ{5B4v~mwKg_QEujq1r&9MWfTI8IW;-(=dQI(glMuY*A6Yhu@WRR2C7dIIJI7W40F^&g1X(sWk-G zWJ-EE%@?$GT$Td*jB4WaD8(8QcgWtB0K4vODRIbeQGAd#)359!)n@K8rN~#Z`9ThU ztxcf2$dEOYqphjpLfYHHB-`5K~o(c*Po$#g?6W z=14%K3i8Dgm|LAI*lcU4$uc*}NmoV}o@Nz0c<$dY^R=mGbw^d}HMP zW(?v0zga+eGH;fVR?J@&GE>b=Ei)C&l<-&e%y^k;W~P;yZf4qL9KbZk6}Khlg8p z9IVx5G)48E471zIPiH%q7jI&#?Q@kK)Y0ofc>RsT{J+_rcXk;OA$&%LsKWM_Bk(*m zmf&cD;|X3tL?Xc{M5GbClFy}^aCDo{PK8;`Dc16W#iPDe%KfWNqY+w8nspI5S4En| z)gu~+Xd-nJ5u1tFLPQ74?e^s5T`ccq`8I;LvwR1sL)WR=OxES2Gt|xp?)pO&6}T?RTcgeCkWoS%us@ zHd{W1*;c7&EZLWhX?OW^mu1o_9g9|B_#1hI=_l1!D%!h@xyM(pPPe;E9bAB)jm)BS zY8|IvHGZ}DRUp;8-%{h6M*KSQ>p@ITzkdAs@Eb73HGYGauhp|4yr0aYBy!2*fH>-z z)M`|{%8+D~gIsn#BE(pD!kqQnDV0yY%V>_gA*^3!3a4Y?oLNp$G)1u##j}0|lZh0i zFlkvC>(iN3^Jr6WY!11({M{N7tSOMpMxHBWel_=Oq_v!H*+X)%irZ=^s$;T&$tG^w z#N=isw=mg3=~ha+DD9wg|`1jc)o{iyo56>3x-DIA%)^LM`JX+18wLEIA;RbIp zqo_x{Jlf3TtvuSzqwPG}$fKP++QXwQJl@ZveLOnAkFSKk{h3`4eNo~R-$4KK7CCn~ z080AWb75555^37|A0`1;AhW^`ooecG!J|qPPl9zf%I873D|n2xf@hJnLS!*syL)lA z){wLlt-F!%!`Wt|Tc5pr_u_2-rQM6OEyh~GJBWAOCtV*kH1&0=0Bv*)kx!0P2~LHq zx^b~=!R|*^ljtchHIk#0pH*q(%x;942zhWA!U7hqUz?_rBQ~G~A$5zQdHzE+Ywl}W$+$bM9$Q5b7zghF-y)oW_4a#Yc6KyG4WUJ zYO0H6DBS&Y(P}C&SAY5*tEqf@sl?Jew=~>k8Wz^mY8-sj+{0=gb~EQrtb(_CWUBhZ_wzaN0uT?kJZ9W8Noriec*I4JV zioeVuM{UJTykbc;f%3Ys1BH9aiLo;CAZ_=kB=dtV`1m8ctNm`Dpy}SLZ>U);XmU2x zJX}mkA+Py1)V#W6L(OaLyw=HUJ-lW&)V$WmYpQ4LhMM~axqqDdC%Au#`$xIo5k#oD z(9_SxEsCA!*{cnuzuir{Mne9iSUG3A6-DMH5F1CHH7u1VG9!jO6{Q8Nu;r*kk&hLU zQB6iI8CDc|ua}H^GMdR~C8L{+b}~B2=pmz#jD9lu$Qa=17BYtE8l-ESt_ixP=o+O< z<4Cm+VsVJeA%hElgJb(eFe|@~g)?b8I7tlD!ATaO4o)@~P6y|)7>KvlxOqro;PPH( za}ls;tF?Cl25B){tv!Qy#_>$xnZh$_*^;7WWtf`Ez1p&oLkQGTm~awwinIF63dScm|f^otKuq<*Ik_T=LZ2C4CTviz8r>v z=a(Zn7KMW6m*Y_IJa1|L=M_9XoG;*PGUv+}DCWC`%vUpC%X|grOSs?5d_D8c%(pV% z&3rrajm&p4-@|+h^Zm^CF>hUA-)*O_sfwUES>xvL|ExBSe21>+cw>);+Xv*j((QJS zwH&ZrQjqxV7j(k{|;NttN*NYX0)LDtG5GO279 zKVcVnd*}+ayLA2Oa4}{b9ko$+ovnGaQCE(R8dqi8R#(@l*pg*q%M-=q6p~j>UM+bQ zWS5ZRC9j^mX7XCe>n5+Ayhidm$?GAng}i?9`p6sLiD8BZ86IbNg5fEKM;XrKuSBo1 zc%T@70#bBUDv~1|5tiN0c*0Hq9V|sYR}x_vpDSC5IVM*s*Jo`ZBu0~~8dt4x4HBct zB@*dk25Bd*9$byM`f>H)8ZZu5uBCBCjvQJqq7@-}f_ksBsm~$Xn!S630m>pt3M2ap z=*8cr^RKIQnV!yXy|G%-E3eJYYqI%74qvyJ;eXx8E5iN6G1CvLJyDUbu4INpwXVw4 z>idEXy?jnVBY?<2^RJEj^Yc)m-9(2GA3<~^(H7i`7PyzsovGZO#O)q#7rs}(kCM5) zjImdb)6z%a%sWEN09~Q=_Qh7@D{#dd{g*2dKkG(5n{J-b_j7pLr+HVSt(spG z8I7X;po)MR{OWKu;A$dZ6Ryp;wwP$C$0vros|#1JQHJ_yk>w5oh6orl=KSuRxF>N< z8!>qFF3OzVEx_2>T?`~ug<=p9p;z_6zJ8Tc#0OS63B$DW^w~^KX7P>{DSLwnS&m0( zB^pmGo_IVf@TUCQ?ZlIAD9snLNwx*Qio=+X;kk)7)|wP>egiInMXNa?yr_~Kn{GTB z>NS{&-t4CLn&>Il%r4}bX*^0dN-;X~K39i}x@n7C9V!!eJdVm#?#Snt9`1;tGKo71 zC{E^%GVZgk4r{BKu4TG{TTA$3FVpo*H#6PJbT@0;S=-6l9@aK8-Ot)S)(-Gy3)92g zHOO7#+%>^nQ`|MmT~_0u#Q}OQ-i&*XiP@KVMe`uHTt4nNf&} zPKY9sJY)iv4CqanA^Riwr}-AoNr&jQs&nZe45VyJ(NY(%y~DuMRk)oHY9-_N=ETo~aId@hpDMG>CB=i&&@=PRk4NaBQt6ETDr@KiD< z%IGNO4+?3jrm2>u3Vv9^A9!i1r>U8yR+_qLYNx4_rXHFaX=Yx34# zZU@(C9q<}ao$T#1PIr;EPIeFC9>+a_dkXicNim9t2746VXlv0@`G<%nDfFz=&MX|< zOaj}zoX(Ht)iPJXTnTet=IWViX0DaFZsyvVYhYbdD!MFunzK|)p-_h>d}uhu9#D)}pABKbGU#W9Qw3redok%ePa6dBgSF+;A@ znqqj2E47LlnQk4ouGGhi30%0y5(0GwmR_W;P}h0+MXE7LA0&O8^a;|ZNFOEL&j{T7 zZ1|P9Oen558gDG#c)Tl&)6{Gt-ZbBSmJHSj?o+U}k#^R83U}2NY^J*!)BTI2$DdR`Or1CN8SZU=*26G;Shu zGnre+yox5S@m-oY5q&K=%7hfh(m9N;`OKWZX3d|x(Mne$U+T4I|%c+ApUy)?2G{up0-TaOzZ9ZjDu5!@oBq5 zxjc%&1il@|pmp5ck;IM|20iR3;F)B0l<{~m$1FniS}m_t@Rue0yO-DMd99h(T6wJ- zgHSd4K&lpA>&F499v|k)2vsJ*mS6p*6+7G+&QF$89!+^HwoEy%k2SEA;A{Jm!QN z`K-x4f4MbT>I(8xNJ=C;jqsJ+olcZUHQCJC5yMk?T-dfNM&KL zdGs!&KiybuY{@kI6P0TFLpZ$5a2^7eQx#2BELHI|t>8ck2NJ1DqiQ9G(>bt~oDD{Z zswG(mH?mWnft9>f#lafBT1QO-HBB7cM9pSuwoubS%~ooRMDK5J!p zDYArTzW@JwFVFit&%1~Ey)^9S!~iEoI59-r0piAKI7owoKj_55iC$s&sA_4WZHjrP zb;2#iduLW--{$Mgd}kLAK{gPtMeT)rqlo`jV(PsXr3?{h)s#85Dtht65>eC@y+LW( zWm#k{o^$hDG{5lhi&*|Ko?j&Li)8*WlV7CskJeb@i&=cp%NJ9Pugk}?`C=_+s(7)2 zSN*&i;8nXf?L{B2Hu7pSueS1P7q7PSY6q_dd9|BYTX?mPS9^JNA7=)6qMs*5d18zw zCU|0)CxqLCn}T_Tn^V!aEp;T)E*FbTCNdLuI+3|#uO~Z;Y%kfVM3(d8Y_cnODzp`M ziIup{K3pxvowpJM1F2h@8|aPzMsp#W|=1aUqh$&ueEHf zVtC%^eW;q@B~MRBrvsdKdK(AX+|TAwHjlA+g3ZHh4i)+CBBC7rZKPSR5H6Z)NMi2* z`*X-`c%E_ok)>Fkw6`H>J<0<6Z*(tT1nkSLWj?Sks7KB};o}CZ_^28m3kB@8)sF73 z!{U%pgQ1$(Bb9(LW;37C9aQ%bDy{20)WuR4PhBE)$<$?1mrk8bgmS6NGCTX~QmHHF zbJ^6@l2Bn*LFM{M2#`?6cdF6qiiAcInn`FSp^Joe5;{oeCLu^d3kiKB^pdcTgh3Me zNf;$zjD!gihDorZr;I{&D=E+IL{^YdWVQ)KXiu4k716ASHMd)7#TCzrL{=mdoym%H zqH~#E&kC`bksRE@AIQvnJ+Yd)I`^&=O_0O%KgR>JlvMqdn~V>3 zNyrCVn6O#@t^Dph3xP{I|HWz%aY90u*R2Y{4s9z{W80xjoNn&>U}7sUR>jHn)l4?O zJ36KhD9F6KBBq5aJW3=ZQoXd!yh8sdhnBmnAk@ad8NqR-hV0?Bh`mZp6*JMcoQ}Ga z2nVazE2nAu8slfObFEqRtKssbE#RkAz*~P>jrqI|6~_slHq5q*aa~{{gZ{22V%~7` z4ot2mP|kq09MQ$``CkWf>Tkj8TQK+Zwc`_#<3KusaYB%e?#>(i=&Z?xXw@q7e6?@n zi>k)cM0GylWU@Wv5Ew*+lgVBt?WALJaM3Q0Ii9obo$jL@pOvVoQMn>|jJ~O^gMd)| zt5RMPi$>L;USnGm8itidfl_vt7(c@j4d_D!kFc80SRmpnmWcIiF^&2miU7_Pc#DcB ze8D@2C_%;%I%wR>$b+{(5n!Rqvvjfi_ zjDOm=_1|-#RK0;aP3IfqOaRqJ>2cV=Vj!asUZe@TaG}IHV;N+0>-HqoYPnVzQLV_> zksc!5{MyACi;YJn5|@mOJx9}xzu#X78(aAy_AD`@vqAE3UDzo;h8 zM|~sp&D6J2-$i>n?H#mt(;lS0kM>^LWfs&z{U9a%l#Eg`M#%&v!;~n&S;#9h%&-u( zT3TE_RcO~2Ro%p2mh${YeqO`JHgkCsuhpBiEM^e%w$)YhYL%tS`~LtV>ka&}k|UO= z`H36;ZtKb@q|CoKPFRREiae=M%ft^{{)g0Uo&Te3uzII=P;i0sk%~xlexd)0*h(5p zDJCm(scLen<%R0eB}(N2{yj9t{nERnR_oF(Ew?fATw1Mmr+L*g)$pp@wI5Y!ROv(A zhj=(jvR*rG(C^f*=c#hD(``)^J=SUSDMt=m$d?M3v0rwlZT(at3N_OF-N*=c*QHCY+J7DPzeAQP}Qdnqw=loGjOA8!FAdS2P@>0mN$}Im%@^bLo z9)Bj!tYIzONJ|Yr5iC|uVFP(v@oyos3I8?%+wt$f--dq|`Mb&QB)^CJJ>=~re?Nf% z0z(8x2pk}I5dS!Sbt~4BVam-tht0<19hLmVmfUi9o3w$b;=0p{0)CXw>b3lfUOc5U zQQ7U7_|-9g%YM1RK3#8qEOwOdQdu%Lrw)A=!{v)%CW^91 zekYEj2@Iq#kj6l0#y7K)fz=GGqAbsZBN@DWTO{flV?4f1wd)pom%1i1Z8p9w9PM!;KKD2?2bsCU1Un=ywVW0O}`0#tmkCIj;hQEs9&*S*rG=7@EPgD45 z20u;WuX6aSm5i)rbQM*3oXe+Nabqpd$%*AAe$RscTWhG=Oy4H{XbYF?iE1FQm6J`J z+(y!NPVV4j8z*i!VtGEEA0+YvyZGq`TKtsDzgY_6zuDbS|7Pt|{;d`{5C3c-e_LDWFE?_z znaizQ?&5MgmxEmH;Bq&YMcbaEa4!X2Zmp!s1}?$=s#LEQ!7TgvLI!B zl=V`!kJuK<7GsspoqF?|sP16#Wqem^syj@xU|5khR=*lWmc%u2oSmnvsg$xtvKonN zR#Ul(EGcXB8f$p*0VBi^k^a&~9$%v#rmfuG#O>R-xSiW~aC;lK z@8b5|+}_FUJ>0&By1m@KpNj)r9O2>+=MHdgoZAm_`ytYWZ!3=|<2dSaH=lIzKdp?^ z*|IJFd2QKF%ry$@7w5@HT~@5*wGSxV@t@bz(Wuu)cq8G>gtrntUn3ASWYIU1oNwUa zN-l~krKhmy^?Ro^t#kPLno0*kDfJ6yY1dm?eJ)wkyT0h$QC)cq^;AWvrqV}Z@y7EX zzv5gd{TC`ZSY*s$RB!x=_@WlYQoW(Mn?9S&{DlR%?5z}wNu+v@g|jr6Qwx0KGpwj_ zLM(;4-@#pa#A4rB7(wNeNFbAI4VpA#b@A$At~Lc$?;s>?GKBWK^zJQ=W;O$gmEjfW z8lv8rd@Zu#l7Y@LcyI85DCYiP!w&L+dsjGw6>%}-i@v^uJ) zX}JZd^3xhgYbLFgv@X)xNehzJL0UIyEu{64)=Szxwhr=0KaY&^$QX}I@W?Qa-0;^m z->hxTi?&M~v;sI5e>{1Kus{IMvjuW4bENSS9dQ|Fn~-tAnr*Qmy&&X>Hw#GM+X@s}g7SXt+{vr5O^n zgAxdc6Ex>qMOdC;*6Ak*Yjs8{uC0VO8PrZNUASPnMRPRQ+#GGhpnuw+;T^|w(1ar+ zkXh1OLv6dzV7aO)@=NfjuPIXB7ET?u(7lEuZu4(H9BD#?I(l)6d?kijnJGxnL0L;l zT5HU;%pXv5VSgbzIQ_zmgB5TT9~SzheEAT`&HzRKxgzeg|CKPufwP#06j5amJy)%* zHQFMdB^idx-79pM$x&p+7z5;)IA-3k`8~%je_u`6Dl+pJxQPh6>S(|^KS$Iv&_L!^ z%9<$KW|qH~?VzlUvZa>44-6Qk?Tl60&WziIiFVJ?fc-p%^k`i~p4GJIMp@D7s2zMp zw2)%+lznb<;66Q$6@)9cM7&PIIq5RX!55QoA}k3f!jf1Sk=kugRl7#U_nA4#6Q z)^|lob3hhns^Zj;S{PQzNY`OfRQZ&pdGd*QMq=;W2%pWo;q}+hUhP_*@Ja=zUcB&S zm~RM|mjA|kZN6b&Y+oc_kx+CEJth3HojznM;B4Xdti{k;H)+w=Tx|Uxp_&&|7+SHd zASV1=5ANh!d~k*D@WJVY50T9OSeAX(z9u}8aBE)^o=&*vSTe3DXR-?MufqI<$uU6W zD^aknD}j;z#d#2gyr{3H-cS@u=dxRXRM)CQot>?GN_F=S^W8$THU5&qT>+iS3v0Mo z!iPlA`XHTpV}*iR7NYKEfn_0zw{V+8KmA^uzy7%r?ptz^6ijV96p1-j!J?UVxl;%Sw;fK<48~8 zcpAquIG#jI4lye^zMA8!IG#tk#-Nt8Ao-630*-oRpq`ipj&CKViI{DqZzpC4F>S=` z;<((ac5}Rw<2@YT!|}Zw-%rc{=|iNC5OaX^gB%~{xE;xPmid(ns8nQLYn+W8WA-n< z!$Y`(R=aCE+*u|o-h~jD_u?sQhqAoaB5$1Wnv3hZu32u$m1QDMr98Z->%a7FfKEm7 z)DlBO?S>^8{>sCzVtF~9UnMe|%*&blDxH^eIkMhpgpZ{1au!D{On0P~BMTRVZP9|T z#T`%wv)#-FneAh?msu;cR|oW9KM#)b;1~~1@Zc~HIuJyu5sbV(K^E_;kluWf<|^>0 ztMWrxvxX-SmO@w>VH#v7nE|)@)37=Dp`B+J7u&Of&1+y@c3MBl5%{ zGZRmAF0XCm#p6;s{-F}F3%6KFDr*%36+kpi7Mn|3z8*)?XaD?#@6tVow^#autu&6@2|_z3omtl!$%g1h38FOk8U8Y zl7}>M73asc@Lq9#6n5q)E(Pq?L{;7t;`?b;kbq^U__6=@73bFlW-6*MrOD=`+YpUn z9V}Ylvmml}m?Z^+tKS!$Mxb22p(IV}j@)J7wPtaC=Ke!-ry6NmgPnH}<)n3WSl2CP zR8%-0QjOSF%L@_<$f5l#!V{L@+)oKQuXfG075ruZ}t(M0njh<%TDND=re0j!WBuw*emD6+K#TMaeBu&h5 zO4+chSgW9wUkF#xnI>DvPOd{waiyEgFoft6guJo$!6e)oQYz$x$Z9n4Dm8*tBm~i4cmemIsor>eTtW zIz~;zbRG0F=YEk-^jbs6j25?0@Pf`k&uj522fd1={8V1?wlh+Lkm@1T((hC4*5K4c zQtj5@RJ%1;2PKB{lvW1YgQ^c5RCEPXex?FU)v=Ifs?C7X7>PK?d)>3WRtm7&H0IkGUGqqFl97g-A7*2e z4Dl3Q(<1qX$gY+G{o8gQlUMJ9vapMfxw#y2{%i_4e>Pd?&!+Y4%{9)SO{p|_X_7HW zHchphtK#7b&iOeP;9MPht9jVRxkk=4bFP(hU7Ty@TnFcZoa^RX3+MVc*UPzmoEzj^ zKj%g{H^#XM&JA-;h1^T@ZR&wFI@>2Rv;nxs zo^rQa&&#R2AhWyB4&r~XwcG_ivjJx7_y=3d&AEDBxVEe3KMZoHpF^V@8spFehlV+{ zfse@5^8>hDcKoNj;G#_xW;8c@xH*=?@!Xuq-N_uzN@(X>G!d^k=4ztZe?{BtJ_)K!Rl^S2U*?6>Rwjwqrb)2$-Ys& zCGc%dYvz<&TF_uytuHCR$c$0N*bQv8EEFb{s933Cf|2vBLPUW@x8Sg$u&N2VN{ZH- z=5V2DEELL;Z3s%(N=_3w+sN5Y&JJ>9HaqWyOt4O~;-cI<#LXk@ zJHWn!POvoTaHj0l%=D?9_uRQOf;H z*q*Fe>Q(s%M(>>uHcNHGXc)j z@r`OW`#96cnP$$ka;A$j?VRc0OgCqOoN3`qA7^?wvyX2Ma=xGQqnsb(`~>HRIWMeF zh~IMHKD$R?G2%D=&JjPsI}Yeqc(rHoI5)@LRA`78B{N{hSt0Nai=wN=p{B;A1pTIZk3I_&)0MK+Kc&a-p$RO z+}y*>b}`@0`#EeE^Zm=ng2j9_;+d$!a&c3r2)xM}qPlOO+4y0G9L|ZH9z`{uQ@hxl zB?9x?SWfi6Az-NK*jytl8*RPhR^{}ErDlR`W)`K4e-LlDdAL_yfMOTzu3FFWh2+d4 z>;IEdMczC|rft>a-GapX+umTxBs(U@mua3UQ_3Jw{X~rtHAd6~QNyM^S5?2*v`WyW zoYNe~Dp#Iq+``rqCXSz_68S1f^jp_K32H3C?`^sc>R1k0HJP>~C}Am1){v+DIF(ny zIw7T^2TabjNV38%Gz0zj#U@{krG!K3nF_DaMR1<1eticK9*#wG%&`}UB`Tg{i5yEN zDwAXBMCEd7J;%J9N+l|bQ{|}LI8{rseX>D6!2rQJf_kz(f{g^53APgKBG^u_gJ3to zAi+L@y#)7}?Et~Wk5%T?^ATXxoI-$w1K-ff#MIReNTT*ZFzimUEZnN@W-`>E`2?F> zqd|MGAx%Tecdn|susLks=595)$_}Ml_`Ge?1ZI?Zj)_nH+k5kisIT{#Gm%kq9!YgmU7l)(^AXtR*_M`Ga)bHXBT-9Khw@L z9X!*`GuDgvnO>gRM~?L(e&c!t7pLT7;Kn>S2TENAj;bnD0Fk-f&K%@zgQ&KX5(!70 zovK!&u@xgoO^{wN1>Qp(l{J~lLQ9eTkY-!5vCTIareGqusp#5@f9O{wdMQ5sx|h# z4=A-yg($T$!ZmH3zP?2RzBPyLz8?l^4yvrGRV|+FiNxzuE#Y@FRK$rQtEDX>FSLJ3 z<%cjvp$#k6P-xkMidvtSh+7I`N#vZ&Rm1`P+J-xUu2D+0vfCAlMqHYOEE->uv8wZ} z#Jd{rDiZU|M8LDwFuCDdM%ZA|VmtOMU}e4Y4u@a@4HlCgx1;2JVA z7S}kF2TjxZJE5jex3Ww-5JMVXsre3AOhDi3s+`%;7eg1z3Hb!OiBd<%0Lk zVysBcC<>`TwrZEc8nf&yT5!`AjvV5DMw`WLlfqOzWW|ydPgWvX$z)}cl}=VJ_lQcA z#XVl`NhPbChHUN$aZOM7IT7H5wRMW}aiWnE&3v|%6J4BW=R^l5f}H5)gxzC)qL&l< z_{ktI_VeN>FOKoz1TPNrVyM5?d!>?9(E5WigZ+RpfOQPg6={Wx`RoV&gdoH__+7Pi z7A|naHB0lB{{ytchb@gW@g&8$Qd6D#XjydBInPu4MMWgWixj55ndQd1DtNLVvrt%P+E)*f0wb6rzqU7W-7 zNVZO^TWmT7#fR6~u=f9Y?d-`hR-Jw?I9JO=0NxTWNU!VeWlazqYEZzT1_{%iqg&WG zDVH{B{lr5MZvVa*9}9%HnB-NjgGfHL%m989WgE$EC+s#;O{WvK9%AD6?d@r`@uBSIkva<_p(VWvbx0 ziJXn3)R<|k?3>!_`P>#h)?j@VnqD`!o>@|rxt~8$MjPPh8&sKxc<3%Ztg0-ULJx&* z_DDSxOJO{Pi4-PNm`Pzeg?1Ws#!jOOEq~)tJB|8HyMJ6Z*LeZ*tldPNkGw|mn#pS= zuZz5P@`B`bkk?IK3weFy^^&)b9}hC!&-5tMV@yvlJln6Q1%#cmisD#| zSxKoOb!7r^Da54_mqB(CrAvDBg{;(1S!+Jk^XufxC){`|SxsbZqjEc0J1A|V^cvQD zoz|M~({Hfmv+;0J2AeABl~Zh=rBzKeLZ|Hl)1a6_Z)&odnrAj9yCp*3NTV9A8oscJ zmM!$vbFzWLtpuA0ZsXK;f;$Md5!{7bzBO13bQ0(xu!q9E1om@sfKx*xjd1b+N#g_# z60kY$H{IM~>k5A*ry{vW1&Q;bt~K0R&GIg9#8+bmyLwT(#Q54mgp0@AX4I%HqAA)U zT48()V#QszA_$dmJu1n>HL~_E#xeB{W;9AGWGbIK*HUA71uAJ)s-v-yN9d?xvg^7d zEz9y%rKiqfMSX}@Af&=dHr|X{u;e7m5*xxC?cp_4hrW5~$*2w`J#+Mib@<+a*iiI< z6{RLPtZ-1B3?~CUssIP)6^ZYwD67(m_4LnAEZNrTC11Qls3$gW)mV!Eu;!lO>w>b!*0pX zw~%CCt!FLwwKHTO=9W2OED_e3P!@3hkjg1f2FqUZtjZ~`oO`p$vudyJR#5IIB|wUG zSKjL*rID0oQd&vrqP(5*4$8YJ50cVHc`xPrXlg;2fjkLJ*}nnzdh?MV zwUuKnTW(^)YVBjJPt>h8(;ca2djpSdrLBp!ZG3S%Z98adqfOY^X;7P;Cztt-JG|>?(@BzUvk*Jfo9pq6>`3a$LGK+wTFku79r|R z(%yuDDQH)TCe;W@L>H8f+xzaqyphaC@$DF{#4(%3kpzyUa3q66N&NFlj^uD>z;nxSabdW3KT)Be_hd5$4yM5Pr zyXMIr-)ReDMM-nB@7Zh5zGs)R2>4YcXRJlQ`jEHDJa;%?YqZ}LK*aXLhIi@hET(6t1M6aP?D1vG2tSk2F3hD6V1^)1Q;lon#WtpLd zB3RhF8^Ht|S=8uD+C3^P(Z$+p1MkJTXzN6x{V-ZOuwQ2N75t0!ILh*KI>6~V%Bsoo zak`Py&75xKbQh=FIo-kOZcYa|-N)%(PVb|vh0}v%_LDhE<`|h1WDZ|7h6*oai){@g ze)L+nrn1CLsXWEzC5Z@UGQtRdR6kF-&C|^EkQqx&Jei4PCR3A1X1XzaknKZE7BOC8 zQjOgHEAd^#w-et%e31BV;#-LCBfgjT zeYgj?r=NR9xo3=fCb(zVc)}+OYS7b^QpqN=zqSR{iyN7#p=>h^n~YnOTkfEDk|e-3 zv^C~uZoV*YYs@W~tWM{aT!z;3D=$N-+>*smIh(T?s^y=nxLm=QpP>Ll)m*M)%*Rk8 zL(L4eGSo$JJH;IocT*f>sE^`aiuZA`g`ve;kPfqM12dIIqxv&3_jJMqW)bawvZ<#~ zj9EcaatjpTP|Q7+P^3asg;E)p5a7>lNrurIGy43{6j7u&f>$V z414)-Iscq(x|_eN;#(E`eJF8=WAiN^PU1M<%HqUvz7HpH>>Z@8pSn@%#;BX1ZkW0d z8Oba{RWX@lNXY8W(l+uT?T)G8L!0=}X71IJ8P%L+ovQ4oa+Jz3DkrEMrt&cH8~9KqA6mmPv2lutRYbBMTVS;aAwSz}R^CU6jZ-^$}(3z*f9TEjoA<(DP= z`#K`*&Z9#%2k9YRDdvgI9NEN?n@uUD95ma&-COx}6TjZZFSqmS9elHmZ))e)F0Sn6 zN+(x(xUz@4_i|-FuMKc$h|42fIl$~eX2+SmgHIe{_D+6z7pYo}=dxhb3jRfzDEb;!}vvAUcWcmBi~f4CXw%2zsF~+-=nssez%+_tGK;_+x*-X;I?XRujA7` zZfoSWW^QZcwk~dK=e7=R>*lr~xAk#bFSoUDn+V}Thcqr+$No~fHq&O`lZ%JAU+3mL z+-p77{{UBqLUP38a*^pa-ct(rLU$*NsIy!|J>RRGNri#}#`DRvV=~boefm;bx_2it z4*yCgX=ew9X|DmCoj7Z<_DKy&u4Q@_`tCxzNFdAQ!s1(87g2F7$F? z9~TC>(9eZYE{t(uf(yf3(7aDggkx>3X2;QnSl+VwM7LUU_2U%=I1;s0GC*GuFNH=M z!n*bHh#ePhOCWt^N%`&(Dy3RWbp1P+QcG@$uPQ%ErG`Glt@^|IAucP8DKe%6#cm!@ zgRk>Z?PMhe-bmcn_13c>hRd>y%*=F)*?=&)2#oTzEqe{n9c13cxjXrqW1#0ita{?h zm|wr*Fk3Xm7MZXVCFLl=hQ&q=nxt9kyD`_+G1d#>2(8)u!nH@+kIx%z|E3*npReLq z75tqu+OFnTbv)~%rID6qT3Tu8;w_A}o!x>q`u${%x}c)knZ7wdjoVDw^49X(YdI=N z${O07m0U$HmBNm8X=&nYZ;;rSYR|nnX352hRYc|yr%{v=&01ctd`r0p|6eu6DtX-| zwr*j&@Spvp4Nx>h(Fj`)u=OBmeIEvD7^k3{-PEgme{!2xGCz$O{+fr~)xN zd2@)ha=(Z?Bfe8$(TMzbDM!@Z)Zn&mT46R*T(+4aBDA9S_0>7TG`t9m*6fbD81}f`_QGJ>ZAmCz{h3L$Xz^o`2nrPc4`oyr$U-vvQLmN2ObkQ|gIR zO`NiJd8c-8s*O_?)(Gw<*h#R5;2wf|3GU~VwaXL8c}gJXL3WNC>6W6sD2Q8a4%LkH zz9PznC)ija+-Y4L-UK`;#>Ux`L1L15w-Z+y&X{MFacmaZSVeD=#U9m)?yNVy#6m$& zhio>z+ezGkw+-(ugS%?OQDP5?d+_WvZ@zZ`--uaW<~tDDM|>wc-Mr$WE}HLn_)aXJ zjOROvd?%StX7ZhMKAFp%>&*g%J5%{&7I&6&XEt}%Qdh-yDtN`uD*;}y%R9c~mqwZw}J zqJnm_v6*rTfM}P=j4JA0b@QtDcx$Ykj;6gfp=&(tEw-#JO#to8)X3zWuGYn0yLmYl zUp(GKBSiIO+C^-+#_z)GCEWJ5a=i%4HqHt1zL>vJ(N)dc->B$>Vy7T+Q>x4x%~=m; zV`-1)Y$9iqY0uMtQk9)q?DVoTmG*KtzHLitmc(Q%jF8!*{Ys~N^%teix8pqW<iFGiQ|>l2($GvpD-B&VwA0W* zLpKdU8d_-RqoJ3Eeas9p(9ggq17i$KFfhzOr5W7(wUre-B0xr|%389h+KG-cQqTon zI%1OKTqTou^Gxp?pUUH!!1-jAk-g$><`Zos1wE9b|Nq(LzQa8NFoe<97!++t1li z&W>?*g0sV%wXbVlp;<*?D6HDOSYV2%f47?s+%a!dvb*P$>?@6nzFVo#CfWJ!{m)&? zZ(-MR9X{`Lbgu$itU_vf4N)Z|6&sA@sLcYOuuJ9Cx%}MC&!hQU4}TlW7vlNbME*9J zFJ$t!>3kuV%=MhjA~TgQc*!g$BilH2i>@qaDA!MJfZRI%P|#2#T49shOl~W=UF5ct z8zi@b+-`DP$n7Jym)w13F7QA<4~+7_7!OSFz%UOK@^O{TcKo+9k|*MrPM{=(k~B&( z*qOw14m(#;vYL`rnDO6DhM+EClw`k&)>-#RJ<|=8Y-MK?JGU{tot-6+(XG;cJ60-fO6-@dTITdtR zn}Xo$HU*v*<5UpdPxvU|V}wr-K5U?1kw0B}x7Dr8NuQiaxAP#haZe9I&8+juh1Atx z%+qYQt0MNlx((AzC~k|34Q@6#>GB3n03B6`j47NCtQKC8?J$2?#D8~U>~#aI61uef zo0xo)pt_uhYNMI1fXEwS+p1jD?mqztaSjnzEup$&kI~+$1r`oJ8ILa!Uow-K_|olO z!u15bcv20M&G?ks)r4VI+!`L57l&6HB>9^Dw0(s48aa7b3*m!{6y<9;Tf$i_c~=f9 zRg$M?=GSkG&HjZv*W(PCktL(C- zPrF~IUk>cOx-9tU5Me604-j?`-?*jE*>y$7*V9^VF!PU8(NMwDex45SbRADu({Kx3 zA5S;(bTd!4@^lwZxASz6r#pDMo2OfNx{s%Od3qlo8DvjCdq&wa#-0iG4710YlOHSO z?~C{^Qr#Bvr$uI}du5sGSIh1=TFTEI>Fc|wdsVCMXg8vH*<&i({&-%tP*qeRk|TYMOO3;B$;kgG&dWug`2s!~*(_$iY``J6d<7jMCtTxEdml}y?d?&qWi zdGg4aN3l)-qooBZHp)g-6Nm7SB~+Mv%sHPrc2zSocS^04y`_V4SO;!yl8o^hJ&{JS?;-bK zok>acs-G8C&N}ME29|WsTb4JzlYc!1e+!Q_XYO{J#rNUX@6nS__+)tEHLj1I zEGEm17nAZ!VwK@U`TVc%eGBs~TKd+3uiLJE3vGN$Y{55(rytKKo-sTVc!tfI-9VAq zmZ+gaSdl3P^gCN6Hx}o|=`xg>OF|waH?VGTj!QMO_}CayoEkl!p36JTn6~gRvW1n# zL*w1QO7rVRk*N-$cFAlI6SvB)d+QTtF9e}PXb>hhkM{%Z)&k4jrDV$iNln}`cR#(u zXCZ>LQi#`*cxE$z4axDkFv2B#LU3~VsXt2l?`gYc)W776_+Oity zkQ;43^*`!KZeR&OSffLW6`1Lv9UVr5Mu&w%6pomUNTPQ-qr-Shn)15XF2Q~@V;;t0 z`F=cOi8Lki{Y=Kv`Tlywa`|-@zfR@*UVdH9C$jlhu8&;T=8+G znJcYa>EcQ|SAtyW;7T`FTDa23m0qswW6M$wglUyT7Mk5yieLg%m1@7Q!R302%So@` zr*^4pwb&g+{6M9`4cAdBgDcW19O+qTz~QJJqdD#2w7A)Bla~kMIi1Ll?Xu&0?6PA) z2Tp2^RBA3K)_jYq{kjy^r?d9Hm zWVMhvNL)X0qr{C7H$mJman=Ls+t#C|UDv_74ZQdk%{qF-%yDQr6`X!om^pK*VMRho zu|m)8Zn58Qhz9mf!<3j*=`vr!nX#0QrA?-jR>J97O2WC=sZ14%%hHKGBMW^j?=+pP zx6+PEwaZc?4?A-8s(IYPjLJFPL>V$f8NU&&l$~$OP_@vOAt#U99jkV^=jpHC#DP+N zv5|YFSd_hq6)RP3p{<^S*EVOU+D%m_RXtQ$bB3z@9JJ;PKU`?e;I=Tk8pb>~Nrz3V zc&|2b*g3ccH>Uhk?YHn4uhxF633Dv;#TeI&&*tlA6f>>chGAK#2z2oaH^0!P+Csx% zk&aa<#*~_xIoiM;t~gdmmreH?GP-3CXr-Ee83OHh7n^=+%0WLY6J~{q0ZsFrO2A2K zVgg$vO1D+Try{mb5{w%zU3b!J5&xtEbU47y0(Wh+*O#*A<5lHv2kQlHzGAIjJ6^ai6!%63>VRzfZwWp{VDh}@F#I> zCH@>HSL0iSAnr*Gh4ZZp*?~&*u4+cCDSs($Nk_tLVW?;;1kT?|poxGL0ta>w zXd|!-|8D%9_MLugJ7d>RzZTk>=XLa+A+e`X zBiekbw?b@(t5QTeZhldxeZvKbsv8S9X5arm{UFCw)jOC>!h7tJ{RUChk^&8(o%Vxm zaR{;YBs(o@PR3sz-Cs$QLM+*b+t~YJIJucRq7Kqf7vERf}1(Q05%V8xv zQC1_9Uu=mS;<|{-VITb*r)8C!6-#aKTv^E)%aNFJf{#^9=Pwj$naQS9T9Rm8L!YHy z^)8n|T{JeDl)+iH8weivK%yl;!sput9%FqhwWe4F{ z#ZnuD1Gc`}sqgL_k!@H68)^yW%<|Xyy*Io3;xue^k*r)Zx6x06?h@2-C|ypjHI0w@ zk!Nb`u1T9#PCL^IokqT?9{pAxUSJ=A!Lil0*pgdt=ns~I`Ph{I)~Pvy`xpFNc_S*er7|s-(!iB#OXS z9lTXG>oo(np0b{`yr&i_1ZR>sn#0Wey^U*4H7?0ynLTiKJxA5=H1Gzv^=KPMcQLb@ znNDVUnAwA{)|ver9l$+8#1QTSM2vIvAV=-<{id65M)SCb$76Xcp2rh;JekKbc|4uR z*7JBS7qhsS%41$Gik+Cv#ahEr{F4eU`nee3VjUN&`4b-(8@brb#a1qMaj~6?K`wT1 zvD>hhFZOY_PVf4us5YLwO)N~-E5)j#gT1{UzXVf3^78!c;A@#HPW zo^127iluGu>Y7en?Jg}Ra$v*I?XHRBLJTKWQN)pyKp@3z1P<6*;$#jdR}xrFU={g! z#+F=_!$})f9@;>1B~wM#;!lCv=GF&XCR}($iL|KoH4UtUFIg6uE6P19l?fQOniy#c(P?|Z zCqKw^DSxjZwt}#5vqdG+L!_HuyEqdfki=Pn^r$6B|AiJ0DH?n2?xAv~v(1vhomCvK zpxsY>fO@M?j`LC9NPRQ)t<-nX-cEZ5?cKBosqdq`m-c<^Y@vRTl731?DH)?=f|6lM z3QdMmiDIs~YEgYKHwiA|{CTg3dt*t7=iWqOl1a(r-gHuOd2v0T@$zCSDOtQ&&O|mZ z*7Ao{j92iSpXUNRSI60E#(g~3$aBp+*UEEUJlD>19X!{~b3vZ#x5sfYflVoFN@G(7ok@Hp zhuc@OX*HWxVGxF!$SCD^Hu8HlRBYyV^ue|uzsIjMP`Z`QCOWtAmF;xy;K??g+(oB~ zvE6ib(%D1j9!mGpxu35LaN7tE4bgsppN#Y5L7tSIm#Dle7VJd(I~Nm6?L=E+ccQJa zJJHsZ^W|*T)bdjcmlgXd4p3Z2aW(6#{IIx@;%16lDRwkX!H}$}h2oH`>8Fc#qHW-B zD*01YzZQ6$+_-FJuT#LQpbCvp->Hal@%9$&Z3&G~XG05IW)~|c?e-`kDzzbe{;)>I zYIE-3S+&D&v4(l~MS{9Swg~^@7``WIQXE}rj3zLe!e|DgNqlc5qd9zUHCtEl(>$Il zA#;r}G+4WlgEjo5m^>>wkoBDGrNM>2-d#&BU`>W zLUm!M1P58qd|?!mP8+D3rCG3ME@}_;3#Z@F*RjbrtQhYKOOLm(v-Cb;;%A0Nkm4YD zGtHJ{uek9V(s|8z&?X|^IH+H-8W6v_D*aD8&a_&~`L(j1a5;U)8}0&h z!)Jv$1p7=?s0@gUsE}UD_e%Lg?VFA?3yviY&2<^6g^FiAeLZ)Hkc)**aj4Sun&<+Uyp?uLKI8$KV`#ZkSg$)^2MjO|f!QVdbvhKaC;E7n^tf~lrUFd(uxccG{Fs|8mdu3lXGa1AaZ zJ=%j3DMgsPivKc=Ep%e~gzuA&_rCfty1CBU0_}{jD0h^&dCuC1>v?Fr=L;ir5$5qf zJ1qHG1?Pv{Y*bYl$=_MT?D|~ad?T+|xv1GZcP+w+^4G5Av9<4Fg)MIDZ@34JL+8-b zv><%qLN$;_D)O8+s)53s8q!)Jg=4Kho@cxiGT($mVZT~*NBBcEwUxXk z^0wjMPTmgk+Q{3*^lqj*neJhF57T>@-cS7i{voDDFcf$3+r@IX3SSX6ibLV+ej8nr zJ!YG2emu#EBqx)fNpiYvZ`TuHqiep6uI^BWt7S=Z(N%KV=w(M&HM#zN{G<5C@K4|$ z#&3~-pF|Ty)LM4v12ME(+n?eDic=`gpg4)vl@#aDx|-ruJdj7LWryBt=ULC!@VQOM zF-A{EYQaBhpm-~-O|)9WpVl3;w$Zwaw%xRK($+)U9*XzUwx2H!@QoohkMN5FeDomu z$Ju{~Z!6j_T#V8e&r8c-ht4fVxnPCNGHuY3yEh7%Ej#oLLgpV0^3i@iI?6}K_~-;5 z9pqsL97}4NG4h#8qBdk@-JotQ#m z8i|f_bETow#&2X&5VwuYiCaxD`9u@mZFsli-7!z6sUQ}TY9>mmseGi-u-gcb{Y!e) zt|uV7+Ut4M2C9h)dDWg+%B%K7AC6b;kC*bQowOR{snAHvwd6=kZ;_?fy0#MDMEEw| z%=>Pxi!5L!1d0y0`G$*+dKif1$MFm#GLX!VGZ{$d$Lkr$WnC8QQu(o$b>(Ddv(A!f z&sI?5rzSv69gWqT^-8cBy5A!Mw84!hy>Qn-mrvo6!iCq`ej4f%FFvvz0hw=GW4>`B7+-loK$|EEzE6{2<#0h0S@+4+@yK_H*kfw~le^ z1h)=zt0IqZMa@Y|@afP5Ip#C9)>!ciw+yIm&o`SleI6@UxrSE7_nvB1ip+W@kr4Ehld5 zIO%95PZhGFh~E(f%VnATGKdy@EyBZHS62ymbq)#_I$=AR4YL6}Ox=1cVIg5}m=*Sh z$vrQZFa_{b8^f*4Ijk1xm=wmt{DcJvt0SzMFyA6W=3vN^xrMMk!g>jllxdK#e!@lx z8zXFjuwm1B%tkRC!<1-63Dl=hpGJKK+qFkPO9WO@Z}$jH=P~8%CbOpfdaSAqu59E! zt*kAkbTbDw(Q6HhPBiePtu!>zu#FSjY1lzi8%+y03)I`q0w)Ie?1=F^j5}bKa5WvI zDV*pPMC(RJ5N$8@(g5#UK?|ebcC^{RO_e-S$Tt*rB00E)KRCoq>xr!+c8rJ#A{4i&debQyLL_5)s&Gz~KzwJb@>bYoz3x_15W=B+_ zIi8Hg;>0HzjxxoDDm^)S_)_fV+$2tA;LBlhCB8WpoUO0=^*F45#c!1IXbr!yiGR0t zNe|Q$)?jReC!3huM%Z>HU+riDy+JtCEpN+$wp*t>^2xd@PHPdHI-Z;>!8UY(7@Y zSQWQaaG#(10^C=}>S}JWzIOLDa$hs|wQ^q<_qB6h2loZJubcZ?xUY} zvD{Hrts0-n#9L`7PMK(qN8z}ySX_Nl4iCc2YYqKUqTR`Av&PrxBdnV5+xoGG$kPMW zkBuTWhLT9L31w%3S=TO4u+$7vlPJldWF@KA5KOgqnN?+~7WLY>`A|J24a9CGvx&@Y zlx-(-2bpbT?jm(JshyL&sZ0hrkg4jLRj5ICkMD#UxFUwDUQenq!nD7G*@Ee*(geBv$*~DdSBGe0b zg;-im*1K=VTEvJ*Us2o_!{#`CJB>d|;Ez)HqYOTm#0PTNypl}2!!aR`o9(&>$xCN8 za$N3s4##}{?gpIlJPb^OUg>)P)ZE5@-UmnXSKNN?Acyj=b>c2WCO z41H02E|SON_*xoYP2j63d^Lk7lIUB>S99oF%?DSJk;gvySjxusCSEG#TN~-C;RQP- zzuRIF7wY*R4Sa1Yw>EL>HvVQix9;H9Hg2^Gd0*PiOP##b!%KVk+FoAT&kFUg1=TW_Jz#|w?T(98?1ywJr9?Yt1=g$`cm=7kns=;MW6 zUf9QxLHhdX8>MfIz6tt<>DxeGB`*}xWUbXcz21<57FeAt=ayP$00o&)WjkxIeI@~4?O|g77w9fdmcAfEObNQ$Bv}N&6seIPUKb3PPn}4dM zzl!H8IO69}fJ0Ua^n4?Sd>m@#P%DSJIMmLeAcs0Q)Xkw54)t-UmqS`UJILexJU+_f zV>~{=a83@cvYu5I+0}NdVH6msZR43>-LWEu(-#dJH78x~sS&dbwiJNrupo`T`$>e6nWd^>EFHKL#m!`-1 z()3tgnx|yflS+>qd&-Hic0IpaMNI|ie$oS^*D+H~jgRz3(wj+dCB2LEcG82ScaYvq zdJE}&r1z4(q%VyIYRYveCVwLigO=qA>6S9g+o==9E+pa5GmgsB1cFpDfm(RPnSN}2TX(c zZ~-Sj$jJh;yF^hj%sLpH6g4GuuQf%|1V_EI&w3m!7-8h#)f8hjiL3DB87CsM17%?& z>8iIDlndJy<7&RJZ81ZQkb|7sme;F6r-dwFmwFm5lJJws zgoQ?VISaQg&JBO<?v&kirI84cJ2#Qn59P4Ka*cr}4@-&ZbbAMr8(-NsQ+(zLLt- zRIXw}9?weBA_`?bpImFq2?c%YaqPZ{Pb<%Eq(FON#7No1@h!Yu&v*kHwldPh$Tptc z&d3f%+8EhI&f0tSl<-4Q4U3s_2-uQ_seYb!)bjZ>(>=jxLc&9n zwfrR~YxAo<=O@^rQO|2?t_Wk!{I*DwA#Ld}=*U z?|X85z+~&8I?YCvfNd5E z=Sc5cIB1CzsyYg_12M!ZZ(F{ZmECZmm+*lavms(th^vs(K;%~9n~2{=?snpL5Z^}p zE)sT=&`ClM344g#OTvC~2iP>krV&1JfR7v`cbwcq+^mu^#8r6B!)vizj^{Ny5WJkp zYw28`SD0P4g_%s(H4wZ|#gPgw_?ZnbYZZ2KvNAJ4Tb0Rl-Ep#7OvApgn1<~*S*ZoE zZNBe)$idc7RZmvzuL5S2>r3!i+lpyBC`{57Sb@)$lzCcp9nI%Gd_I=b@q9j!)5)C9 z>;nYEFa%yz5%ImVkGtg>{2$=x4(y8^+i$ z!G>WrXhNqmlvYBI^#vXLj7d9sx!yLhslCp&nunvY(ZstQ=$I1S^MG zxq(m1P-2A%!fK`hlFdewFxB4KtUwX98*v^#YekuRMN%usBqRqIlw3vYh#ql_?+*w zys6hpacf9zH>Awyjk5cXzN!63F5{eG$JYG*F>{~vpA16K8Y=6QcO zhnE8)9uN@`;een>P=kP=p>jaPBO-!`K#1}tA~rKkrjD4jNe+pcbf>X)n!asjwl=Mu z?rgKk)!lBV-D%V&&g9w2&SW|->B~H|napfDGutuUnXYMV;`9C8e-8oCND@=?T-RJz zu3Y9tf&cmc?%#cX-|ighL)2$dUrtFb^=9!qUO`&}ZH=_m(pJs!Fl|k=HPhBgTPJPp zv~|!Hp{>g~``UVG>!D39zv){8)W+L)BFIjoU(~wdKTRfk7X7n1b(wTQx&^5h^0|2- z*#+*Qjj6Y{wrzqZN}5@FKfy}qO%4sZ26zJObwLeg!YZ=OJ6{X%H9tS_@oTA!r17;N zU&~-5o3CZL+^1?YVO3``5~A8nSk>=>3CodI`qZrKC#&oilWcRSZUN!I3TIH-j1W0> z8c%r35VZ+W`w-`IBAw0CmLay5@FlH5T+J+PLbP^Q@7q4xgeYO;=4qP{H*a-&C~~%O zVh1O-bE2CQwh8gXRW>1J--YbVjV4Z>D7gh`sN|++P>_vEZh^LQ=Hbu5pGiRozv(6X zYZ$L0xdML!{zm+^pi_DPM&_ zrGAL|*fK;VitdJD+5+BJ#wLnld(O znviJ2C09|rX+ok+Z@7vsg}q0JcA1%|muL^soz7J>ewp_(iNCj4V@Y?k`a!2)maQtT zmmAUi2qE8_?lhkmJ=FDOa{9VphDH=np>*^Bf8Ml~h~)=)Jz@@SrSW_60~<;%}8@Se{m9Wj-3xp=s(Q&1# zFtl~Xn^x2?*rAISk)swu^~BUK_*@(uMB-bbl_)UU+CpL4im3AO2Yznz@n?RQvG8z!hf`UY#=}AKGgz3-!&xj;>h%hKqP*)& z7ApR_oPWwisn>sFGTj#%c%hLOYWZuE>5Arlp_vz2d7+aR+IgXa7rJ;M!VA5;(8CKm z`J)zI7+|Q6p<#wb7#d}0h#|4tLiY42EOs`r*R=>(3xA9F6E%mW{EPQ#>ObjwHVuzD z4F|#>bY!=p=JiwPQVygNOd}8^kU=n;Ko&vG1tOqBPNEr?LZpQ%ot zfoTE(k_Dp$TxC-k52q0d63&RN)>8a$p2LoUnQn*mySp}8+)6UJN&Km}l{r*igrJDby1>ZNd3%Y8-*V!?dQ@GAnl)5T zRZI0ES!PaDx>-f#sPDRZRE|t}pBMS1&d0-}lAH!uD-~|G3smipW-HOeYIv@3mreXo zmtA2q{BgY82Dxh&kYF!=zv(0eb18i^p^o+Sq^u`l11TFxu`R$UTS(dJa=i7#5_XWV zorG=@ZYAM15_XZ&Pv#(*yGhyOq`wJ!on2bU+kl_{diA5Uc0GNl<)@IriSt$;2;trgH(y@z!Dsg0@P zjRr>DOD&qeuF=4#dnsbKa3mE~6;f+@6_TSSQ*D(`fVtH2Dw6i48*c0(cqtooUo5_q zB7WRprDGYf{Xw!GXWF8uT6RlDI9WQ_OQ`1xYwp#a-EX^AvzI#lz0H2caoN6#42m?^ zq(tE%LTlA<7CZdeEqAaF;+UU?D}4~hrhgE%9GgiesSm=>Cw9r8@}~^)uom9itYNj)uO2Qpd~~~TsH6LYc4U%f-d!r zsr?(%53A>_Bp-_wY1ekq#q`HGngnCk`~m!_B&FdGqJ4!)+4wCVK6eGVIpl`O%_OOu zALWu;!RZE0H*&g`!(mQ0ak`n)t(@-UbUUXzINinR2&Y>(-OK47PMe`Jv5&-I5- z)OQk=3rb4jJBz7M3u>K)da9%`wZ5GKjf715A>UOGadth}J)wVsbx`*nW{P6%U_wn*DFOTr@C@&B3 z^4*jb@p3Wu+Q=hhOlYu>C?`SjCL_gYEavaM{&_jilyYP#(F8Wd)11PE02e&K$5`MC zX228+e8E`YdsjFE=DnGS1-`eO*K@hoSm2Ao17l#I_8DCP47^ep*XskE?BnDxCr3Cr z%E=*4Dy3ZCkN3T)sgu4dg*yV=;bX|pSItg)N01+7@WpJlW%0#4Bz*nL5Z#%4F^6um z({`^Rr3x*nTo$v_ZmH%_c#55NSv$)*Sk}cdIcj@Z*2A)$bjw#eKv^GU!<3CsHcHtL zWqNw*rEje3Q#gr0PV0&_plRH2X6-`0uJ1~~i!KOt_$tvlHP$xIRQ@Dz!?1{u+5lDc zE5Si;LHMNa(9=H2@^D2aacT~RufU~r%GDJ$S^ng0m4EdPHPzO!q{Ux~)=4vwl2>$`hFha1GU=P8a#J3O}n3mlXqlzwwD$?om(0f7mNql97uezsBjJ@rzn+Ziy zNzZ}u{5yW(RUb+ug0-Rbte^W5+^wXxWVVIJW~HIU(th8#NJ_rHYMtMu37N_xl74Z^vXw31Bzs|l=Wr}#nn}Al* zznT(FF`6BglB1Vj6T|^mJl7iZk+Q-`ED}wSlU+e-HQB2ut0b+6JhPQ4*({Vqt%2=R zl%jt3PvdyqQHuF z)Zjs#WgTigNp)fkehOpK6qU^>p|xTy1+Q78kK-=iBrvTBUl?EWTTe^7$xWRC*p+3W zZcr-;+-PsFhX#D_-A)aVno4FGsXAPzQ&)IMl+SUJmte$lmSDJ~D^N93gX*%po$R zmeC8dm~ZQSklt8R+cm|;*Y~#du3DWVQ5eO%KFgKvsMxVNP7*BUB|4Aje4^>ZEh27# z+bR-WNL1{D=!SY{nvQNDZXJBJwRn2mBUnyP&rEF5S1#SN=}opaW%K=BdFo_wcK8ZYt;-Pym=M3S8}@+ zi+DhdHhN54SWEaDyRxO}{mfFnsgO)-00MrinF?F>pq`03AQSg8H{nWn6H=Mg@AW`P z;f;byrthB;`>DHFmgG#kk;~mG!_XSHzdlqkWm$75Jk8J-iFx|uKF!B-{XV!+m zQVXZm#UbUGreK*~uh!~J?sN2D)v)O>su0EGD>GWsF=;WYZmVKj%=-W14IOI0lKAK} z98zaQq*WlF_=UJxLyV`Mm4qVttZ%rApwJ141NysO9u?#z&b@NXxaQerFVz)%=oTVt zUC)!g!WEDQsz|JMh}>OC?sxTT;#)#;3F%9nmhZ!w{%m`lPQ5C8ipS_3a4+5uz<)zm zmV|x0r&g8-8xM=nFXGDw+}Ux#(Lz~^cv0bRDy_;Lm9|h%Y&QLu$qOwRDU?rWq1(?D zQW{bX<7-_Q+Ra`9l2K0mo2G>zZD(=r^CF`#4F9b(#k8Hywc7q9lX-TD-mAl<&_>@F(ctC z1LXCQH%#6Ld86bFk*EH@*ePZugy6ZD7lTGKd`c6F-qn3R)k%OATdSX|9%uSpY)qFs%C-lq#_KQ!HSW#EJ+Wx2wBjL&Xf@N5} zeSyT?ytsl8;K}S(>VotI35M0W zNSmQ^eV2=v(}Bt?#9xARlDdNuBt$nFvBhY_H{|HryAko^ALG`$*x=)*etw$5 zcLRJkmCvT}-5}r1;Ir9$H;d0|<@ySq*HYI^J{xkYUFX|s*SS?xR*=^~UL$$6{7yBM zP2`2iYbLLiyiW4k$%~NJL0%VmE#&o**F)Y;<__?QK0YzbCr0?hD4!VO6HEBZ627~X zf2VtMqWelgFOr(K9v?d_%`X}xn&FtEXqH>ay-mzfxm)KNs4@zv;Zh#Owra$nT{DkD zwhOhd@qNS(6F)-yDDguMY7p@nQk$pNy@-C@+9uLCIk9%u-mXLHuCK!Bzw1P#>VS2X zsspd6jO%Tj#kZ3wPvW;`J6+kpTn6SbFrWH#?q9^WZROd(Ldpwx#@jbHu?g#Xufa-C z&YrjZN(5Z7Nr2QsYr~f)j3oZ|46!&NQQ~pbM0s$Wu(%iy_vh~rh|}V4N#i7tyMgLB z6I2Hku4T_hP}ngQQuUcPyy=~oRs^`&QU)no)P{XTB}ngE5Yp(PBYu=2C)LYGG zwXs)bb8|tyP|w|0U)TG-9lUQl@9XA$wyyVmySUrd_5SPBb-gvQl>sX)lYgba!xXMe z9Edd#ckpf#2g1H$x1p=XY7WOZZZEm2>y>3u>Sl$DE;X9I9^d+DrmC&PPxn=MH=4Yw zWlqT^jfY<~Uy!oMO?Ai`Rn#zh1M*wRXDeLol3@xh2rm77PDVTUCMj+DiZcspE0$2u z{3Gd_y9GGNH(|GMw8E0*EC=kNN(#MjIeqiqGnup?SQXgeV8)PYJQ?(Ji(R!*`*Yq9 zOW0NW_M4d^rv}UpI3Lz*KSxu^P9r-=b_UtmWM`3`$9RbGOtNzrFGsoPyYUGv8g|4- zzXvi>913T}{C%v6ADf$*kf2*yhJ@J(*WjOl>1& z2PxZ0=_bYGQYpL0?59Y^mO&Sm7}-n4J~Grdt|C+W7ByjsgElZ+y4<#6BC%|fM%|=3 zUzT>VPZ@4%n>ENtxKhHCv2jNIyf93Wo2pl-mfNsGCCh$Sypb{`mL;VtEMexE9wIkA z^wP*vpV2WPOKi9f9Je>n=`y|Bak#1>5?2WK`|fhSYdE2bWSokUZeD#xVy5(?>F2Uq z>cS}etn~3jEa18>4Fz1U%%IK!uIo%WufT07=j%*4{}WTrzh1>ZObXxoi)#L1dh(tZ zyQloUSnS>(D}rx;m-={Vn3qO)X_S|S+@|;qx@rZ2sW>F@`-?dxoIy5reXFG$w~yd& z1tn?VO}J!ccLgDZ?*;f?D&I`wdqIAl!8fz{UKZb6!OQZq%f@bg_HUMxZ)Wy6Rs3}Y z>l#?s$hunowVJ;Uv#yDC&8%x>T_@|>S=Yh32>Ih#Q z<*P${H5vab5)5t7edo7@>HfL+=i^T&VFCU{mtJ+D6A}lCSd^*xj+hhnwFxI|J^uCh zH#oUqU?T~eNZ3rm7816SunqqX{M+$&yEpwBB-l#G7oGl2GalP&%+v z(|+V!@X~(5yNM1?%EOV=MBWM+O#CDmZGC*g3*ZUz-@IF!?0?r7s4K?QW#7_CoM_%u zWH!FdP!yfws9o#ol%AQ&Dab1k%D%MQ?$c9u+wILojnE~JKm*Z6*H+0Xups<)ciS1q z^oEXID)E1Fa1XP4gx#a;9%8q5txN+I*ZZ9#>8hZjCw!fdswVMAs_MqWij1C|3KdQ# zx@c-D)M7rkg#V%5poB-3(YVsBDPK^^f2?82QXW)cF}rtOJ<;{fo~Ac2you;$!dqOz zcC?M=ZG?9a-cGn1$&y325#B|#-z9AO28}GeR-T*!F@TL%;dfhCvDNgNpsChCwV^RAUhw^NlrGAop0y7 z>|-6A@8Z0?W4)a3;rvd{P1i|UNUvsuv&Fn-&+YfjAb*+g>G!4@e9r_?x$1T#OEymVNpDWnT)&Jj zDjGCK*CtQ(MaHGO^bZ+A<2*y?WV%*bM1y%90(PTVW{)q9QM#9aXlv~j$a!jb#U(d{ znx!QE*%}pf;~C;jyoTIb6z5qm0wr;wV6fWoc0wug&x{kGN&Rj37rZa)(<2hoX{pVA7G{B>&oJ`|UD<&tidDM2aITSawY*l%e-3l5iF3`IYvo)g=h`{f!MQHZML5^O zxn9ooaBe66Jiu5VW5bM%FgD8A5Mu%ygprCZGNYwWUjD^Ax18tHQ7gRH&#M`HDx1w& zd`j}^Og>e?iCUDI@SRRhv~!|^6J4C>BgONDsoR&J+U68JvCza6b`!PU2v$nn0ha{s;%KB2QGmZl zXN@q$987U!kQy7GS!LyO4+ovIOxSo>*tn$*Y0_F;JkjMc4->w|dCEXf5GWYOYa6tNdusMeTRO+5Wxre+Im<{DbF|Xs zLP+g!%>KaiI>zcbzMhf|v~8qq6UR5xwuNI_9N4 z?yY5)oCWI~xpr?8_cn8HEB8*CCGWLa^4{1id0~L_eViZW{0QeqIX}dClZI;S)t1IX zv&gyTYJk{d(Jl7*)oiKZtGAGD%W-b1r))j5wJG3juL)3|iS)WL-;hYCD;l_>(|toT zH*i_x$Zr?%XOf-UbrY^}xsLT~9hN)3g7R_}ui;b`4^+@!&6BHak!2CZRxtzu2+|47 ze7sshO9>yfV=Fx8F?}sdnaK3!tm#A63@0pM@_L`G0z_jnrw`1*r*=Z&5{j6Z@8obU zTw>}lb@3)gUnVbi@Rz`iZ>*-OhLx6nGhD~XiSg>~&Q>dhqWCU_=ln9jFH`we8ovzk z%M8Ai%`da~mWAik=1?1=Hj{6a^XXh_*D$Aol~s<`tZSssQWM2#)-_SrOkFE;I;m@? zu7kQR>LS#&P}fUc4|O}4Gr*ia<_t4uggK+k8Dh>Vsw$~2Vux-Yc?#^q3S85VX(2gk zQ*|}x)L$vm%`!K9Gqh*wF20MK54!AVFI_?EBk6K)K)S-j1sA*B9EvE!yN+~i(y61r z&0&>lMHIFDoEer?1SY$cS1Am30aeO_wJ_M60`}@E_tq%rLSM-riFMMoK8bj0t>-tc zNIY$0%?{RVXH7S2jCESGi{I#H_aJ|_o54Livybwf2me}4dZuO-lg=Cky-2TQoj;kR1s5NEI0|6c|58VSn9xxBx1LmQ-V}*NN zrCd#tgw>Qe(wf%SH%=u9dKf1ayr?8kW+Z*`Dw>V}b+3&PE zg0q4e926*5PQ()A`jsG8?f7wB`o62F`z9w7P9t-LatGHFzri7Xmu&?N%w(^J=U*73 zJ|>P*CdL)SQ8BPx2xO+k+Vrn>5qvsdGBpTqy!Gn#=_al5sXt==9R<6aNy(J@p8&K1*L-tGJ-rJW}^kFdHU4RPZE#{Jx%ia(9< zAmbVMvl-8F-mCH)$}{nYD9?4VJbFJ9^ndCCDs$bQE0e&nNlZ^FvAoDuTm+S$XFz=EfMH(^Adhr z#GgvEMK`!cbSWS8deJ)Sbp!hNCqG}iy6UN7YW%`|mInO4s`&2}yy~R^SMyB;0>6Va z;IP)X7x6Q>X+#p)@S+CKzrs=Tvn?uopn?SrENEnb!0>7YWFQK&pos;|ENEpxCkxtH z5Me%iBAFM?!>z8-w?Uzkks^4Z**$339WXQsR)C$*K(LO)b^scS5Kw>kky)C-94 z`t~a}?NVV0?ogiXn>6Htk9JJW0oF4)K$-b~rC39F$Sea?F$x>{Z^3&#X*h@}Zz~OujFXV6mS%sYUPL2Lp z<+>YTy0@NL>p8rESsR(PiLA}c+QO`@%-Y6bdF^*_csqx?IeaUJZ{zSTX7!UbNY-v< z?ICL)hxc;$AenbLN?idUy3mCuhgZ9$ic+fUPLJ0WqwiMlhJIeXDuPB=5z_x@L0Hn} zy^>6=_8QFQ#W@_D%fWdZoX^2@URlH|3pkk1!G+Wo@QSsv7e(2ZIM)6y0oT^k=G)YN zwuaZ_h+NBSxA0sYXY2XtdOo~?S2yzNCVsk^SGVx$R$kr4t2=mgJFj;0>a85SjaPT^ z(|&$B$Vr~e*DE;Lz*CJpWpLT+VV-K@sb-#P<*80iwsSJVQyrY_;$#a?^>VU@ zlRLS0fVw{FhN&B&Zj`zq>Q?b*mAqEOx?+AOnT%OZrSM;7b8HSpb19lf(R_;1i7X{p`u)%%a<#K-pZ%=214EGChF> zlr5s$W*`V4cayC%8k;+YUZ>Dk!mG(@^ zc2KsRvTn+5rR+A!cG2BWw>^_?i+%Iptmk$Op@Qr-uy!MBH?e;+Yqzj(EBm&wdIzhwv$~trx3cIqR`25We*SWh z@9yT|J$!aAd-k#C0Fk@cuUjwR66tjv7s>w{o8n~wh%-@iT%L;+iiU{S8tWVvE~J}9 z0`&#*Z%QJ=S&O~yXh}Q zShrWeOI=A6T_S2SP8O#&I_wtE?5xOZ4Ua*8EREB;Wzm{~VpQHa|R8GC7R9$B>>%HBH{`q$}(QE8gI>Z{{ zt0qN5C<3vX@H>cxa9Zmmx@7;?upfW9WN}-7ZK*t###NABAgO_*Mv}}XoTd1JCX&J=HIvjzQYT66Bt=N-AgPO_7Ls~N>LF<- z>j!wOkH?02Y=p-~d2EQsZa8={RdW(Id4F+;kTTD6%pg2rPu7lUQOUBOh^#U1?MB0h z)Ef&R@_XVs`+J<0q)7x?00>(ErSl3Y-Hk$z!+37q*I`D=tss)siRlYXuz zbsX$Oyr%wehM29GLA!-T4rZ<;OMu?hklPu&Tb-| z0{``5;xu2!zY*E@DL>m%=nl}G%E2_cgLG$bFq`fyXUzOW9-DL69Aa~(^JdP;W%C*? zvts4Qie*e(o(x%&-B_|>$&htTHNJgkO zEY^Ve)qpJ~O{YfAo#pQRIjJpg+nBY3S=*V_%`97SHOuFATR)Z&i*#PWvkG&ra6QRK ztMPRb-%fl7@m;P7iSKbc-!qDNa516fZdKn!y*5{SVJ7Xsy2cChw%-=PBVLJH;nIpU z6vt^;v#dNd-iOpDSbHGkMC7dgy_@4iO={fsewW8|n2O8^kFAZ-@aW>x$0#syrq^b_ z(-ZNw)B8=%t=cGYh_Z>Kr4L$%>6uKG!X3=A6mIixdJ)_{`8W0PHQ*Y{u-p1N(Nezg zQL3d>C+U5l7I72qBRouagzzZgA@@3IaE|v>#DyI3{Ey2VT(6>e^@l2328Jx-HnJmt%;JcZeDd!KW*k8e&4cytto#tTOALh;`?ri4H zR_^TN&UWtX;La}YjBsZ!clK~+3wKWVbG0Z&+vum5 zHI07ZNuytMGN@>ypDat)#1*54D_(w1OZlbE5z%62cKiKeeou=Sid+nW9>Rcr{A8D1 z|Iw)gcjDAs!NdZW%Azhy4Y`ms0T-IHay2=|-Zu>q*;k1I#F@vMoY|P^53O45Pk2(BfCPzd3 zV>xSc`NuWnSMe7W9BAM`BL`|ZP|aU7aUjfrW)8G+ppygb9EfnBg9BY0XyHIF2YNWL zll%dW_HlHWqaz$0<>(Mcy%*k&o@Qi4%7kQa(??(CTIGv+0Tl0C=hR}0O?iozw1!9(nH3~A5Z6dtHJSS0!q>_KzM4`?>lpL_skQTbH>KPmyNzz211@zzprtOg zu!h+r&L&eh%k4f$pF`tZw~nWAJ`L$Sw1|fm(3nr-LJA9bNR!k`9$Jm$k@v?eOW&{O z*m{aK5ZOp%6UR0a*+OJ1k!?hF5ZO+oo5-y+-bQ2>$ND)wNWpGS?V)}zZTo0b{)24k zHl6*JI)s>^?1ca?r1EkaF9dlZgO{^;A}iM97;2JIYenW-^`_S4I8UCP{CLO zV~vc}^0{gb*mO1)W~`a9R>nFRYiBINSO;TWjI}V<%UBO%JJ~pWI$MQwlJ}1xasE*s zM+FGzv`%7jg>T5J!`$>O_VX^p4H^EuVg}U^RK_ahs_H8dQcqwvEi<8o;`-F^0 zH`IkB(e=*-&Kva6pzqcbVlrK*80yn*PBpDNIwLw)Hop#)C z&e~}7ulOkNb9~~m@PMX?5!?7Cjjo!`8YP~Q?lg8~e17tkaoKs-VfRkD)GR9*G|QnA zvf96&B4kz9YD9)`JZXc~ooZ^{w3u1}eWm=T)g;R`yw)Mi%MCr-;B%qG-%P2Dqn> zdxp7ZgnLH0XNY@Nkt{>8X8a@$T?teSr4wFsxx>O==wj2tE7`l+E&9}>JGPb|-2qeN}+6@UD=-S`G4IZDR3U~k0> zmMh{-G?(Ryd@h?GWbrx4traa|xgwvNlq>RyDpnh{lxMjjn(_bd)LapdT2iivM=j;W zsHH39idbHappq{abC1_{-f+xKo)jO6YEJa-iRu#JmE>(?rkMQ=ULbYQ4 zR`o=Gj;%AupGZDTqEyZWuXL19DTla9rKaYk%$9$ojvw0vp=nNY+{HJ+XJ!uQy>0lS zh%NF{*jAup6Em9Hm{Qur)Q|Dop5jjPnuWm3nFwCcXJ^fDiV#<|aDG=S?o;!lz!#i{Sp`25#EOO`F)UnVYt-S=(B*s@0SUCt}-LKY1G`CT(k#GGYEc z&g|t(;1V0S$4|u#VgnWBku56FhYY0IH#u|tsE=>>`CUCyQBEpZo`FRed!dC4Oj7>} zFmzXvkaIPe^6bl zVtyjJQ|eZ4fSokGULR4bKoV{C)LS=A2KJrnAp<+;$-or7qLdZQ?6X|(UECbES}t=Q ziE~MukH+@Y1tcya)!>VGsb?4SN3mEEQJK1r60B<~TFOJ(^lIN&;s#?CHThbX=$RRnU+>sI(e?0 z=Q?<K!OO$T3fPr2ba)ckB&J)XHxy{`S%9XLc(0+wN~^cT=)S$Rb5iv@7U0 z7B59Co^sL@NNd6A$0{gnxD=JvP|bLFN>o~5JB1w-c2O8{F~5a96z-&?#YLrE97C4urTwG+xI8jIBc=QVasg`8G0OUG(^4Hp&a2R z!p($R2~Va2B5tL-V+3|OKU#RYA8m|N^mTXFObVbhX#D>$k!8q8&Yy@b5kR2%ky zM;$TUfI7uGaq@Vo3le3iLt#fFE+z&D>xx%tiWQvDT9;QGCo|WLEmrn}xQ{@^)4CD& z2I@$9)WcHOHAVGV2!m43ufH@uj=7aXaVa-wZLw0J6f#rFlNP4uM#}@%a@^%80DZUe z7bvswI*&`rXcgEs##0kev$~yGE<#o|lbIM5)%;vE$ScEGgX?Bd)S9sP_ntq|yOG5R zYc4P?WrcM>ey53+uPCejDqrL@OT=rz~b!w6Zv5G0S7D6e#`Pqm}P3;+yt}woTnu z{3UI~)0sWM^RcZKBJt0ra8H1HQh7a%dxG4P!Ruzd)PVfd3WuCLmFZSHJyp&VxjeOo z7pmy1ps#_xM*7U8))%I)iN0p~TIuVgubsXQ`nu?g(AP^}4}Cl7YoTv|C;E6|m?uVf zVw5L_ctTW>txo>UiJm!`hi194bcOW;$#Y1aOY(dI>0~S*c@Y`;q%Y)H0U3+=p-zW5 z&}IClR)$$?Ct#u2PResN{IfDh*RoTQ3-zR~C%KOAZXjbL8P*94z^0Z z4KLU#bCB%aWbPr`bI@D47#CG4md$+SFUVkiHEX#|9Iwe*E{aX=a+46qT7F*@XQ#4k ze>R0cKQ0UiOa%goj{y* z0#45p+rM-DMOMrBk9MC5-_~{GE5WBZbmBTL;UQU2m%4r?UDIMr>FVUZQ_+trXnj4U ztJPs$)<;ZfQ(oi#wC}HFiJ_ohdWQnwF+8zrobQrp^lD<)pZ#jYu6n6#Ce=V1{iS6vnftZIF~!`hmf7fS30G!gK$(pzxId5N9FjvME4k5P8^nV(TPJQJh&w(P-?W%$$r|N5d)qP5 zqLB1r2niJE?f&ioKDxMEJfkFtNrbkQ+%SM6nr zbgc#+hW(EBY$*t<#;NU8EP0OGEU!;Z8q|=*k_)s~W@)$q zZ#?l;6Ae!pPn>F6gGmSBE}KeX!fA~sms95l+)QzUt+GovRl+Il0`TAk6=6y8Oc^4( z!QScAo_y8|sGP7`Tj70jH6O2Ga4mOQB#wM2cdRFO12r3|*~A^2so6r!R%*6UvxA!L z)O1sGE0woVvx_?nh5pfQ`X^9m_5AwaJYmCCBn^r&nUFN-97)aYvu!njhU*cxuI6VI zAFpJv*wLLc{eW&FBPLylUPtgp3qdr>#k;fYf!=-ty?u()w`<)O#Ag~^pRRR#X?3Bi z$mkJiZju(uD>A+b6Pf8fd`5!%r22>@-uq-FlZni8lS%2(d&y1a8@Phn-^r&nBPX*+ zbU+fnm>T|EWuAzAa^>e!wU9*x4(i+^aBMXn@oe~YoUdo!6+QTd3svo)YCBckRGAIG zY8U$~{P`~@hd-N~qa=mn0gk6qpT_YZ$1|wU=6DwMd2X#(N{Gx%>T}2}Co`8!TQhpR zf|3SG8Y!`we>_Y{6D7@*v{KSZNjoJSlyp%Np`@3R9!hq)%3m@-LLUjkB#e+SO2Uu} z5B!LX{JM)(b(2{*iw{UIF^B5e{FO(Jr1OFKR4iiRQ7kOr_QiZhP0KPyG(RrqJI019 z!sT~s_<)kJHHX?E(ggIu_2h4$ZXBv%r%pkf-w@+R*5Ll4lFG=ywa-i7go4*sV{{1f(mju8*}->8a`6Rf(ni{aI}%5wS1$R zo-jw7INHq7R*rUZw4I|J9PQ$0grhAS?d50>M|bj(0iNyS*9wa@3!fevBD74u2r6CG4ZR=|}qq!8W;cu#VwSxc9 zKt>}O)%>uQ%rF^EWHgh}N=7Fc?PPS2(M3jtj9xN&$k^#t1ZE7-&_}~C4I?y+(lB(1 z!YfqkV#PMwL~D{q)=w3!#ZMKj3H=t?=kyN}KN#p;sK+v)@UJ6b>((ud!Gw$mv-XhdqF!PkytXBvuI1=%dGgi8756AaX zvX7E6GJMoouI5SwOWL$9pQ)r=|6vusR>|u{^cJ&s0_?SyDs;EYc@}uPL%53gy9tET z=Y(ycShM%58;7L4|#E3Qog zZDWQU(C^Z2mHOQau<{$U)fA;c+`}jj?Y{tl!Vo)#q1dJSei{7e(;N(5P) z=dL#iWGg1$c3$Wu(QGBVXpWIG>Q`OjR_d=d{6R5OhQevy)OVsgSKpOyG2553U5OUv zH_6Z{XAK$&E*nP-kt}A%QZ6l0NwN*>NftTfx5%m773AiS8zNV!Q|0_9m)r_YH*mU< z)3qE9bGnJs&75xKbSJ0VIo-kOE>1@{-NNZ!PWNznC#eG@_K`SD;s}YOBo2}2F=!K* zb0I~`T>h%wlbhomuA-?&EO5L%z4##U87Mj}wuTJ*EFuj=8i~{r(Pt4R(nO@0NGp*}BJD&v zh;$K&5a}h-Lu4lzEkp*m{DaWa+ZlQ=7jtSkr}U#uG-hwFD>K~HMLN&m0{ZAQ5yHo- zm|wv&F%iPE(?kf*wDU{{&vfyOi4dOY;hCK*G7-Y%CIa(gI^kc zOv<&-m`yS4L3yQ%_-fPJ}E{SE8MU;rGUt+js?`@Q?roV0`AZizl7IIT-sYyGR~Dw=5%p2hqTXP zDd)7jppLA1+h4F@%JPDnw{r6~w|GTL+KCnO*|FsX{kxqlB0K?(37s2bjV>wg^eLF# zF8ZRB>)@H4`Tc%*qiBmzkK6s8ruRzkQZauZmEbZ?l(DOn&Rf{(DFdar(|>)tJ;}wX zJ;}uxHzb#T!$mAAX5CtsEg7%LLN`m1!^{gUFeG6iNeT>6TfT(3C6q6tx0Ko%4lSi@ zEgS0Cyo-7L6c19on+`S{FJ|4TOLKgHC zwyP>=`38Xo+udMURq{?on}{|OZ6!K&Uu3lR(!NM}vZB+0GAx4UFH{rZJyGD9u5JWjzys z5LIs`0hs;uJ+Cz?CT&7YC26!cg5~bf$=bPYwd3dQJt@)E;cG48(I>tTJ+gvTx6wUpD*Jg_4G=dk4b8fqow@IYQ9jzkC(bT zPKkW`>-f+0Ob1x@Z)N{BCZj90F?8j}yZNyImOcFWUiR-}{}@^776h%>6yTB&eEfr- z2d|iiu!0vS9dj3nu!fLb@$n57j8N^=tuKb(Zal&&zF>&TNA#2|vPsvyY#OpPsR})G zFm~Lup~L$5*JJjsLCyPi<9mrTvbKfB++cfAS$`9HT~q2tGx&5if0D(g&6A}a;=xQl zokOr3QLfss{Dms^RPeY*xyq0wuyLw%;qi7J@8Iz+9*>|6*N^w`_)f08;o2xyr=B(4 z)ICZ3Czaefep3yJ#h*r2kZ~mysE~iPNpVfYH51oLTqkku#B~tYMO=iqUgCO)GkI{_ zbb0Vw51~z3M!9EIki|&_f2xU9)#>i5bDA?+XsZ|Oy%|C)%Z#aoAN0~e)m|!FESXQw zVsjEF=Wt>+pPI{wd7OyZUN$e_L_Q}L^63J0DTGt__DcS4HOuwfYWQ_=opro!ZkJDQ zVC69IfVlO9@!)fN|Ct`vDVf&#VA?vq8 zSx)gDlG;row@j3TAgPC8h7mqhQOYC_>DqW4fcA<5l42z9wgRq5VCJ%n~T z(R-+m&@iD9LZgI+T+h6`l3#y&;dM5K>s8-Ye;r(wmnYZB%d9EJ!s~u%30LB(T%MaS zgy}Q>0TK)(Q~?qCD%d|To9ubS&v71ycyoUQWN%qSAfMEQq!c)xPMbc>dbgQ$BC|bv zGl4Axw2xq$b9pFCb$UKS$si?`&k)&1_FgBt4wN~v=C9;%(O36Gg9kWOQN-^nn@ucoRLyUypo$2%k~;&<6E zfkbD>DhW`MN+gYvASD?@vMI?zWvwKS)ErVXiG)ZkCpnkYH9TakdrAW-jii`LA+XM= z!cxMdG?UUwN+&7pq(n&RAf=0x7E*di=^PEK3QSWE-T)Id`{dVWs7tv zdVse$Qr?R+*oLO!YZOP2G4rGgy&0mrPPsJ|4xA|Hu(RIuF(YI6CF%l z7N9JZ?P-(+Da&AcHf33C&m&<4WjQ2dvOPpXIU90GSi={qNUPvT14kM;Qp=HQ(u7nu zaU{%lKkCe8%Z>6t>RIMkz#PSE)<AAI~6oNx$RtPZRfYE_(BCgiM5^o=N-45jg@2; zajuxEN#fPhDV+9E?`J%f2huogD=>1hnVm&W9{pyc>(3-7hyHSI&UITPQmc5<#H;;{ z^qY9~fiV3|^f%MrO8->xYJW_;y0^tGg0JkOa+t~yDo3dtdP7Eg+*9giAaq>KTjPbas#UauSb5#m<6=-tp-ca*~3XkhTZ7{I9K<1Tg4(0UUzn5+5My>MTE z`)sr4eFmf5m(6|J?74!od2X}keYV;2K7-NjTf^BZL=c~Cz=P4wT2ja5Fq$wlA!$=# zw6g=8?c?k)XGb_Y%Gn{#Dj`kV>vXL2`pI6W=$i>w-BP#VI_MPy?{!^9l5llJjEbca zAR{zphH%F_gg9nih-CJB=Ot*bJ1lXY$I~uK;Q$-tSkzsa^nDw@34wZ~q(~}LM{Zms%etTvERDFxv_jkOH_2rQZCdncr~PxI3N7DT@Bvz4HL1Hzj z;9lcf^X&F z8Onam3}xqRSLrXTJYI~I$6u&CS_6MpTtkd#_(3~AFrwiHUHrg^h9C6sgPpuSz=!(y z&@dkw;X|W*XowF_YD{X@nj0A0kgZeOeA!>`x1;eG<4@f0Yyw6Xu0>5ZX?t zo6xOpqk3o;;eNt{M0Y#ZKDw9CJ_iu#oAK^Pfhxf{?#~QP!c2l5W+MHYzMQTq?V%Io zBJ5?p8@}SVITR(Zoj^AMQx3c6NSP=VXkciJYP(Np%r1icg!FX>3GH#6c5t728lRT~ z%UkG{%6M#>+qi9W(@7cEdC@V+WL!t4oWpilr2PMQ1s`c(ypi!*#;f^wnDHjYn;CCq zyp!>E#v_b(Fy6&@3*)_v_b|Sb@d3vB7$0VQgz-_vhZxtZve;det$fXLyuP@U?d@=(oh1;l;xQY!A-w+bb={eN_Ly;X2Fg;SKXf)J|DA60}PjNy!XD_nPLTjpg!AT|~JsCX~yMJ~0hVAl=8uuD)F!e&U zyLl%|7ozP%JBUVzcHtBYy+nJQZXvFZxMAW(h#Mtt$aS_i?0)fDj_J*Yy#^XWCz=g) z(Y`g8XZOX;tcwm?7kxQ;tS;KS-TWjd1x`lkluMpO->+V#ZWUfa(1U^$^y^q9T&B8e zJFRZ^>Z%YVlNqZmc}Qi7DDim-mZxTEM`=B?3zXu@9JDh z!fNVkXwx0K)01KQ@nuL69t2-G#yoKU~V97zDA(TQx2q zVy*+Recrb5#q3zlj#B=qj&ENLf0zzFsKk|W$jaJ5^&ZKL&vL%thh{rpjDIfvdHB6- zv_&K?z@LwQA>##3|0$?^yoT|$WLwmUzmCEUByJ>e6RDd?++s;+Q!Oz5SPWYBZWm*o zy@#9klDd!7RrFW7smCv4ppV6VzLLV~0IO5EJ&n~tKAger*{sgu_B`@e@LxjYXL5TE z`Q>~pm;5yhRq?F~@*Bu+B)^u0)qE>VeiQl4Oom96|-9dF1)e)*&sP3h@hw7a) z4Y0V6#ltKfVeu%7hgdAFf+UU}Oy|9gi-{~JqKzkB(e`FBy97^Z&N4;%adDkWx$&_< z{doq_Y{FSi*w&Qk5(YxG?5-x*iKC&t^XL)K0=U$^dcEkpK2c$#eZ6Sh3sL#nSaUte=Q&~yg#Dn6#m8B9+$ ztT|dUi=a7g^R+QzsWoQvvBB1>NMd9}9tqRabQ6`IB8A2PjXpl(XE2p#(r66wOa{+n z)0o9GwtnK7az0bV_6o`yC~u_P)=z8?Q{F^*Gv%$6cT(O?c?acPlt(DZh zAU!m+?>PV@SNv) z?)(1zuHW^$u7FY4^NS}bl4P!NAl0SOk}FJA!0DuL`)DFPrdQ~77l&hsj3d%ZWFnDP zZ%~EKe@r$d&i&RMKC*=B8mjB4uH+xfi1brkPjv&;O;mSK-9mL6)m>BvsP3h@hw46> z8>t?ou%E&a3P&j%qi~2qm5kkdP?$!pDQ>!)yH4By;TTF}?7df`doPb96%uXb%>aXJU2`%_l1kPt4 zbCKRLmQU`DKxK}9vua@TJQyGo);ga|w$}XRoUp6?uS1en zPuKBuB~O=e($CZNJl(+4O+4Mf(=9w5;ORD=?&9f2p6=!89-i*wsX@Ne&v!=n&M4m* z<2yrqX9eF~$;v#A<&)v&vx?-MGjGrN&xF}p658{2>GQY@{4$(BOB}YCFD^2-pPEy`7n}Bq zH(OxzZd!kwH_s!@&c`5rCHjZ>Kgv>V%BFR7Tmg?WF&(p#B6_UDg*XzA%3D^dQz3iV z+}ZZBxiYyBe_N}!6F>^kwpP4%+Afbo!DWgh9WsyQxBtKflX>Sdzt9aV0f)2Yxc6@h z$#F}ITZ-Jf33tjCA(E=I`aSF6*;pQn<5@2sN~9`{>=des*`3AvGI*bl_a#$hZ-e($ z@Js8-d#r|IbsVc?x83HB)pM+YV@(|E;8+XC+Bg>ASQp0{Io8Xu9**_#%RzSavulK1 zqwE@E*ATm``GuyHFBD}3<*d($vI^+3_k(f`S1qo!7eQ#>&1IU5E*itRDv$f~dAC#4 zb2F&GQixe7wme4W?`)MAbd6eccnuln1C^sTtXc^HSq*JGWe<=e}wOU1?P-VOG8Y)pZliCM8CgkwN z8W}FJ0sV>i)9|I38sfqbslad3qAfNpDkx=j2?rfldRfw!vD(kUdJZ;lu!(~m9BkoW z8wa~M7~o(p2YWc!$BIS{4wBwa`UvTxq>qt4MEbNCretG_7!aac#Ew1G+X}L-ixA-7 zjbkGci?Eloc`RB+W@jtsrP=8I(cR^cZL~%;TSE%lu(qX;?`a*j%|UuzJS#2WCL&c^ zx-eVmIhUJdS+xL>19kUCt~8kc`*edv;nUrvd+a|habQLb~h3uOsaEh-! z2hs6tD~)OP$oMeh+l-e)*p8r;hHg}GgtV1Q)mdl@8 zUY1!oBmV?=S$Vc}tJWJ$H|eJ4nfS0!ptO~JXjU3)%g{%o`MQU%$8uX7U-$C$L~cvt z>nYrpW!xSsee6l*whUwSxF?f66;zh;^%9QOaI}u2l~k7Tbw5YzIoiO{CXRM+w1uN> z9PQ$0fTO(}?cr!2nT;GBB&(mS5wb?f8Y63ntb863rA-&t)=G4*3SUw&;>}t~x`mjs z@y$ntN*xzZ zGSO5$yRu{1uoor&5@E14)nz1LE>6*VN~tYjs)ngLrYe~#qxK3Du20o7)xcB}QyomT zFcn~`jj1lC8ky>4s)wmQ-ZMydKiwmAkJ3Fx_YmD~zGagUQAeJ%UU=`9uhzM|@MOWM z6FbWbuZ(Nu$mzcbFFfU^;pS5egj-n{EiZOW4!h_zxjVEbXOwWDh68mRsAO3g8Ga7b zbD)6(O&sXpKnn-jIMBs`00(+G(8GZ~mNjx+{Bf( zBKfOMe$~#ey7|>+zO;p3ZRLdlUfsr*hIwH-ukPfA9o(>+o0OPGkYjW6_j`;7>wPZn zk0mCK_j`GNA~9*aKZTeqDvJ5H3@Va|@lmmycV|*zMR=|(;e{GrsN;o7UMS#*S- z!fnrKxR>xmTxo=-7!l4~S@~ob`7hNRbC(ls<-f!Mt0^JTk^ibR3Sc!?7z@ip|7-;? zX@5B)U=scciGa;HyYk}T$;vv_rLG7w-?ZaB=jIDh{0>^gYH!i%x{Af+G*}g4b@hJo z9ZL{b?%^86y{@;AApX)HUV?b>N*e5LXfm>eMhaf>p{mBFqeR*IOv7S_tN)h027frD zZl-OqAR4XzN~MJb$*XAER8c&ZJbskVNf)cbSsl$cJ$y5kO>unF%Qq9*l*Ttx*i=kb z7O!ORijP;4*|ePh&g7K}j+XLh3D4H>Y#q;5BConf{l**g*#@3%;@J+KZQ=|Rv5PLLL)7iI_AFm=^RfBTWkFRJd(oVN$tNFWH z_N^sm9Wm>fw}F_A#B3r)cuOmHb#hlbcXe~uX7+92uC2@;pmZChwn?hPktR?MGv~DMKnxmkND2@hvor_wer&bgS(rGUCZ>Xg4Id6B82@|Q)%-%w#~>^sa~l$9tM zbP^UPDsXl>?Qu5vue^l!p-#Iq!IhW@)pt`@#M4zID~Gb#(|9y1J*>19sHj+m<5=ls zWg^3AtW04zi#f%t%wSG3(srI>*+g?}sYQHUcMa}3+?BXR+_hq2?t0t}xSMcy;BLVk zz}<$s3wI;#Ufeynb;1R>nISZ)d!l@y#eR9p6gWfN5$7+lFg9t{sf;WL!|~ z9Meud?&7b)X^p1aLw78D;^_9$oyeXvx>HOB_n|B{WU#@gi0%=vPEFr6g zENgL?QO3$E@cPM;(P0BwO=NYD)q*SzvjSvwk=2M?4zqg5vRYLi>gPivd}x#pjq#x& zK4g=9p-Ewq&nlvJ`i$A824AtcI)%0zysU)eG7>{4Fig@47BBUd;x9qf0mTx3yW8aQ zKFe%3v_N4R7erRm7TPvF3uh_AeLRNNC_WO;;<-GO#Nv4@PNgk@PcEP}oyFNKp3g^e z=v+vAp;6IEybRY87ON*{sX-^CqI0sGgNv99NlM;S%_nPFyq4B=w65o&4YY3LlbiTt zD{Y;$wbRy3+h!JTp=~Rl9AM)%HV*T_>84Su^SRsVv*o$?R5*VZ(mGQKL*a)?7}aUy zNJhArH6a=BYM)`zf6B7xe`2eL*VWKgN1Mfq-tf~_Pg?_RO|&^K;Q`tlqwq%B9HVgS zDg07DFOBfhC@+oi(hx80Wr@|XJY@BAZd}NejasLaH${`-Aw&6~gvw)C8Apb7ymF^; zi`8M1Nf@1M(TYtu*`m;Z#zErxi5nqql(;eC zhKO_XeW&~0wlz(K+M3SMeXn?+z+mGiZTG!$mIurE??wDt+J;h$sp8+>argZ}=}TO1 zDqJoln4$jnlM=QHBTNaM(mHJr7a`fYOevLu7AL=}qIxZ!b#F_lRrRmysSD?eE(R|; zxBdO&jd_N3KO8c7)OnDA?SPwK&t)o}Wl1cX$FfwK6WG6ifpnH-vur+TISi=Ax)gE$ zG{5e(+h{@+yQ|q>OW|6Y*U`M5{TpcB$i17mx0U8jqhs9MP4i~Tx6r(m{R8A|qk5R! z?bPhx-kpZ}b+0z@v-XSAF5Z2v{i49`7X@~|Py_ELGAXD)lWR!{i)vU@$D&FWm9fO` z7mMmy)WD)97ImvzonvA7N=G6lj7@J2G2TalIv8l zyWy=BJI}0iudqZfsWCXUo^y8eEFdB~*jFN;V~+LyJ0a0mYy9WB$kNX_txHu5a`vNq z6af~hjJwEGX$`ETyM3XNg}hDI!bOyjrF`C)Sq*f4(ak>Tt?lB2yLm{(!EnCn;;Ye| z^l&nkm*Y6;OQ`FIy?yQx%kzGCD&__m^diUO-A$3c4XR z-LgT}^s{D!HKVK~FuUWG`d>K#^N|B+gX*3!O?_Vs*v1MQBY zY%86ebhaC9WN$Z}np|?8E4JqAGjF1baVL|EBSQ3 z!NkIx$X`j2bH(LgF7+V`?s@0pi^r3MXC9tZ<5A^ZfH&O;7kEN#P)c3><#<<{V)Xh8 z02(?))7<+lL5{t5*r;|Jym|+ookpfc?ZAF95+h6uAFifR@#>c|w*q%5gC(TbkX}c+ zRdpM*0;K8nq&JY>M0yA5Eu;rXZzH{n^hVNqN$(-O5BDJ9{e+JYK1%o);X{P4z`xRT zYK$*7cxIUOB8(E}!EK(oDwijUxL5eI69(&${{KjLIue$cxh|7-0nHkF_J&k~vGo^M zF263|`Nb3!@>~%gTf}FT2kqv76KUizY-ek<6n*mz_s=Ew&-k~p{;Zzed%h9ZCX=m) zbzacl)9Lzj^WG>X<+e7LJjZ8k9#IM8rjjO~HMy;26E&YnS*rYn3;^whAoVY1U^eRjGmH_0I>^%*5Me?R^a{G<5C@DCZPl4l|NMcER(kRNP0 z|MO^uJPgG$6vvR4p+tt#7)oKtDjmHygZKJ)Z!$y6`DG^Wt>8aOI8w@&YB*BIkxJeu z<4b;y)N`bPBTXFX;7AKc+Bg#6NEb&MInv9K9**?!gFz1Ub7+J^qZ}IJ&=7|rSsy_| zGzV?7*q?hi7|Sbh9Q1NDk>8~8A^TZ+uiP=ZZ`!D~PvTjzcw6)=^o> zYh}Fdr?Q^P1}dAV?BGxfhuSz4pt6fYja2q>sE0#+6c3W!Pxc7eqhybfJw&z|FfDDs zr`4l~2DeoR3Fk2vS4OkP!=6}v7RMehKTG7(X>3m6)5Ux*i|!1%eRL=D>E-lg(p_PU zqMj<@vKm&`vDy-iCjG3gXLSRsn^@h!Wi4FR#${bx7GQNFt9!Yuhs*ldJViC*~nyOmX{IU`BSbx%R9=%kugdQXO>yKqT4!_sX3C7bbT{Fu_ zPy2m%MB2Sf#wvYP5+Nq%1(d!*CbnUXL<}i9U~pxfq5zAvzECgy?L9*|XuYRDV|ut~y-e$ylnt zuzJ@_?;*!{NDf4e7xW&|!Pq$YCI$04Ht96l*2TxPYF%#_r(&Xd^Ee>D{L;2a6a@Pe z6tDWEOd>#IFRSvIC(KzF)Y(Kt1v%$FGVLF&S&(kfPXF&kQedZHP=r|-K%;7+rbwsX zTziMpay}E`v1AX!UscW29(-Xwc>?@he4v>9%W1A)pp>Z+_Lngw3X|6Ph>I|&`r~xf zi3IpNl?x^2He1Q<`FF15W-Ei`&c+wcQWs6Ow)Mw$;oNI7slSynOujL14fe|{Az2e= zk)iU2+0xP}^)kEJ?>t|{JniXg3<4i%$!Y#e*c>Nfs;uf1JKPU#c_{OXG+bW8y`AIEbUd#K|@xJx^ z?+v_fBiC)>x>i1~1hbRRxAXaKKEIjIZQ=7<85!WexA8B-TqAYRos{mNRF>1b4D!D) zoWHT){3O+r)Id@bNwfO`lAOK(q0NmX4f0?=503EQC=ZVD;1CZ+ z1;xH@pGib?nxxJU`?6rI1G#Alh zlVwSMc^zWRg>NCtX1^$O>uujcD~!#7iW&j~eM?O(X~tvuGrW9>ZF&10K+bPJDd<=q4P z`!;?!%*)$3ypuu5AuY@{PCA?N?;$4*gc@hmFLQyMR5T~mwUvJ@vNKV5 zg1xoEG#?%1y;Q;^zBgkshUFO8Qv#S_m$PLlPih5Q#aOuk`YNr-+SW4whYh$c5_8yT z!$QfyIh+j_cfFPM&%0(=|GXsYA6w!5%M$+gv;j~V2mNo?14vBo6^yN<-1eIkxy??b zH9t?gY7`$(T5a{Pbt?}IuwJFZZLHtU2Y2w$P9ECDfK4>C8>$-RRn}8s zwVlh%l$6ZA5a|I2WfBo9ln5x0ezRLyyQ-#YLCAa8Mm4Hlr4<@ZzQ2ei<=m!wqsr{d z%fd-pX*328E##=pp$Ti`*ia{O~5LHHWUL2|+K4Gbzm!O8I zgK-pK7MV05L3`gc@l5I^>A@m`OKrku>ztf3`pP9z5P|2?CB<&T>Yq|g+(IY{Q2kor z?e6al4>8i+{LEs}XK?M#(ZEu`=3E{xT$?&OWtF`0r}&EHYYKDdD6{ z%X*w4=yCClqRQF*v(t7Z>=$DhdE; zLRv4U)n$Bwnx`9uoVtMix(ItxeRo1omoakM9|}a}QxlY$%rbYfD3^Yq8v(&WDT4s*KQ9Fm8HE#J(E zW|PNgD&7~zCNG;3xi5`PDcqOEFN#^0!7q}z&&My8vp17pR8UpQvn9M%!)tX$2478f z&(`yrpVu0At%=t=!G&M=3 zEjp|fK68;7?n2&U@1IGB2H+&TN;+&?qBK|>;_mm)cZzH$(M550#d%Oc&}IBs?~e>N z)Lic2@>n|KxZKOeL^{*BJcZ6IN{d;VL1{9bK1!D(=0j-(>a@DC1cBIx>NsQ@fp4@z z$A|nJYT!^4ha4O`V4-Y_V;>6P*sIRQv8|o)oIL9CQ77iINXG5qrH7jahcLx>A=KrM zYQW^?KQ5X!V8i2ZV`uwE7SyhFB(uuxH~ZGC)yV#s}_7`1g6T)NU2g19<} zXd$AFh%O==2-+dlxVb5c{V`0;B{H7sB&z38oyz(ICKfP}PIWfb^Vy%ngkuY3tB@y_ z8Um-Zf{V*hX8m7l4D;ujDo$2&Yb_sNOYJ&p*K_LzYBy55iP~0bJE?7_wwv0`RBxen zE4L1C>oB)&WA1k5?x1!jwY!X+h$peuGMFxrycunpBY zVOyJfu4!Wz4=p59ycX%Qz|zma4Maf7VvsDH_Yd7 z4zDldrd(>6{CoBu=#Bxq&a-xD$rMx|l!c%A4C9L45D>-Si;1fb(r7+`gv23{bNNBY&v%tab zbpOv}WG$xA21_D}L^%QH8X6V&X{o8AulC{^^Uul7+GRZ1S6@$unh0Fv+7wu7CsOhk zsy0W4XoW`7p-zN(M+-|!&4uN#lq}1mP;YY*KxR#uavRI&*6FwH*mO#!yO!M;cy#=yEq)+a3hC%Io!kHKE680k$#ShaAcGt zV;mXch}FUHX!+e^RuWA~B}ZqZtLJD9JFA%ToAXDNu8Yj*cayKvqN`>DOKt8lB0Oe! zddIBTvUqyO#M6@yy|uiT7X8aoq_>k!TJ$%~o^(}Zmh^arQ~9(<+0>NmSn1Z|t4TPes zN5J(h7YUmzGzvWC7Z=lR4MtBmj6S{38aiyLV$KEjS}Ka%?!r3e#iZyXTN_Z_R}v1=M)qPk zD4B@ERNR%bjW z!peBXf0n9AAmp&t_@={J*dSqNsJX7-#g#_kOtH;)_Qxgm)g zQaPExiF9tToBnn4`C1OIEwnN_1^jR^uNHD>iE-GJ7fG2tSE|&UT4cy(SFfhudJ3Pa z<}B8j_5mOVIkgBpOnNIeo@*bdiE%EBL`mPUmqlpU1UJ78(6* zm->0t-m3{NUi4CnCfNd(P#x{;3U|kA&(*|q@%}8Kt^BThmb;D2QR_6@)@s)20EA-c z2J;Cxa+X2G^Nt*rZORk8CX%GWytnSM*T*^E4R6~UXNKtKouoP*t##VSrqK@zH7hRl zsR#dZ!<7}w+9&>!it;Xg6V7jj)xxO&r`kBx#i>S4^>V6*Q++%> z$m9JyKEmUpJU+(bLp;9Al9U{1PQZl@$yO_b{mKMf=T_u_Fx#@No#m1-9Grcyz?39Z zrMg!TViC9K49oS;GDgC}4f-9Xf`v}Co_Ek@iLR(M%t6H$8QMUEdQ5ar?q_`O=c&FJB-ZE4brQWuv;{DdAKW<`ElH3Ro&*NaaRiSrA6&+`pD-^BABJm13eZ9Lz_^8udk<@p|-@8h2v zd47$)S6D`guw8R9Z;r!NRY?6K& zheFe1iJVU3bc&JSyRn$R$lyks58h~7NN%j)4I7#ss|m`l-BiZQSD@|S*cl3Jl3$Yu z+iV54HwL+}pBqQGag-a!xN(RZSFleJX`XS%d$@pm3%S?9A_PRJJ8})x3VW=2%z1$b zH#&8v70?!;a=#D~pAZs}I?hMw%tCSCc*tm5e9rL-BYy5F!Bu1VoMm`a5;`B5vlmwn zu0CU+=^8wTZ)TV}v!=s8o3AkS{zp49P13IU|aX9)5aC@zS(aP``f3> z7H{d0^)|G}RhXM$*7p26CkM(e+mTNfpE*RET&m9)>Oz(9`z#R*DPTwk;}0!@v6pQQ zS1^y9e3Bgk?c7-ci`@;V1I5y5#_ipxW_eHbIgB%cN>H6|x@Jgh z+_x3~fU(R_KlS*u(wE1GrWzM@u{G3|9*4(^cSe#Tz)d%2gn9=uOwY1z&Io&RhLsp! z*N8d;gu2e6Ui(`@B#nT_#WjX&$TSv>tKCL{mNq-xjaF`M z(vh39rqYpGB6f55dQ*v3N~I0%gW)vTQd)%Nbg7gUkz#RPc`_^Xv#*|g4eV=TUk6XL@I)I=1lZTb6OHWa z<%u4i=%a4%ENyM4&a3n6M5JPVT0?NPJ}FdI7%8rcNQpkB01`J7b=hVmf)Pxvq)F;v zGP_xm_K;rlneh zUD_|s$91{*286fGbqT>i3Sx~=Qi$wy4(5-NR!P5FD~g;V)`xC8yye=l~aNBMyGefiO{qr%U0eV=l@rNGzale4(>ARo7P4JOP;;f`t35itVwx(cgV`{ z5_-H^WJ4S1|0#tK)j$_<_il!-r&^QOCc^P~#>n+gg5D`m+Sw@_GUtV1z&}FEgC(@+ zEID~-gyVh~OL82J?_sj_JxnepR^H+n##lVrXH@s=tg(1rsX?tLYnZHKvXaR%=2*Us znlvXHm~3LQgUJ>q15CCt*~Mfdlf6v#Fxf}mAj$nCkB~e{@)*fOB=6#S5!jqAHd_{% zXT{3y5JV%)$`!1cR(hz6r8166FO`W@rcs$frFG({R9mZhT9Zv%>t8!n zb;MWl^)j;j#McwwKztMN9mKZ~-$r~F@d4r+iSH%8hxk6?2Z`?|euVf@;>U;|B7Oz) zRvOwsr{XT`MxgCLi-YDxG0Q5L(Ag*>PhJUn(jKsSko^^=VN*?-Z$@{DH-vCHLh*7s z(D&0g|63}|yzSN7>5rI3)kNUQquKV6DVUK6vp$6~;sJrHcFNqNZ(>YQcz--obBzxttsu!Kz#(ZrHL#oLWty#bCo~nOe)u>$rJ6 z;TyPlBVn5eYn`QhHMJ$EeC67PYnaIG%-PA!JGj~Iyjpoq>jsE^$IU_SfR-bsbb`=G zp#*k4^iN|8x`K;Q3;&-jHU#PG7aPzrLcLnQ3msG`&&{DdTBx+r6}w*l`) zeg`8hO(O9(1op1LoPfVvt%=!;OCrkB%~FiAlz(H@0m}r)HSQg7b9Lv1CCy{|PmZdO|MTTTjd}JgukYTL7<1)#pAiUI| z%9%A}){$u?Q!@Qz)|1&lW)qnmWVVpmMrIe80Wy2Z>>;zy2&ZHYa%Vqxj&SEFcaCxA z5O+#CSZ#OHIlESM9i%GYl3rKfp+bf#q=IvubzXdatrCuKki>!{8FUHtf^3uE!_gFY zD2QcA90gvMB(fxpf)tiy;TF#6!=22M4BS>|(Oto|Qa)ZnObs!0#3<=5WOI} zriqviVp@o4Bc_X(05QG9^bpfWcq1`q+qR0~aPjnG%>oNVdsQXTNwyLAJLO|L^xbgc zTx5kvykS-rILyidt0*7l!3+QRcpLCG89Oa+ z3*I)oU3dd{d-3+*wdkLB@GSIC%Zr0Ks9`qODp5FLp(=^;=1?(l4>z9^{Bd9(-Cznr zR1bB^scJ}f=7>mByXjX4-x7;jSZvd^H`FD%%X9`MU-A}FMLUuvv%$Hxp>Pp1wEjDC zRTgQ{#}_hxI?~W_7yrKY{VN!I+l6vxlTu|w$LvD%@41@Y`d&M%fGnxs#27Apfl8}x zYU8P&%e;BiCsChDeFAr;Q@?;aZRIg9hYv3_U7Us5kuB62y9&3BmmZP|*=pLWO_j5; zmV&i3uA^~1AKpOYMjAKK*h+mT_3hMmQ@@$|E!1!2&H+BWjd{b|xt)1CsoO!_^*pDN z=pG`YS?yu9XkfNE>)JS0TY<-QX*`(1x-2B{c(;$nWYcsYM}UG%8Y}ovDP<)*RYRi{ zc>H!5*UT1pe5!?~+IXsqr>wx^Q$0M@hxks7gWS{4JtN#R$~|M;GsHbB2vI;&gRwdo?Xn6%4luh-ddjzJU)ofhk+Jz?oaQ)^5uIALMXcT9I$ z(H^7LqL|!N?KRoolA>u@%8}CsD^=9kqjjx4lLvlAZ?(9}uJbT6!_=T5Z=kb{Swq$> zA|3fx8QEkhJjm`@V6QH>OEHWZpKV0v3snbH_y|VP`G&eYE&_8AM^#|88>Ns^2TdK$ zH*)R@q_2(QUAB7rGbz_evrfu&sa%`D&qA_wtLO7BN4Bnjj}>xoDbH(FS;ed6oLFS~ zSmm209sf7)go+FS3pB6WfXz0=mcDytO{x5_9? zj$2ZtOn-b;+_(;(O)-2Mc@rtM=Rxv)-p#0jriEHV6SsD7YYVrwach8E zySTNHTYI^+hg|7Wt&;Hg=H2Z z_HCPOA0s7gn^oN`sDHY~?S!dHqVxEu%?-7Q@4pPS+I?!(3=w-Z1{N4u#R$Ve=aY^vnPo?^VpNho&=6A;AlE~ve`4A${da^ zP=tkVUMz zEFG8FKI7Ny>&G{OZxr7cz9GZ$&Q%}1?(liIlW>djl#bi_HyH_t%ZbxvQdrwcOeZnz z#B>w08TS@qocLt=cAe2jc4yhS`pEW@m~R9$OqwrudokQ>chcQ1?v_gD#jE0oR&6oH zuyXvX%}S`|1%IuvLi5=r(Z7M|CGnz!aa_y^XO3M8{8Hx8k+?6BIFHgLl^vBRMRB{7 z9^J&vC0R0$j^1Oc(JW1r(xdbqvq_lGy;kfozlgP~c&ePAuck-3BGy#eh&@W%XB~;_ zNw#{AiJM4lH5QZ6?L>DIZN(m=w~{QgG`Ezn zu#9i4;Hj1TJdaoMjiA=s@I#p_GJYsI1RyPHt%DhHh@y%ynD1VJoi>@ITvlb(q&@SUbHe>sZxR z#4K_VuVxeJk6CijS3P_+mfkqN>gB76^rrFE6ncxfCyOgGxFVTeA6G2rzD%yD;O zKBLp*zA}Dp9d-_Dk(}9VVpmAhZ!)9VH97(U|yl|0@$;Z zTct9(iiC1%l!z%1T}_TXX+N-DtI2CATu0%0nm16mk-|+Bwo=&nrqOEh77Dl0Jix#( z{%!2v&XinM<+Z9_c%88bvpC0kh?Uu{iyy_}2~}7;w!-4c;`U-blfmtx!}+*Ji)^wiN)NlzJLs<8O!si&ubo+f%a=xL!RKu;SzUGy~4(@ReeJxa<3iRmY1 zgqTrc#)ugrW(5f=jVsE_qC`4Tgs|4jP3$dhh5~hMD@&z>8O?1TZi^*8j@!K4mPmXW zx1|uD#nECe_i;3t_zaF(i@>92Sp@ERXBL5vI+2?#3kL_-B`-@RlMKf?^Us`nw{qqHL~-ow3E_y zO1mlDOz9R%x3Y79Yq#;eVRmlkdm*JSf%fm0vQUwUa@{e^y>NG%)64d|HnJ(Iw1s$= z2s!d5c1(&d!lAgV&?*bbo_MKgrc-)lsLP6GCC?jz=1!f@n^?xBMnlk$}Uo>kp zWi($jYj$zFRDzY5M;ONwU8#46^Xq7mJS4@E8b^|sq(oBFNJ=5KnCr5*CWC8yT$4=d za(@(I(V*y=h}EKz;j(Z*T{3dJlDf> zeGH%9n^;M!!mU=ZL9FF;qG;y=uaw0*wnt+1SVnr9p5INf=;$J)TU<`RrS?+gU(Z#M zkc%tVv>rbuaWJb4CRB5+QhTf6GgZixpb`Q8g8kh*Bfwv<{|wAOVF9x+e@A~~u`zg( z^v9nSaalQ6Ey8CL@Efb>Jx>)NVRrTHyj1`TXls`Ft$y!rYbJ74{tRNRKA`$5)m&+T znnJnd%I{V7QVOV?$t!lHa7c$t=%(QUMI2Rart3Hh`LECdj^nL~^bA4b~XPH=ni6j_z_4pg`cMv2$2k>{jm2kQ?YYStVHm=$AT-Vutk!MwZ z{O4;5ZsnqMW}M2)g=@Rhg;j8A)O!m5~I#ozBPtzMak5`TQh@ zXB^~zDT`N`c;mi6mczn*6{uzn-!H?h8zkxoY18R=$Z zGb39V*~+&Ec*eSie0w_`J6XGfwTi3%q>4l<*twGbRL`9@L;(xJ_XNXEtLF)5^)MOD zq*Kp|B`S_dFO!Kxr7@X8R2KIZGwI{rWTG+*+c__jdn-sRC8vZy4S_l%Ss5rJ$4{W1 zKm&m$0v!Ze2(%ICA`l?ZOQ459ABl|w28rq?YJ{j!qQ;0CA}Zh5+z7}zuH9U*w2e#@ zb=<3BmSSmPN{XcwPKfv_?r5kPGhDH^78%o&Yc`d~ zRThx+T2k2$gqTGJMVyv+SQ1Nn97}AWxjl^~DYT1GCc|+{Dr>i-vbB~}_E0HtGeG0N zQcr;;mE9`ncqVQv&{)v%Y~1*vLE8IiAEAAe_A%OrXm{d&*~}?;QzL^=G6i5tE^@hP zG3kqG)u+}3w{;3ZNf9m{4(B1u^AQJFk(fbp-g2_5e^yJbjlsnIHYcQt)(gz{=8K#1 zyN%Jju8SfluOL1}3p&p#RO#vnRTJ8#tEM|maJ~IrX3(m^ zMHJNx+U(LJs-c6HhZ|@}u%Yg>o9(C5M=+mDxry7rar$)nI0M?t?34QGvMQz=Vp1ew z5vG4p$#OC?Sz_BLzFR_h4dr!| zS5jZbcm0&tQ{F&%6XhM0w@}_jd4TdR${Q)~rM!poK4Q-{uyZa-IEP)_Ac0Ngo;u*& zw1xAWi@y$8%y)+@=DV%Me7CijeL5pTb z5wTjImr$h7XmfCXx#>5N*tjPC&F9yN+O391JH^CJb!nm7#cyptR86=MG#0HUTX^c(PUW3x?Rgif$v?6fE z2A|qZwy6QoWg27*wxexGxvJhl*H?mU>Uxt>Vkp!R9u+uGs8cv2)XBBw46%_5OUSEv zvz$@*w#ymH>)mW~%GuVUSL>>icsA;TE9F1uXLPFDa^ldYDgK_bcL+y%%k4ulwo6H{ z@S`$!{UNy}{`vW~4-2GRRK#cn?%t!LjV8}SUO1awoQfqcjyx}UiR7h`mqMNm9S_^{ znPaYJvj~JG?CLmP765!a@xr0BBzm@UUGWKvDMrC z{p=rM|0w&%*gs^H93;}^i(yKoTQ`3>mz(1mNMc|f1F1N{^He$m*$m8QS&r!eOcS_d zgJ*$D8^r*xqUT&EWNH&rXPuCNPzZhVFcUU}4&PzGr70m2E10v=P$_hW3s-bB5F#vf z=Z1NJm=4@fkR$^_fBzc(F?Z&7vLU6<`0=roz0|gnqIonE+@my0Lx4`azE@9D{?<(tD zPpo!QMJ!Sb*loJVHRE_+>)JSo09yLkSSUrTvbZQnb8Db?( zE;Lf@ek&a#_%ykQFR!AsoTY0J{a)M0^Bms;8=fswT2KsA{3Ajj8}uT~swv z)k{?mRTd0CTaKx8C1nnuU)NE$gaVHR%(a?|?i}W7m0L`&;~HE>Fm;ynjik3!B02ZUF9$%~KMR@CcD9gkCmkqcWdRe~PZt@v zIqhW&FReF+6r!AqUceKDOe`W!EuSH%S)0@uP_r66Wgn`-07#bp4tX#o2c!ewuRa@ zYP+ZnP}@jtFSR|?_AxccKtBT`42&``#=sB*+RclsI_O2R?{t;~Q%^JQl$Wg|Vm%R7 zAoOfQ6W94jcP<0GheaDjdavd7c)doZz?+5^6R+j=_%jIe8A}(hb%+a-25(59KxJ6;4FbCNPE;g>C zQ7)E;lOADigTD*s&SI`z&Oimvl(J6HWsSulE71xtas^_r1OZ8bnGPly2x&6RFwSTm zB+yS_gup0)F#}k*haxwT*SFI;m=>s++3Klx?AE zD_0D#cN=?$*}I+h?&OLcTp_SJl0XDCO8H$zQ(du^2yCZAiT|{?kaRDV@+A=8L?+P{)RvM`g1ZKH9qvlpWu#a}irbI7 z0e2Jb4%{uc1Gw98cj0ct-HW>icOSKbJkZYrBRnw517kce!~+Gm3XOc3&qm`4Du$Hd z=9$W`!3h;5Dps_9B~M<$K+#Qx?mY*iTSJUsI&sdG%jh24%~veX=T#>eaUeUb>Y6ON zaDP&rp&_*MopP|>VP~jT2D^jkqU%EYrk72vBm&j*klt#uo1_Z;(X50j_SLV-o<8gZY@m>Z7y=I*Lvl#jL=y8mJaGq z#Bb@K{$eAp;`QN8Ha2hy8@e;`T5euO2?uI8P{)BvmX(p==RiFN8aU9zfesF|aG;F? zT^tB-pqB$Z9Oz?NBL~io>h~J_#7V9%S%J?k&fi)@z19k6tDO;b{6ju_ipXDMY9hjF z{&iaXM1jZbDLE?>nNCBLg9wPz?ubiwrmS(>y}+D9vLu578VQbk|iDGahbk49Q-d!4((% zY?>?XvRv`7*^a}Cd}N(=-oP>xRi4{%Sm#-HwFL}aPBNlrRMcL>VuvUaB0c^*p6jIM zn#6VUxGt653H*EkKTqenY$WAc<&YjjbjM#?y5mPJdG)$?#&!JpcAneGbvw9jH~*?@ zXSbDTOLV-|%{ ztTW2^PrI$GmW_4D!+LcKtL0wZ#_F!1hxO_nR`)Sy5O+WB5!|D=$8Znf7EZf@k6PZW zZdw7hmw1XT%a zTOUE7kWRAODAl}KEvh11Pdb~9GpBUJ2>U7s8Xs!|GQ!B>oX;i?7#SQZv+0@U5zX${ znzArm?YDmYesG*It0^2TbM3#2a#f%YdsI`IO{#E zkL8Xy)_Yl>$Q@~{PvMSYp2$MzbfJ&JWbUx_ox%#-rL@ne?|it7_Ot6dD(ddZ7*9GX6C$G9 zrax^5c@7a>jPz8}6UY@2U3Bzpq8x>MYf}{~bs(X>)#TM;Sm>65o@XiOxtqvsC9#vl zb`rZuv=sEjt>g_*H_YTV0^7NL2e~_qnv*bui8UtH(sJh#%&Vi)q2`($AyM(Ljg3uR z>|BBIX$8i%9A@fbHZWF2?DT9wcy)GMC@>C1#iy+x{ONv9k8paF(_@?-GSO77n-83; z#OzBjT8OjwBm(Y2bHu;e@|^}oJ% zjzRE69#4i|6X9$b`cY^Vy~@K?u{<2dRbH-2N`6vCsh{ojY;RzD6Wcr3-oo|(+uPXQ#r8(F_p-f*?R}IC@<>0A zjPS@PkBsri5Rd4xDkD=g?%aWHUXNl@%hb#TN~=>UX)_k6N!u)wXBWD^UBk!iTKAiG zyiBP&Hon`4&izmeW)#`tpNn}e{&|ReE&yRB`8+#^zc|ZTe%?Xc582?&*q5^uM_Wbnod7{6pVRCE$xpe6CbT z;rB9`kLOdhn18UiqFQBRwcw~}v54P)aOc zic$|9VZIe)lRuhWg%nm@f4RX}UUUxL9<~I0%IzyxFQn5^^|_41%juL#k3<5Ca3qnV zM9vXOK#7d=&QfI$odG?0N=iOardfVm^CjM_&tXZX-OnE?;Et!`&&EF=e~w9Y%^6;d z1YIRJB*~zIp|^UWh)>vqF&UHdhxB3{hJEG7^&?#)-DBdIg?>fJtUuhc4s?B;w^c}a z(P`QzoGed&ONpM+WT|&Lw~FQD2d}a{$U=KyVxH*E3DfHr640N!oPfF)t>N9|^f5cx ziai)LTdBR#9Jzi)2NpW)zt87X5%;J$!ugm=IrF*3IWzXdJ}$W1dGTIz5r6AkLA|HC za;z#>@E5g&=98zBS;WiErL>>rab3j4JX&N{U7g{y(BIX?Iw|FZ8HaR2bJL#ESuc}v zmo&SkU#7pShD!UVr|06FKxuP*|7*Et|sO?Xiv9Ga0F+-X5C{PwPYVhd+n?&*Kb) zX$*b2^nIkh-1@pqUn}%AM_=Xo3fI>feVNz1OJC-9t_Y4*8l|^Kt-j39*Xql>J`jA| zpwYbVCViRLwdu?Je!ITR>$-xEyMvE=gO9fa$3Bhbefxut2Q-@B8`76K#*YLa|4nfG zs7CYt9}7OdKR7-R96zDayx-sJ%e?O4;P?;0@sZ&8DUIfJp9wzxY;b%uI35U&=9HTE z`FwEvLU8<|M)Ujs7<~L#@bQ;5n)C3r;PZzyn$PouzT))tZ~8L7_rHSUvl?Uc^+SE7 z>FYIpna^FQKWeU1n@02c4vobcZ_%j#nGBBmg5#~h@ivX-_3sZpz9TsPW$^jCg5y0J z&2fED<8qB(*JzIWo57#|i$?SJj%hTndtIZs&Zjjl(Ri8uhH$$VIA}jdV7aVgnn)lhL(Oj<^gU^o##|e$*c=l;rrtwR`=O5E(UjH+V=I{M? z@cCb8^y={mjpls|baHbvuG46aW4%W6`UZ{W=hp=v@6u@A@9#D0SNXI?^ZL(fG_O0N zaj{0B=l1h2(`bIaLZf-V5{>5bm1#7u-xeJ2(wLyf_h~f0|4og0E1uS9uHPFP&HJ3v zXs*L$y13@|J2ggW?AK`Ce?X&o|6z^hbsx}Z&dY~2n)9NHkA2-Yg5y7HH1GQ@jpqG+ z6MXz?@Uc&CZl2!|9Cv9n?{~dM^Y``!$3NF-&WECId%SAvv_C%(eEv%s&EI(}`24}( z_~qdEmEic*;CLuFel0j24vwmC+V`E(Sg7~=S@7|H2gjdlG=Jxp!BK`d_IO_j{`~*a zXztIfXy<*hgQG7v<^;#w;J7e2=4mvadr|PQNK5uO7Hc%e(Gq;z8XVh#V|#Gy2#%e> zu`4)s2ge?b=D2%Yf{%9w$163O z&vSL~@w+ve_q`_g{I$WyyMjO89ejSTM%{wk9Q^q$8qIzBevRgSxI?3P-@Af8zbE+k zgTe758qMqeN~8I`j|Ct9AHnfHjpp}1uF>4bp9ntx$>8(<5F9@p93Rzaj{9>O&HH{n zIDR2Geo>=&zsEG1*L^wo{8xg{e=Rsp1)qN+`1nbU=5zjQ@cE~LXTj8yx>V z`19vAn!j^Iqxtl}`KjAYNlF^|1B zeM?0NNkTRal1fpc6lH`YQWT|Ogo-4iDKj(w$MbqWf4Bed`|G-&*Xx?^>pec7563xL zXJN<1EWaQq953Ic8tThBA7|rH<5qNB#a2a)SIuz^Tif|Mj_cWmmQPY)ye5{Pauwnh zsPS6bR<^b4+d6J%Q*3+N!KR|t+sScf+r@T8-G@`KGOls{9s90bYuDNL?E7}T-C#G` zO_pzl2*bUmUFPz_N_o1%0{q|c_`va~&h`O$i zpq|f}az^XRjEZYGu4!x8+Ng1pQRCIe$~e^Va68iShgxC0C8+cHqFw6xmmR-im!Zbn zYpKsN?ad{h8=^l6~CyDX8(L zIX@kBJWtzM&d;`UEWffYtY;qTd~8MS-)YDBc(bPKuqrCw6E$vcRQso$UvH12)_D@u z?iA`e;@c_1`^0-t*Fzu2vr+4wj~ag~^42A0m*c-tIz>b@y|ge>M^72iSqG=bzz*^$fEkTtCu|vZL*N zsO$7$$7Ag{)c!4Zyu!YYx?jI?ydQP^-`MX^>*TNO!}<<8f5h=od(8ge`k$~G{c;tI z#>;~`e!e>;n9t^SeL-6obzj}(xFo7yDaU-jcvxSojdOi@$ML9n)12>)T7NIs_i?_j z^8=h8gxZHWuAl4te8&syLg$}FJzqX_ew*{#?GDtuyIjwAe}r}Kwx6S}ze|pwx8R*_Dj@per5ODukAOe@xHSMoj>IGdwbOR zWA+F8BkFihpvF1r{4b7wb$r^Mv1jc$RKMRH|6%{Mf7!oL?f!9m!CthN>}7k!UbX+) zYxcUmVQ<=7_O|`c-mx)-qy6MZKZJcvZ!=i_f-|f$GwS+Da$LjKvUO~-t#2FJMyUH~ zxZ{zi^Ek@!efEAk#y(`n+DGhoJHbvujrX{nY@fig~V+^(>%+c)e=`=(umI!|vo ze%r3G@3?*~>bbtr`Aw+(I_dgT&i`sp+cWm8J!gNjzuQ0TpY|{Nw>^*A-=amL*Rv9+ z{U~Wmp^l@B##;I-jZs-u##j5lh zh8lMS>Uq2bHSSBOabHEf&TmJx+ksmDPE@;39e?KfJ*d}(FP;C&?zdl~URST9`rmT? zw*Alfbo^nc=FfyWe>qU?b7L9~L9J&PYCXg42s;wXlb`Q+0hS_8`6=^*TKcHUD^2yT|MV)H){F$*6TtMYW&qJiq=p{~Wd6>yB^On^=bYU3W$6Dv270zc7uC z$F@SPqXX)AJK3(N^>@Q?T+a8x?Bs{IeyH;!Q0+!x8Jz8SE{5~&_yyEFOHt#$SiMZG^f=K3G(kEn4@pxXV4dLNRHi(dJH$fGEx66U~KsQGH!I;eK_EI$A- z)Zc@8ehqUx+>XF-e2zyu{-5Lf9gjhsr=_U(VY^)asr}6L=TY-tv{&pk)H<)Dj_W_i zcTn^5&*VbCjHq^*Q28vDpR*eN{Hea{8`y@<-;dg-mr(b^a@Vgwjq`@%mG(`$%C5F= zq1vx;{Ep+bsPTVv{wI6foG&6W%KmCk+cWm8J!gNje4B3Ahd=C}sPX@HeBSbt zokP0|_M*LHFWW1q{{K3@hB{9-u@`pZ#X_r#&N1J!;P>im7~c%S9BS%&&= zQR94v>VMGjA=e*4Jr90#{wLIZ%J(US_Gg?wi<;+8?1oMFP^o?`P~*2mt*4Dmv8kwe zJE7Wjwq2a>hC1H&oPQtnoH=C+mWlcownb5|r>#)qwZ=qz1a&>Uj#}qxRQ+4_ZMz1w z?sawpYJHpRX4Lh%9o7G1RQp|a59&DgqSkQ()$XRfh3cQaZ1g)W8lYwvsqRJ)FjJK4^*i|uN=*)-JiV=`(TZ#n)B zHQqr?hllK8=Z`o(>i7p#|ID$``mM*66UXrs_%}<&v3lK^&9Ob`vIn>-4@h3&N_e2{)W0< zo5e-@-wM^f4QiboQODg0bseTT?v7cB`=efG=3rm^-SvN92I9XRpSS;DZ}RQRNAt8t z^?wX?-j+N6x?PEypYPHM>*8O8gmtZR{yoe@{U+3YouoyYz58`OCGr0I~q zg=)`F6b_%S%CPwww=60jXX8=tL-^5`(YjE_UmLaG15oV;yMCx0?))g!xcuzP;C)zw z_*KWR+2yEl-auW~d{b{|f5;xT-&=l+b_{RTVlJZkT|w>p4a<)}3;p$`MDwS!d?#tl zUBo4^7It#JGwS}Bg4(yK&Oc?Rq2_to@l4ct*Oo!eb@EtQ2TMh@kz)0G}~~zg;4G9rO-HyQR6ms+zjQfu z6T8cPYCp5P?H=U+V=hu?yvwNTBR7*O&WpP4nxgiJ9|9a~Zd=%vsQn&?TtYFgIKK>a z9^b$$xCV8-978^e##}({-xbvOS5fm`b9~+2KpppO$NxD_$Hk=av!MF(Q}BY>EWdRm z#5pYASr_75Hn+`#8lUge4C56=t)sZ}B~jy-LhV;;$8Bs|+s>w-j;o{NPN?y^*lw7Q zc$n*lqxNsH;}`4_`=VWnv9$XLHQvY0?{NHy<6WrZ+3k1_^8YcHDb(+(^Z(jw&fh>i z5BRpw@ck=!I9Y0+4|8K_)H>T+em_Xqm&Z}s&+Bc*8L}K8QK-apzZK9^%cY>uU?Xy9{|@Rnvhn6z>*b%A z2Xk1yg)+3u6T8du?^eS)_MndA3+MMb|CQtY_G|kMs{MD44>&%A zI<6zmA4MJC3Fm)7{>VD!U)Nu=*X<2^)84ZDSgEj||DmqGiq)g*G!eDWRc$q!WUJd6 zsO!2e>UwSFd~@5vwzREmYt(VJMfFd0zN77AJEPilb==KycgHak_hYg40T^!c6`NNwg1{{ zsP*1-e9PXp|JgfMZw7Sz@K3yg{FJI-2FtJA3hUvAT7-NSo7M6g(?UMG&0%xeT$Ue_ z8`|Zu{0fT@=d<~30b9@(vi!J<(4L=VA1rE%q4w)8$0ck@)OA(XajY$egUC;JJi|V1 zXWCh)eVprfo}KUfGxmAs7dc*HU$VK-*o;h`;J|QIxp|p_w9OA|Ba3} z*$?by*Kc+Fq2rGnZ?_-Y9j^bxerk8SevjiX>^}RI{Tj8-Z|t|IeLHBscm9YyYLD3; z?2oA9I*#gp()nNPDd*2PK8tGqoAZC7&i6mAzhE!gOQ`l&9A8DvbKTx@{nda>U#PcHO>X>gYEf{s(c5VYC9qyF=HM>wV!04K>j~wBZcPs0Q2G= z)StVQ<3p+D?}S?SMASS-F&1y4`tx%|Lfi@K6VFABHy^d01*mzSMczuq>_WXh@pCW2 z`@ru}?T(=O9kV~8K0lpuJ^wZ|)St2E?C+@cwx}D8+ZI_`%oNo7$~ma<=VDlwU5NVg ztUpofJC8c9e96(jN$G}KXD`%!(+|~ufE{FqpkDVzIlj-{Z~5gl;d9TEsC7)WPuXd9 zx}9O4M$I=1hvP-mdj3V7m%HmlqKV7Sk8G#bTbv?)Vp~{dv@NQoKpD{?e%PR~}U#kFD^2 z)b;g>{R-0&??;Vychl%O(hGGx&O{ymTvWSxc0TqeK99NZmh-nUJ@FmKG0mcW=}_ZU z#r`-S^*QGS9D(VYNBuHj24a5LZ@AC?=llbhk^IBRBQ|Cg_QdopqJI3qoG@N4)Nu?! zU2pfH#(Tg%gj(NN?1uYL$MvQC%JpA6{>FZ5zq1GIL3;?>F;3Z*(Ri`8oQ<>PQO8jc zwT{X*!S#u#^(LV{=hk<=fo+JH$TxA^)Nw1+cx^1d-aK4SYf;Cy&c0{gM_n&Jq57S0 zoSlnA?Q>u}R(D*(*0i-Sjruu`=h}I8K4ztUvEvu)64dd%ggTDboL_ENpw{ySs@*E* zSKGJj+jb4=^WkRHb@&;U!c(sQ)%gpk@h&@m1=TNI>nP8U4-NHMP|v?csMpyMsC{}4 zwJ*=xMRqZ2y-Vy;=U+md=T}kv_c{M1s{MY{dcH+nuNB)w*Uwl~{!vuB#~e>Wjk5~% z{Mmx#@i=D2U$HMXX&XJyTBG{6MUB_qc67co>iP79<0nz)d$se2QOEl|mcUC`8B1}I zYrZ(t`-d*bNBo#+sNv@9+*Hp9ks4G zsC6vBqPPn6{_i;IJe)+meih|KS@B({c}idoj7QB=(N=bS6`O!XsBeZEX9DW_TZ4K% z$lNj7k0jK3>Y&C;My;!%^G#9nHgntt^}6ynYF$$>3ExMxTaU4L2#e!+=l?;Ce-SnQ zRm_W-J4OAnp!TPx<65YF?uY6(0JY9xsPpp)X2X409dDz~d-~4N--Faby?^1?5{1{z z_i!ZfU0tGfWiS_U0#?BuH~_ceKrGQUnzt0{xcH&&VIBO!f$;p8jJ3#bz`1dpG37g<@i_EpLKi= zHSgaz6ua;ur2c8Bal2z8@~ewNekN-Da~&^0jsJ}Ei%`$Cov7o!iW>hG*1)PfoHZ`L zxIUO(~Dwe3;uQ*9^I{&sfU)p0k+-BI)PMm-;fIUa?&Paa0i_Xy_3X{hUJmh*E_ z^UX)iv%oHN{#pAxYMd8bzr^{asOw`l4#CPiWHep^YP>{S)mF1f$R!l>H0pI?K5Cq; zsQ%kf^L=bTK^^CAtcF)nHpxHI#x&^TF9?fFegVf;a;afhP%53|Ej`*I&@ zo-wHY54rwf$Kz1_$D^J}N@uR3bK??tt5ikh#P>sz3n1FvI!Jb}8O z^7o0Jt4%SqNA+)sT2E`o?Hsp9wd-J0QTNSc*H5uiQR7TU-NzrI_KDvO8pES3rWlLS zc_@Q=o#xj`hjA;~O0G|`by4f7=lc4{7Q`%a{srfk*ca_m4A+a}J*ai0^$6Ks{G)p!(l-JwLNDJpYTM_T?_rc}hV&FM6Z)XEtgbn^5y^wp;BsRR510 ze{6T!U8s3?quTAUpW836BKeDsFQMkSg1Wx0V}8uhKg#DqjguQ|ViVN$*bbbrEHP17sc8gK%Ua(70^-Jx`sQvsB zwI5%j+J9reMa_T9@om)oQfWXmP8HNVNw&80buk_JWLwYHN6p{R@jbSYz1KFjO;G1y zl;hF%KGge+#g1P!M zFasV&t?PTth(Dm(|AacOUs3g^?HSjfbNrkA9d(`x4vEGsg4+L<*Z~(gzXUbji;iDL z&9@Boy!aOL;V-D?Wf9&?slJ%K3$^Z2sBua=Ulz3=?VL}+?8Iq~yQ7}3{ZZo$M2$1V z^+WA2%t(HeEKpxpKU!nHppz9AIrz)oIuxQ+RsCCuH;kW|(V+I1{Gh!yphI&6( z2eqDLTOYF!H^Cg3g6h{EvtgR!?x=n}QP<5n%#53y-)y&{`t3p;*B;b;`48&&FQLY{ z;`-~T_5J6(-pp(Mbg2HB9A`%L=eLZ8`s}Fds}Ay(K4v!Rb#=SzKSr&y(8%bzZj5on zLs0V%!>o9}<1wgtAH=%&7V3F-6xHq|YMo~=8=gnC{|B`XS5f0$L#_Lk#^*RZ4{+@Dv7HXaIQR`mp{L83yyn>bS3&(ry zK2*PNP{;8d>i)<$I@* zMW4%tqT;cr^SBB%&T7be#FYDAbi9>O>q$WMPek=k!UXJ#I?h4P z4@I>bhI#Q3RR8hLKZd;Jh&h5+V}V|(ff&BsPi@#bsY1t z04_(3yBam#Td3=39VX#PRQpq?_2zysdY}Ig4kA8`+3{yoyI)Y(`5Dylqb9p9nWaR9ZBqo{Fzz+^1=aC96kFp>CSRQs`Zoa2V#eD(LAZB{#{Y)N^`zD>OAyET~BkJpNDF< z0Cjwe9WQbHi*_mMI=O*b$8FR+=^u&uXT<)*gHiL0M(xjosC|6devX=NFXqI9eB&?=PQ(1T7&Xre7>C=i zBpyYzKY==qQ>b>o+SB%oJ&S7hhvPp{>p5>P+AH=NYP{=?Z#lkg|3e*T%wy4YoQP^) z6_rmy%~uOGPhH0i95=E}Q2m;s`ZY)OYi(0p-`;jWwd?5muBhvwr|WyUzK`R+wx9C@ z91paE>|oS>-q6yU;#kpS91S*0Bind|QS(A8)vRrQDtgV#?#uzH~+%PdC(fY1j?lL7nF#&L748#L1JR zzgJ2_jo$;+uP17pKG++#U_RW78s`dX-Pi4HRKNdF*F}~mqW;-Y_kBTBeIZ-e7O_Q9 z*F&7+@~C-I9d|^{*A>Ls4ZrT z+q+QxOQNpBa?Zy&e>YYj-yZe6?CSb%HqCaoJ#0_g3pIWp+s_Vg{XoZq9S=dRW0d33 z_CC}&_d9;T@q>;ZLY?1njvqmtrzxm@Q(ZsZ@zaiHV>;^R*tw|rpGCbt_{i}t)Oq?F zHQqn=BI^1r_hi(sBBmp*WGkcY`)R1xxviKUx7qF3mN?tg=sqoqjfm4w<8(*udq33q zAB5#_I+ny0sQYOZs{Lv#hhIAW3UwXbu<=ht_eXQALw+Kv-z4mXM^NMagj(kb%!sG3 zBIcYH)#pRi7eMtdh`N58I&Ox#-#cP%?B{%c%uDe;761ILD9JM^WeTN!07_ zEY$t~GphYBsP&yet>Y}}JmsGr#RX9HMNs`qqvnl8t+yj;oX)l@YMgGUc0HW$<$Q0) zeO*5QHU1FS4|V-;$0Hn%LXG!7ER0XNewv+bXV|ChOgqcYwsY)UI}bJfLi-%*xE8s7 zG3x#LF4S}HAQs2Ju^rZ%5yf3FGjUJUcztYt=Z9hz^7oNppn&g*BW_PcQ~R+<;RU+Ry_53mDK{f5}#&X2Go?I_f7 z+-L8%V^GI6&Q7pTpsw=`sPR9rTT$a|L#^W@%#M375wBofOqd_FtBUoBM>-yj>UW?0 zpS|DpV;nzdA40v3twNpG1I`~rt>dsgf?DSfj(>9eGsconzaUy)HPrk`sQao8R>h&H zeHevRa51Xg3#jYvCCrO!uo!-ZdS6#|VKh!WYMgG4d!zdI!6clA>h~tYz!cPwh(-a@rokNvU0v(a_l6h{%i z>-aco|4w28=6)_}cMn!4egL(O2T||aSK+;Q4)4LcpO4P-0Ms~xQR^LoS@Ax{|HIM5 z#~lBFTJH(e_$QtJ#h!BhG-}*)j(XS5gB%Y*?cW0XA?m*Q9X0-W?18Ob zjK*z^8n3P6b~eSfN8PWFIi7%Zh~GzD$0wZs8T%18S{jYl7`2Ykj{k=`-uqF`c`8`v7%5KE!zZ#qk+b|8uDE|3Iy$@JrGBB~a@riRxb# zb7NJE#g5n+Uq`ij12x{8*b~#e9JMQls*l5D?Blqv?T6|&zz(uQQ0p3wWpSqSv+Z2h zFL3;feGV(pe!JrxsQGuIj_*%fbN>!e_ZSOb(n+rL)5ruoj-?a{|D+iEcR-2f0aVr z7j04X?Hx}*tz#lq#5Yj!O8X}2{#@hu9s4fUBYzI_;dRt~6Z2X$eg@Py8BzO_8Fhc< zbetQtpM@P4wZ*YM`L3wzX|nTEFdgxecB=E!P{;GM^D~{FZRfgv0czZRsQc<`)bk?q z^62<-U@UQhU@>L+Smnq;ab%E>+E~>ebhQO*iFuVfVw_UIsO$h5}!jI&n47#S>}ys zo^Gh|(=Y?}#L74gHU13eXQ9U3gnGXIUw%}( zLa6&L4*TI$$IrO_dDMD#pw_t)GvRJb!hf+3c6l>eZ#UcB_C(Fo2i3nXs{bI=z6^7I zII7(!)c(BS{1WG1a{RJ=#V)h2+SlxI)c(Eh_zk<#zG+w4)%Gpa@gA}m6@Ey&pN{_*Z+{p0Q_9$MGAgebLpCEwLu?1k8p{p{|3In1YFKMc<#_ z8T%5yhq@ngyd6DXnxWS70P6V1U23R< z*4+=)ZXoJH#%=cQ0p&-n!mW?5~zM<9LJ)@osMcZ19d(Yxc(XJ zPka$|Jf+q~e|}yGHGUPFi0WU}Rzp3X8@s-#ZH@`#A9Vb%9fx|K_66R9S=L4K)xZJ7 z&tX=43AO%LQTwpMuEasa+1`utIZ^A$Wpks>O94#8#?CjvQpEio4?rE)Ak_FnQS*(& zYWN~*oMotXuh|t?nRq{H-mjhi*70}tfIW!X=bx}0R(wAiuQIBC6`O#iiQ73&vF%ao z>u9^6*3->#568V6_q791>zspC@k8ggJN^qb|KF%~#nwkQL+wK=RDEmId~I!t^X(m{ z+D^`QcHGsbIo};M&s4`x*=eZpXE=V^&UAjZ<2k7Fu@JSs=TX<`PSpLi2esbMQP0Qsj+;4dVOu%h z+HqUd^S2Y~eZ)JM12^L!ylZ1LUP;varBL_B-KgWP;`&6_SH*7Rr(r%^g!=q=9<}a^ zn1tmvMdQVx-tYB7?c39+cC)b-?!Zd;J8J$vumTqNAX--;)IJtN-CuQVS5*6MsPTHB zuEVEM$M>x3pTls!quMRA%P~9g8q_%NU{2hE+TRaR?YG;VsCJ*Y{!`StKF4r9IKJ-s zo2b{J?wh0Qst>CD0Ms}Gu|Ix-tuXtR=zVf?)H*t%?(3eYetl8>`q}=deO~DJ8Ps`R zf_g6PasG3xPJ9D(f0W-EnTopJyQ0?rBx?Mr_9^GzL#<;gYCk@5{dQFUU8w!~%=z7@ zef`Gqx2Sa;!HSsf!>D}*)cGun8s~1*ebEWEj?T7=?TXrm9=4D3eQiI~`UawoXFlq9 zx1!d!4YiJ4sORq`RQs#;I%?h3)&3^xd?b7ny&sv4@xNlX)^?}`rn(sr*gL@tCbNzn%tv!fww7Z5W*nE3* zykk-0K8hM|ynPIH9led3{~auVJ5cxkZq)ksx&A9u|NZuB=fAZFoIhv}*~3_depgZR zT*Jng{Bac5M_uc+ps3_KaMY;`d>nw z&$2tB^V|+~eWjwFAH7iLe>(QV)2Qn+-_GcHQVa(YPe83>B5K~rI0%1n{uFAy)0h{p zpys)bYJbc1|Do=ite-^toePT)$6;H%AGO|>QRig^>UsAarpJSr4i8}^yn`A){jTW! zZ#*ilWD`*1K8or$9<|RaQP=T$)H*-F47e3F?+(=U@EK~}J(vOaqQ=?h{8#pC=f6Si z=S?h#c|MKW=e7Az;}&*Y1Tzp9cYK#Eftt4z>V7Vd>Q@OfVj`+vlJm8luZQZ_!1ax6 z6V$q!y1u#N7Pcj7Kf1WSoAYVdh5Xx?8@IUrL)ULZ9q(Dk=P)DjpQ!uzCTgAkIiLQs zXdM|)`<%^jcAEoxk{^N^XN2=3?I`E(cl>}IgSsA;qK^M%)V!}^EPjHzF2BP%m~D5o zpSe-{k_S~^8r8q7^RbwTINtSjT%YXvdN`Q+S5WI+j=Fxo!P0mhHU2;Lg1v~P$miV? z)#pR?FN9imQRj;}UlO&h($1H$Wt}gFIzLIyS4Tbn2cpIuirSwAu3v~6?^(ys+2>Ku z$=#S4zeGLf@1VxX@Okw2Q~gl=2cV8`pdEy|9_FErW1;iUp!zRD^?L#P<2A=OP~+Uh z5?JJms9iD4N?g`)Ia?m}oa~P}u31HX1q z??$aZ-c~@JuPUf{W;#F1`FW1#+Xa}7c1s+;XqVzW-r0|?^jUkE%RN}uPi1K zcR;o4iq&xjYTTzWA1*tkHrs1&+!I0h z7UgqeZsHP-OW|PRCsFgRMa{d;zK0rbz2gn2^=!suynvebU)1@^_(Rk`6RKS{$JtTi zwBS&a{%f(eb)KsQ1dUwR(JwyVE&(?@e88PPcc-x5~%$x z>3l5exGSROPjY>A)cg%l{TkUOsPp<5cEB%C*Hz;2XufKwed~ql*B3QkKj&vTo{c*G zxv1k^hy(GG>o40YuD|a125S8BC!*u3gc_#`YMuntywy<0Rmb(osCgQ?{$8w4Ji+yo zoPPq*H&E-iX>U3IpW{0==I3ag8Bp_ON1dlUsQ!7e z64rBEA9Y;!*v6=JG)K+b64kGjZH=XfhoS06pz23rX`G45&&GcEJL+|)_{pfuwk_&9e-yR83HEWe!cf0j9@iFc&Vv0T^>CdVVFN*3kfm;R@`A*PXwG>4hU@?w9rZ6|OQY6X)|Rv7F^+s|OvFbp13rcs@o`kYCs5bJJE(QN zi<;*s>U^AV{%7n#oO~v_{$9W|;`69}|JVySn7HfN=+7~xpx#Fu#@<-{T(pi_sPX2Z zUKjQ_zZbQ>{it={!mOC_x9IgU8Fii(<8Zu#*)Z$x(YQIV3UM9OIQ3EMYk+z`mx4O( z4yfav==w?aanwFd!J4?y@n%%Nt*CXKL*1{L|A@xVg4(z0sCjEUUkCL%KN>sZ$Efvw zj@j`$)OB_OD`B=jqw%t%&U-Qr#bu~Nu*R#_5Nda4`1APf`2257qx`Y=Alb@%N$NVB&?Sb}wL0 zyoh?AU+zM*pA}K_RYuKM1$Euj#`4$;HGV(W_jf!P3y~l1coN1EFGG#qlu?jXoo%bfF`(+%e-J_^^#-sLeI_mtaL-k+p`VDp? zYThlFh-Xples}#JsB!;7wYz{?Z>dXB9E+N#Dym%)>iP6EYP?NY0KdQ-co4PjW2oyP z)8%NrnQa!E6?0Nw5Y@go#$p4kh(l24eI!=H7g6he+4Z|o`>@A;ZofeF+mCv_9Y(GD zh&_ht_XBF5vs{Vdtf+pu9Ot%qY+lqj`BD2+*!d#1C~AFoIWB=Zj^>VA*p{eqT03rI z+oI-Ab=(m(Pglp?P~-P-zK`>LZ9mlU%yv8nb^U$lc$@3bq0UQztI=^6MD@EDHGWgu z0(Bicgj(-d)V__gk2pWx@nd#^^OGDu?)VA&q8ogZaKqn;0A9gnk**hf+0PC%_=lJk$-$*BE! z*YR4^aUVn7w^^@6?;rZ0`u9UUM`ohNor5~gxu|t4a=aMTehI4GOQ`4U3fI5x`jw8~ zbiCT}TlQ@nNWWayqjB=0#?5aFqUJAT3!~O|FKRulu`G^6?c@JY>luSOzGbNQ_uEn9 ze2f}@C+a-@h1!pzH=_O}Q1zv-1lDu@9#sEEsQE{r+Koc>Uxd0(cG-Vie-X8=tEm0C zjT+}aEQ|$j`uI@isTpeA7S6ZCV#NKi7C!I%BD)xMyf31z*Vi!)KSv$+S=4yHp^mrE zt!Tc&sONb()OB0I`HHCVs-V_g4b{Io4#ej$H!errUvIg74XXV*)P1@Mb(|ld#@p)p z?Wp_c3)k<(Jj6#GAH$)<_uh`q>i}#={0?focTwwEhg$bWyVdz^sCDdc{0VCQ&+O-@ zalWv7u^{nr)czLuFB-oP)+J6s^-o3h>u5Wn&i7>3KZ)A^IjHr`L!IyEu_k_jweb#W z-5Kvh??Y;##;uKMI2YA_zFmk-h!0>aUUB|kdmVM1$1{r7Sqasy9ctVZ+un9Sjo;CB z#sS0|T)z>uzO9ZwwA*kn`7-IE{;{Zb@i-7?qUM|B`Z?H#_&3LYU_IjU>7)MfsP+|5 z*HJapebfu%a58G0Q&8=mL>=ck=ihgJz1`saCcD}BEvW0^Bg}{UQR_Z{dOwjNLo`n& zn*}vrR@8cGpxW2P>Npbh+<6GKzOmQ?_oMoKjk=zXqt5?n=g-))uD|N|U(|WKfkUug z#&qF1Fc0exe}=j)N@R-KmBzlrlThw+q1MwAwQqe<{rllS+==S9$NA4Og}6|bs9#Zg7iyj|sCC4m#wmx|uZfN)*~jf< zRKKTC&!>gXKVzS@&tX~WH=?eKQ>b;Has64;yuUgBr#;QcR}6%Q=EU&PPI?jX?8klof}Z&ZnB&0R@D4wP_Hj}v!x5~8N^#f|}`w^8R~v+K8DY2qWO z^Ys(zK0b{a?;L8~zd3&ab)A*Xo-X`3#U#}I@f51vG}JsZQ0ts+=cD#}D{A~tP{(~9 z)$bpB0oDJKUCobYM;kpFZ>p@pXqW%>&b}yi3g+B zIUJMmHPn17Q2X^dYW;6IUgh|0$7}36&aXrDe;;$;N2vRMm-C;Y#`_#K{uj>gbNnUh zxNkVVi8_v$-08yS=R&CSdoOC9Ca7_mqMozuT>l8_{n1L)`9FYacMx@6|3meU$rFvA z2}=-`MeRp<)H*Am+EqfWt2_3`%{T;0=8f`gu@UhsRQ^0R#47osc@wZAaW~X{^hRCJ zgIqt@4nfU70xRG`)H`6Quwa)pN9hbQNMXW*mmE--W_emKFM*TCQ&Sy5% zdYa<^T#2JGf1#+p2x|VKSQe8}&yyC;w?xg~7VpL}sN;Xg`9~a&M;+Hh)N#G#`gc*| zueIw?>)MEFzZrF%opO8zHQ(>3et)3m`^)(Y_6n;1HPrdNgBqt&;pjOw9rfIPA9bA+ zDUvSyIaWo~{oE6^j(&D9YTn_f`9|8&Sb%sk4#Hnh&w=_yqjn8Z?<2=xew>Pf@hqy} z4b*u`C>EW+I;i_(Flzo0sN)!on)iRGbv$Utq0ajgsP@xP`!e0}Y{zp@?}N6Z#@mV7 zk3U`im;D=ce-tV1^NyOgxZ}G}_j4Q6bL=tKPei@%S&u`p*j>?jN}>9fv9YN2l|x+z z9UXVFol(cr2esb$sC8~d&HEeb`2Rv(&#@(<<0+3i&s9+4C!p@{8qU{49d|>F#eS&$ z8jM=sP}I01QT<0be;@WE{?hS&RJ-pSAGC*2{l2$HP{)_KWR%Z>nm;>gzMPKppw>~) zaS_)SL#@9wYTPoYdE;DvxAXC~0&4uqsD4Sd4r=@csQ&jlZjKta1!_I59Jj`t#9f_F zLp{gtb9_JQ`gj4=e~Eq3F2!!-FQCrHHPrblS1OvPJnH#T-EmFS^*#XAZVqbPxv2Z- z3~JrKqx$`eTJLq#@!momZ~D^Fab`hXmvtOBK(%Xx8uwn*{XGUX&O^>WjB59Y<45gy z`xvVIMAY^01FHRT=YK|xe-d?_<}DM&`B2Bz0K@*N)W^=EZra@fV`* zhoz`?FX14(gYB?w+2}eOj~efB)H#mGsN;OY`8Vxq)ckLu`hAa; zFkQK*eMZ#lWdqdb)g`Fc)0ntue+HqRtBX+UUWz)7Wp)K>-j%3%-gNwylDB|BZS-ovVB_US1qRJQme&0&4t;sQq{xbze+#JOj0^*{F7N>|8q!wf<)v zKZjcPV$}P~uN;4aTHguO`-FyfNAovD-A6B>uERa{B5J-%sC8X&eAV$ad&Bvgj&IvL zHeGzQ{!FNGvY^JzYO~qwn1g&FjKw<6*F~*s5bFMZ!1*!uLDcb%MLk#cVSlV#A<8GB z?&p4}`3IopA7}?TKg97+JIoGu{Yb~7Q0L=*)VvR36Wo9rf0NyenrDmMYCp8wQ1{2D zsP$cO{wivmYmTp@=DUrWFQ#I2KPRH@`?{$1^-%5ZLA7h_d{f)p`BskG*mkJU_4T6ph=~ zwnM!y>W4b+0d^4Tej0)LeDNS^JrAMAeZ=vjc06kTr`VaO@n+k(c0OvH1*qr6F4UhZ ze((GddldEgt!CwD-v*(^8-nWh0&1Kk&M&nuJO7H~SM74=SD=n-wOxyYi1Sy8#xICX ziPKQyceg!U-^+1t$9*05v;CbP=y;IhA*lOqf%6L;Z*%>2yTkQ6QP;_*jz4q!x#KVF zUetAa(D5PE>sq#isDDnI2X#DoQTx{vwV%yV*WZJ#f5<+J?a6W8+kfl@)V!Cl3>HX?#x0EM zUj$WO3`=1h=j+;J*VnfVoxcaQzQ&H5pw`#IaZ8LP9^rVT9c4$O`rq&P0mlzvOY&Qt z|Ilu;AKC5pW4pudw4c~r_EXe+dmMj`I_|xW_t`J)S9ZVs8rAt{KhgSt+)U_RXI`hBSP zBNeJe<5xtjzl!4o)OwPfuZem;P#-l#@*oj2hMM{TTtuy$nL~k#QRa>e~apW!0}J_K-bnzqd#1QG3k(V1Kkfq1O8|YW!cE zKZV-g+%==)%wzM~e5m#XQ0?wnN@oJAeSZ>ZLach&xjI{q7uZ=%M( zZSUB0wWD?!Z5GrxS#36(9o0Xl<6Jhk&4YRl)^(h0>)HCYfo*8-v5oA#wy|wuo1*4# zZd*Fv%C@#`Y+Kt7wT~SgcXFJD8n1`*JyHAB$8lfV&-sCl2ch~6aXi%VaK|GYkFxjK z`|TLi{yu0QvJcy_cAS00K5EC?$Ls_<(N40D+iKI8jQ`U$RhI7vXhxa9|H|@dvk7Id zkm(iEnx|eYuOzYjDNs4exDdzjcP;w5aVVRFvS}!rg|c}lTZFP@C^b$TKiN@byHKWt zvVAB!gfcahokH0;lwCsEHI&^#nHI|Kq3jXL36$k|FQ`(z;=>x_x$5+_R$d_-MaA%S zW#U*~Npu{Q`4=V8v8hxhk_DYZMqjrIUu$hu`IpSGyy|F#YP40UC@Ex;*gbu% zd{W3)4_{XgU)Km_J^sy1EPs!4Pbf8h1NK>^_NoED`CX-UpaJg&V%cA{X&l-#=6%1u z*6uY9EgOg9ZOr$lE7Oy*398ioHwj1AG-R5Fd7Fm5O`X>)O+(*ip-nS-#4?lmHVZq} zEVOJE*3--_wdc+Ggr`y?H0QgjV_CiCZ4r942>F&_oR*E3HcP~wVw8&wtc8=AMzc-es&1^(;=)OHMB|P z-}1*YllCw*v`h`FO$}{2g%LW1uRC+LW9hH`?;P@-L*LG!Z|Bgrb69idFiYofT%Fx_ zBE7nV8M}nOUBdo%2`lds`gRHPcHz(bV(FtD=o&`r8uDGknBBq%-NFdn!d`U?Ez?3i zE#%X}XlbEW_izRF2y5;UYI}s*Ug6C43i)1PgkE8;UZGd7aHaJR`3WIEiPe+~Pl9rM zRmFF{?*Hh2^@2@8*)){RLfIme?LwIn%5I@d3uO;VU7sqOhq5cBu1uBcr7KfqYA8E} zQf+iis#HeTVL9UNl)CE5v8U}Rb)A%BkCf51QI1jcwa#g|u(#znPOVD2r&6P7ugdZL z5<1>K-1X5@K~J{|d|iQ-Dw~C}c_>?ivSlb+hq7HLQ$yLAGAU*frS4pn>Z?0frP}Cj zjSKsrQe!q@6>;I%RjRfbtyDG%rP}CzRM{z%YSWw}R@pw3T|(KNQhTCO?OTSgb@#=w z%NnN@JD{=yWow?0Dz(Da^iZkMbSLUbtu}4A4&%7))mL|=O69fBakN%mcU&C*sh9R# zW!q3Hulp-5oP{{X(w=l?29;`~dqiccP^!J|i@0#UR7PKG4PB{;;|yv>oyWLv9#yKB z&So6fgpNh$G>*UfNu->>c~z-dCWQT*5ZX)#<4g!gJt3T(31JNr!rCTq+-k4g&>f*t z<4*{?F(IsE0xQz1P7BH!j9;E{6GGXAvK8Npr?M4gO30^#ObU@QJt_5Cr7}L0okOX7 zkI-J%qAgI@odQbuE|M||j^R%#Qy zE>`r{RYIm-DEm-WV&CG!>!Zr@e61ELHD(odLuEJ0gfLeEyQHs`Nn{^XHVj&l)8`N8C|0_4s+>A5+ClMct&i; z*Lr%W>`JLSNM(~yYCX-uYIO(cYqimxqEb87B8;F{t9Z^?7fRg=@nlu2Yd)T{ruKUE ziKk9u>Y9(|Kdo8Uxk`rTXeFP^mTO`j6-Rn`-s`O{Hq}v{$KddWCiB8jI)Yr?rfE5p`1XeD_UihP$q}6UMTB_QZwo*P^lSpZdGc=cfTI$_q1@5uLP-@K; zxnC=gRjLmCAadY#++hP<9GsS}1!^ zR^fjtds8NGM0yIh3#Hm8I@5)(qY!H^&R1e|wbc91O6gfcahohbF(P}wY$Z9}PAy)V$KQ4dPJvZ=hAvLU0Y z)W{7v_xeQFmE+dCd);ZRL)n&6*MrK$P*x3P<4`sUWz$eL3uTK?whX04&~rm&N+>n5 zo){{lCwiCgwdU0mT4h=&dxWxgDEm=X;fbVj68~wZs&J)N3uQ8;UI(l2UP5KfP}T}% zZJq>G_?|80^)#pwUMs7F^Q%%vq`STfd#xjC$^3eq*4Mf(s&JL|rR*KX=^NVX9loyk z3ZZNoO1*#4dz|Q9jLKHwYrTKbRr&w_S1){hPbk$lf%B!Zc_>?iQhoIfL1nv8ri8M6 zC{sh(DU_W<*(H=|p`1vm&(|vTsk$1wqOxWv>rm?1sIp2Z)g~#lN#c9W^z|f4?Wam* z>hfO#`__k2pSTm)7p+|H%vEY_jkyn0YE^pDs_YiZo|Jm8u2M&&XRk`N)Vuct#%df& z9krgrD%GZGXrrgG_NZzo)l%C%MjzM%I&DrCPQLqqSjXeXTX?oxjeX zX3=wArN(I&+NXqkN@$Z3YV|xxU^mrQpUPEgg!ZAfz4JP*4q*rMIbC0CCAxD}YR@}x z2PK4SSfxhL6G^4U*K;X>9Z`Edom6TZy>_V75p@c4>9f3^r&@`gU@CQVdSy|mBhn{& zm0E*7*Q?ZS=yfN7uhduX%~b0A>QlT*wbZ8-m1@~FT$5eHap@DiGFpi~#i-PtbmQ7o zsViBZWmM|g)93mGj#+c1h4J-XE`c+xq6Al^VHPm_g4veO;4Me`2OmnI!H}l~KM{__|Ig>xMF!Qh&OqQlse! zsZvo5?(Rf-s#ecTl{G@C(Q0zXC(@#JC^e>@r7G38Hcy2_o~z2&318O@V}c^ zsU(q6G)r=5nHQRHCv|D0@=svx&-flzJMd><~(|(bGVs_D%25RO)@1 zo&ze?vRP=OdtaZX)T=pHnab{zIx8yGSNFS0^=%pEYRT1+$d#HBN{yzwK9Lq$t?qi2 zTC+amtJHdQcdJxJ_q9s3*WImBwJEMud)?hCRjYS*iTtNAJA~EhUQQ%dn^fjk`TwfA z_pCT}B#-0woSFY;4TDYFf*>vg$|qC)M{j3(v!g&}wp$+E;5tPikbFZEH35 z|Fzt2)h07sncJn;Q8_Ff-WQEq+z*dKHL`SgRkYSXQW@3gQ{x%+hEa{mF`g%tnuh8! zh9{-h@Um#!q8>1MC$UqgG;0vOqcmd`m1C@;JZJTsCv~S!ja4Kq zyMy|{xaHF;hs8mCC6?S?pn)reiEyrW$f-s%@cY4%oX0GwEKA1 zD^-e|pL6AN-LX5BCtpOviq zeOwRQ$N!x4VUZ_3w9r$K-VM)+dIw!+-`b`j+hxvaeeXi4UEg9q&wf@)&|+oyR1N6* z@Sl>`BL7Sh}xlRGQsI?P7m<@q6t zWA*cD?Cxq^C1?8to|Nb9%IB16O|n||xbDu?_(SMlo{?37Xrrg2Rhvc6Vy*5(y^8IR zw12@aGw8nWxe{w zpAz)adPay*s9ruFy1tQ|qVsy(x>{`P|LX!8!APaqhOtY7c^GUVr34pBkm;UY;b*i+TZF`BvKfeO+xnSNgd;1+!(dD1P>#dTJDoi~1J-EE-RE zS)@ffQh-ZI%c*YT$-RRI>~+IXt6Y6QJi!5*&25nXy?{ zJVTU6jp}LtUI`)qYNGj!QgMOrMRR|6X2WXWu&$^D+csDwXfJLQjR_LV7%4akmEfuRf7jK9 zUAB~!3w9o5vTI15t&$n_l(C_|-i7L7-8RZH?S(&z_OftZ3@+FX}Qkl;qnl z@}uOF#~z}1=-V18tn-)J-4GAr?SHAi?eHi(FZu+1+W!sbHfHs2UM}tzMPR;E-Cv8m zL}xf$=bMR9E`+bcj#`eBo`he*gYY!G2>7Vm+MW=S+*1~5)gn6}I4XLwTO}FUSRi~~q^Ew5En}I6Fv30+ zorKw{ek6}I$X4~|PSHAaD?PbYl9AI6*H+eRp22eL-z4^LwP^oSJo2t+6@q)EVMT|( zm6SiSk2ordkkGu_fBY5s|Eec+TxlMHGc4~y>v^M-c zc6e9R_U&qqD^^u_9EzxkBBGLaQ|4~+SYf#$=WeY&P)_SC?EG5bQvUMpW| zGEYu%Iu zb{T&b?QtS$?K7g1FVm~6p|tYZ6qNTerCrr?cCtq;tc;xl<%sd3mRhZ&dvDS+o~|@$ z?Zx6aGz)Iiy4#G#+sNa5i|fj{O^vtdpWD=Xo3=Plwq0#o42>D_1=Lq}x%V#j-lezi za_?PPMW5=8`_y%x>-TBhQ)GLtD^3W$3&-I`k%qJbKMU`Qc2@0gI16B;;!b!Hnqea1 zJJk!jA+0ZdiASM4bS$2SY8TS1)3s23`2Kjn+!?o@7h#Jku7Iccq(ves%B z(L$fnGpJYT3Upm8Yp@@)s8?wL&}kNJY6HJZi# zwDBr!yh;h8tggsu%EGw{;d9D-PMObnYEGW`R4a@( zr!Vbpvc-MU(AkzzrTHPAP}4XPArZ~>sYo`S75QK7C82X7+JkL%<)r!WJXEiljaNl> z8E5rp4EVP)olZbCi!7s&xL^Jy_ML33ae{~8aj0G+1l4PtpxTWS)K5pL>nQE&{l$*J z9#v}wUqRGVTFD~+sAO?eROV4iqdWK(q&m)Bb_1p5w=aP5+Y{t}XsI1^R3mMLYCK7c zPAado7MGqkOIOUeJ{{wXhI_3F?5Xw%NHfIVH6DbDV4wds3vL0Z_lOjd)+|Q}R3M2X@RA^0F}KUb+*Xi?r7;-t}eo4YDCT zZPYsZ{;tYTx1j#tPhB*Ov?se?D;DHu)7PlyyF}VXTL05Is3-T+Mmk4YjWiE-y=10& z&=|B+gGLKoghmu?gG!)JQ0+7cs*yfHCDSLU9|VTDK?r1)kx2xTKJ{NTG}l~o4Q2+B>P-%nT zK`OogdJ2OVKps{UjWJfy98xb^hejw1hU#T`kmT$G>H&YK-a!wkYtR#VV3^rzG$Zl3 z=>L(Nv@YsBS{Ic=)8cLYiI1Rvia(Dvy)C%y(B7v`b2C5jTRmqdM0g4x@|PJEB?jDL$x>$jGp^xG=_J*^o8=B zc|zsey+-9*xuIIR*H{5*C5w%ql0`-Isi!F(f@`62_+F?7y5Ge{r1i!$vsgStT4^F7 zs5hLiLXtS2hRR@HP!FFc51TSPOHmPN{ou3!>SqxWRK7CY$TG3?M71Z?U8Jkkxh(Rnrz}i zNVd!LAzLqP#9l^1wtl~IxXXzdRErqVe%)hiI01>|6e&W_^d`?yJX~6Py@84D5=TPq zy-jb6BS|Yk90}DWj)Ww+ExAx>{f4JEPo$M&^?~HE20=34MOTX~Nq-I1B3gmUze^iM znWWVs)`aTv*2#YL3z_*dyi6tVXONuy8Ps-O4W5QZGT#QZf^UQB;@hAx>`fM)t6pkv z$N6AsZTXqD{47f-eO9&EHSk`SU32FIoWa};eQN!3Q1`qm+U3WUqJ1kn?xRrJ4lPRC zU8LoeBR-9%p)$oyQIy3hqhl@BS8ZYX)Fag?c#*6w?vv`u%bVxUUP+(KFAYgx0GykkJ@N0kMhszX&=-x za~C}}SUCDhS~<>2*)8xkkNJ!G)67L}F$Yn}<{B#5`Wm&uTtj)RvQdk!)6e|sgBp$F zkj%y&9#ntuhjF85JUFj5Dq17=+eO${PIKifWM_E1hc!z0k516zO86z*4QJszybMK) zo$YnXb0Jg?9}@YAyhl`mGjXV1{-M)Da`Fc4qe$}x(Hl`)B`^AvH^`sp-4*2+lSqEi zFeDZ4PVCC3RtdNmDve){NToSUm4GbHHJswL($o? z!y5g1yGJi=DebQ3wA#AwFq%+Qaa{E*R%u5W)!wP{ZZKVkR`}LXI4dsKD8TPwpJ$ZQ zInCjHS0j!0DT;6Z6WwK8q0;Ou;YHZ{Hod!YT~~}Q?DrP7lkOD&d5jrUnlXdQG)}O6 zhql#sb%i$Vw{VBps2-74f{}ot0(2cJ!FV`|&t&u{hkiqn8xKQV)w7l+6s4HTK-guLCZrNK7ES1$X(#_V+&PwYe>t82r<(cG)RjP9b3*qbVO_81vC$b_m zn$bKn9#F~jjNJoISU!};`jM4Vf~Y?(g(MWAM|bHdbgy+HdNM<7nB?NG*k$ritPSy1 zxEQL%IuZ4T7$=Uytx&yeF_Kff2YGN}D*TjQJNncpMJ+W-aq#t|`C>c^R5ELi%4d5~ zTUaV1coMFLp0YJ-hUf*+37}U z`K`-P&a?Eb@3Szw7DGL0=NgsZ)HU{b9rBw~NPep}RDOFQt*^DgmG7bFJB^&vNI@sN zLK15_B(vRZ)Z2EqkzS;|QK{x8%IRHeB=dP>w$~s{!rmP*XQe$ED?U_$RUWGAJhl8I zw05Ikv{dvBm0&a=$*sRo3D#UR5eZoYRJ*kjy0`U|d!+ToJpEwBB&{E;l~9@1O7xmC z`~CKQrzR2LJow{SuH%|r3-Ls+i{i&(a=S%qc04ZXhwoLdzTv-l z&wf<&E+C3;@g{K=UKjaP=-kAl`Vd{`JK6VI4iAfVyiY2(dp%L}s^6C*k@=3j@+JfC z1?~1*{j?Y0xyf%-q8fSEsASgXq&{=S2tTPDO(pXpQ0+zwlG9on_rv~F?Y<}Iq61M<_qvwa>xz$u)eFE8@!Ak;k);W+i&Bk!6uqCd-0sGW&ww^J8W3I<%AK zeo-wsMFLTa==MP~is{jh@e9d#xTUl+fH`p3w`-r-PYdznVFwAy(xNM?R7 zcC?1fMh^1+SPgs(pTd^Sb78k}61I(1yD^4pV?(e#T_cRnMzzy|s9tjy)o4bd8jUPc zdlsHNYP;u#n_;(18;xY_yY%^K%5f&@_n9jBXSGT~lAFs&ets}2jmAc$(bz~ryF93T z+8aqF3THn_`E)GGDSn0HP)@T3)obpc8fg+#4lRl#r%O?vi!7nuphZzXh%BMfXhziA zbS5g3=0v?MYJ^%uf1Zo_70e~(nz=!ehqs+N1uoqAsOf&Bm@0}+Cu-JKIf_8W2h}d z%* zoM&=YvPz5PdPh-R_mP3mb5?UrEv+T3;H2d=D|y(Xa2#%go5ff43BD?tk4}!tX|EP} zZO(6_>u;-WNl3oo@i%yFpN%;?G zg=8-G2t#e>IiMahmz{UhGj=Uezgc@?pSLQ#OS zlHZvZ+zQpmGeI@>N{N1uR+keEs77m2RPS)gz&N5wP+fEds*A2bb@5xUcRtm~(x8%Q z22?W5fVZLYMa_}q)=21HYgkl*D6DlINyJuBKZvKI5=2jtoMNI#PU~MJtym_04fT(B zAgY(&fS!eCjARgLL-Jb}qi;q$%#MU8nzXivmUS%0T1TJopipVY8Rs;cw9@!Xcwe+S zLGoCIpc1SAPzk&#_L<~7EF@vuZJN-$cb!IYhbwA8Ijv`<^bg&LBosx$&gcK_V50t~ zGm*@EC+u>xm*zxw(V3{1_)%8Z+Cp36DD;f1Rnc>qm;ZyFj@2t_JDrK12F-~iL*ULqvnM zlO~DpF_>0Qt%Nk*L-hYsdWlUD0nr=$J=9*OhERL0)zR2wcToB44w8yzh-BjvqR*`a z(F&aYN3ji>UzGe^=u>ZKp=a*22^wqkE$UahVAcR^ky9mTJ?Hc^Du>sE%5hE^NkTIt zUq-|PPeSz$r$pT)5@^mWglge&Ax%%yq7q1n^3!$Z*ixv~cGOT#`&vjI`$$$V%BSCO z5^jaP*Fh)wLp?w{;bYh(yi{6z*D6Sj)^upz(mbLaN~2qN`fBv8Rj6Io(AaBY_tG|~ z5B;HfttwExyn7zUVmJzw$y-My^QO^L<-eiczzC# zKQ9LL+u)Uufe(Tt;a?z0cnY{4l4n|42(_KfM-u+Frq=m}bbqi4rnAbD5~B!g%glA-&E)sUuh#5|ECEC}j zku5+yV7CR;$O>TZ*{GKm#(paPzu&LuGp2T4hj;{?C`~HsbR-o`ZhfL;@lSS_e!EFO z_|7@*B7tJx zqoQ?z(Y6yhVaIk3<8P@_VkH*Wb%vcp-+2m^8;C3 zpVCoCQWh2Er2A2?(ln?={!lGu0QRW7Nm{+08!DNksGQ+$_tG0Q3mIqzlylHEo|GAl zo|LsS>MQda)#AH6&`9GMqSEYTpfb%_noF5{IaHcCi%K(F(YW%^ z8!m_aT|!O(@dHtQn#;SCa(ZWq*4`+-s*#3z-)zNk(VWGz&@&$;zxSP;BQ)Er)6v+p zT1PpTGwQ|drIp;@kL8RLJK^3*WDrA>R*U&=PirB39li;@FXCi8DorE}N!Z_)WZf;T zEi?m?jebB9(h{gH-YRx!d~NSdA{n-;pPYl#4}3**mvuV2!W%^U>uu+p5N7SjW(|%@ zq5M|d_%+l6_61Nmo+*m@IH8Yy`b=rG7OLGU8=Pwqvzv@+|9#TLoYy+%1yEb; zHK4w-&yVi4Z;#r-Q$?kT4WfEQ&5-=87ixtTqE_&1Q7f#e@iEjQyMp*qw2z0RvTKLx zrFBuMb~{jwcG6HS<|e)hwa!i#{yiLrW*;val}R(B@6~p~8Og(E<{>GQKaBG8eo>8l zU8^Y4((UL|J|t?j)eP!G9wQnF!z#gSrSnlw()_3=X+Ui6Oqo0vY=1<5@*~hY#JqsE z5-2}?gW79`p;qW`?6S3;U&sHG-$`K9d#nIzBb|@Rq4Uv9r1Mc}G%u2q&&Hcnrtken zC0o&>XU!JiBvif?J*tH-hw8GHM|H6ds4g}F)yPtyXKLpKJyYiiQ5&yPZ-4KbxUMV8 zXH!uBD+QHowLYAs=I`-_UE#~2oNNth7h8i`;XEzMZx0yBe3$#~A{85SQL@q@ECuQZ z_6SL6b&uq<#z#Fb`hdz*3X<9Wj%PUv$Ki5ly)LTE(yxWERn~)xzqbk*>#4UET>oHTq6g)EmxWqIQX6Ao-V53r|>DTUb(berq}HVpXNpEB1tH zZ?CB5hW5CkUeRw<7ykj(=o|C!Tc~zkH>#aoMm;H7j#l$5HL7=#dd(JTHBNrjsExiU z5cQ$&t}|oR>)U$xYNT?y4}H2-PZhs}M}ANE^`)*!T% z_73l{8N;kOlG8g_NKTP+R4;3edV@7blCb8ee^_($yx4TqS8O_xu>E6}U7EB?L1Wda z05n$F_deY$x=LneJh9WB*HK2)QOy-;@;ix%N_Daa)jOOqR3>YV+QOP6`Pp$KGdqs% zRSJ@j?Z*3}7&wxLT}F9XVbm7uAoQtq5E?D)DNaIpSk)m4a8|lnJkoV#_~)uH@WS}12*CSE)pNd{gdl7YTN?V{n(2r;M8s2Ik6=O@+BPoyF{ zs!MIy|LH?(BGi-O;b^w9kEmXj5w)FVL~^o;sCE5rDw`;+Z$-0Fy=)@tldhFbl-B=j zBI;+>kW9+7szSZdZ@sdK(nbi&h-$GCL*@HzGbHnMq!ks>wkCP3zfez#Y@l8u&Ai5w zR z`xv~F#mpFX(DRVLpNgGUzKeZV))4K;*>6QBJj8%dX>aQfuZw=E2i?Vb;&RcNjt^u< zk&Q$8!1@mDYdJrS-$Uj1`nf$Ped>z3ylY^@sEb`gC9`O#2YT0p<&q|6`(8cH$mELk zw3VZgr!-a!$v=r~?2)t*dUQ_GQfo=y&8A(O^`B9z1QrMN9*cu&^Zo*U2)~46u+l^= z>+jNKm87-EN)z>uH71^fo&pPnWaB@fUeY7z9Vs>l-OC0c$*nYzY~I91y~pmLoFYW1 zmwdZ}*{EzQN>t_$dDIH4NYr*~Nz^}9l&Fnt5Kh9cVZYI z5sgVs)(72tmU~$r5h&Mt*N!EkTghg>3*{Mht4L^NhwienL+xd=keqB5s;gsLy@qM6 z?W*hg!8(o}SBuCZ`n*>=t=~KDWo1X#%gKtNHd@)C(yTUE0;7@Fk47UKhg!$dq36hd zL@ni2q0;DCBqs}i`qnuaG=At{d?^ldj#Qol>J9BfPl{DypVV$ehU#UNP>*%&uh(^L z$*joi$ST=d43%j#D^W}RP9bWkbs1_YON3hL{YTV?{ch)7o}D$CE5@fa8mqYy(pP;R z+HY@JRnlg5W0B-mZAf3STxe`qyP?r*?S}eUBMf>b1Ue4%oM0 zvMhR#PGS+zr}TDzH~Ce*Uq#QZ)fJi(oj&BHqxUoH#$sQ0w#jZf8b|FP$j3`i7u|^F zE}tAdE%7(>DSe2>HLJ|4SP0*QB&P|HBs_3bZ?DPQ3!#_1aVWm!%?MO)dndGnc&mL~ zngPj75Aa>Qk?9mLlFDu=szvYfY_yCvKr*+lBf?`8l3APwmF5HxDwD22ciCq|<=bII zlJI!2$F%Qb^NfvbCHF7G*|Cwfvpi++mYEEK;v+j4eIg^0xHcL(0o(BoWu)4d%1ibyeV2uU)QW&E_(C# zy5`72@%=A;tF-S8#Zf4h;2bIPclaJ?r=8b<9WA1poCKqxlxc*c5{z@)3j5n(yv53n zqjHRVq+gw+LZvw+g<8i-qShJtXa#9ahfXE3jM)2>$}}U8g#8sB0vja(TR?ph$7@yk7!jq!8bzRzWwfftBhhI7z7yTX`ik;D2_DWAeu}s?8 zzUg7;R3-0`mOl>rob)v5j>L(jdC$wLLll8ugmUUh>@~@4rNzVXs>oMCS9mGdd$e`~ zXcAPHenYZZ^Ey2(KVQN=?qW#q>Ic+DdVpn80$Y#jH8(qI+i@v$m-RaOR3D)KSPGnH zl#j!WqE(EyZbn7FG>B(Kz3SJcr1c)Y2|pHj(dbh%aQHR>{_XJHl(e@udF14IqS|R- zye=AJ=(?U6zRS|;+xHQ87l`gcCG%cHseP)AtTm}<1|+kU2exM_|8;6)Rn2O(>kVX^ z&2iiaH;ekj_hzmY^$c2V(mwnEzZT>D7k(Fmh`j#{NQuN*>y3V&iZBcH2LmuBn zG|n>`{1`pRo8kS@59r%rjb3k8G_{u}jIOY5NZM&VHB=*i71hfxMfp8tl+*J?`Pn1% zDXU<$uN7${nE6~ zLp>QK_>D}zXt)xt*1!8#Y!_{ z#uq|o>VMXCzsvY8ty(I2vVN`SRk&Rv@=fLO`w){N9pd+9-WTa)wEt`m9a+~tkOo>2PZ;~_AQMBv<~A5S$nL8YvFpRM(?NKr%(yT3@W*In|QZonp1Cd3$_-P z-#JNCqrGNyg*`>rX&zJp&10_0$$FwZcHPWg*NsVZosWTJpqI?;K8e|<@SM+JRZ&i- zmQYUG3B4^poXt@t9Ys6HV^pK-Mm4&^3ZwF!Mnj$^uN8+k@TJ{LQ}Lta|Ls%rjPy2- z(rV4UJP34`8R5k3o6xh?%Kxgrg`)rb>iKbaQ8YquFLcF7KxYBWdX%=#^qc6ecrJKV z^hADCiAwN9{64xX`quBGOY5H>>6stZYS*>#N8K;K*1gnt8i#(z$?yNXlHgl{_)5E E0kpHfdH?_b diff --git a/.vs/azure-db-benchmarking/config/applicationhost.config b/.vs/azure-db-benchmarking/config/applicationhost.config deleted file mode 100644 index 269dc55d..00000000 --- a/.vs/azure-db-benchmarking/config/applicationhost.config +++ /dev/null @@ -1,1021 +0,0 @@ - - - - - - - - -
-
-
-
-
-
-
-
- - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
-
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.vs/azure-db-benchmarking/v17/.wsuo b/.vs/azure-db-benchmarking/v17/.wsuo deleted file mode 100644 index 0dbd0761a7ea5cd55726084c79d99270bfad0ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeHPd2k!m8D9m$k#OaNa4OUs4OwSbmMtj>A+lu!(wKzUIDx2y)$ZC>EL%crha5Kd zeKiG2N-0d}v@p;PQ)ZY>>0gk^KpU7zr$bAdKRQr)O{bks+v(8KCh70Dhb1qTyprr> zG}Uu{``+%p_r7<1-+SM;pYqc~b3S_U_47X#Tw#@Pl5q6c>B1=m&wT}H;T%Djh5H%6 z(PPJs@fF`ASr0Wd0vm-4{)Pm<&@K!j&Ivm?m7c>wVdmJJ&zz*xzGsZ9Zkc!3Hyim@ zUtwk50E!u5n{XYd_aN0S?3kpM@vj$R1r`qX__q_^eG`wde9hp{C*7=&MhkL+4s>EH z6hOE06^j~#8NPDqM^Rb7UEz9R7*x_i3jHT~3n<6%Bv*{E{hahqMw)!cc1)7pe0@8v zT{bhHkMxnk4j@f_cEV!3XPR?+25=^D7H~GeF`NU;1?B3%Ygw z#~>g$tBdsAPSLcMYsHB-gVX2$PP;k8UeCRlPBUDH^Cypz+$Y#j>uKrhcD%mQ z&e8?C2I#KCS=YcxxKrpe&)`FXYMzXZ(p3pO|DJ?A+@rkGA4Xp8K@2?i^OT>%*;~Om zJdSpxac_*BOmwtlNN7W=s2}O(HQ%b`73d!s&`omC5Mrp8Jsq%X-ehV48lK*c7G%(l z6sV?5>UpYGSzaa3=b4;mZ?FAd!@Qg@gi`uPw;&5GLP%(~vQButvV#6UiJDg0{hzSX zG9R+vPAIeJlw@~kGoF$P%dDgt`i1MQ0~|mu=r#GF5o>(N>U>`N&#C8GlEEweE>O>aGsz2Cn>NdX|9m{VQjhgYpXD6-o!~yz=JoBU zTeJJ#X;PzZZt-3tBvb}H*Gx$;Y)S#vgZ`UzojKsM$-*cyIP#|)`jnJILMvv1^Q1yj z3c~6N=-+{IoHK?FVWV)P;D_Ah=;r(DFOY;*&WW#=S3v(xRJG9Ne=qV!o|v@x6!NER z`^$YO`3t*FFZ2VY=?m0h9Nncv*0EO)A@zZM=Y@W7tmNktPXGOQ<#qi(hP-R-@#h(R zB5*(Db8Zu~^U`Klss2aaq>YC*AC47uOOBTxSPanSLwgVHKeQE5|GNUX68Ivp1h@)V z3Wz`>undp@t_{vl6ToreUeyAGfG`jNmIH--T;;lNEx2z-I&R-zi}*TVE$}5^9nb+> z53C0^05<>|fliC3(7y%03--Ub5sl61CDnC?Po^wq4Gk`Ux zo&533f&FJnKaaK!KKkR%)aIkJnJ(3;`F8nyAF``U<#)fUw*BtQuqfCExktvn4FKo3@(A1j`x_hGE&H14QF3}ZEO=S+Y* zB_M#5^@V|F?JU3&I-YieW&*rp?e7NC9jL*2DubsR!P_D88UROIHPKS8n)?;^Yx31w zHQRPo*pBgH9}d)P9|ka&oR3_M&xHYb$rV^jyg**$`Y{lzH8%e4w(r2+9jx&_(2g=- z_TinH;b-?esF22#u-3{Fg#9(!lN5H3Fjf_L`e4oW!umekk6For*DVS4R?YT?T5P(; zXJk9LgItnBPf|F+bA7#EvopfpWtc7+I)#SWN1|6f{`R%6AAa@Fyzgu}o3@y6&;0#I_g}p3+s|vS z?Y;P~Gy)X~bMU+a^I=(*sk!p}M*THwYr(X>Tn%qXeq~x=+L(3=QRty@%y|g+?XW?K zm}{n+kdpBiLz6}1;=3qP>_QZ1gFQ+@N&dAV_bBvQ4PSc3(_L@w@)lJ#dj&5=0u6Mu zfiyJhsuXUPf}-9O)Wu+^CnAQM!m^l@TOzs^mP1-HGDG;jFScC5-|lE2-X03J%VKLN z*d)qwOcJB*a#WP0sMHpb;_-M})9A>`j+CLsQ)%5;HPXI3(U#5(YyMcPf1Q%_cj?MN zLfJK((?u;QCiOwJZ$QcQrv`fyYQ`AI7zsnorLsdtLhVy2277c}Q6PNeuozSnNTBA3CPsp) z9%$C&a3HCS#_F>>RkM4xOQQPLPpM!r`Wn2*%M(L&sbmLiSd!$rIPV&*#E5(AJWues z%vltA7!(yaG z>k*rErKc$p)b*y82o|Y~e;yX8wM4ChHV>m_m>#`@mJI{i2(Q$qX&s>7g=Kr9rlQ#I z^69PP@--s2fz$6w47@Bin;|AoFC#X=?ihy4AA zRITBoph5JzaYDi41Ye%o`^+)eATB`aXwKI_UvXb zpRGi>)9flHqHlQ_YiNZA$zHlWEuc>ymU)2J@uxk>q2FoFHoqMA!4Ag#ehB_d^m(>C zoo~R}pvOiES7Xde+ipCfFzCbNX8zXCD}DMPIW?5>|J-1%zd=yeU@xQBW8Ux7DUbe_ z?SFYP3UkaDO408&dp-o)Ep51thdN7W7^OaphakZJ(su!3_ML%sP8PUl(`Ls|ivA|h z;4IJ{$e82c4&c8r+Ft2X`JvwxgWK=34QqhE#7#jS&`QlO4;CL-`Q6v06|DalDtXDS zXgx-D8&)2DjV#)EANy|8gU?NI{Qae%Pv1n!6R-VmL*6BJHMH2%uhuYqm~_};-L0@Q z7K!ltgR;lJaQ(aaf0H@lPx@=*^))G{_^zUOH{f8jO#T=-qHx%S^!VgmUrK`COoA+ zFyr`WFt=fz6Ijc6FSBhJ>Fq!QK0hk@&2PAQZ6;yz+Yr_Rzw!3NhTns{)^`HxL>xD+ zoSjH>$5g>3Xq5&-#Ghk4-f1)<4@n~Uwid$CmL}+dvn)^flqFG` zkH3EzM0+R~$p732N(JtJXCVW>qj=>%?mhR|0=PK+ofwxST9GbAer*4}unhX8_^$)~ zrQXZ`2cb|l7dwMc{?VVAee&9WezWTW7~K80XmS^}{wIPc)=<{mnfd<%SWm5z)|LA| z=`O&nSNb!NmwO;X-T%M%|G(h;{wZJ$)r42-A1B)Xe=%C-2fWVzW610H{}=o6?6#B-^0(Zw!-k$SmT6gKXi)E0a?5&BJ5q)*tQV6v?)n!%kLCH>hjn;2;&SEx z3%=vC|5jo_6B2|5of=)%i$GMJugu6_(FZ zDQQvs-HDR_{2gUA^1q~)4nOwocD|;%KC+s(&b!eOX{j_4SJH-F$tF~?5pWgq*ao@D zX+-gPa=+PECI5ImKUKmz)~eh#>%JFmj)elvk$wMs5IXj;dyL(yu{(l@X+cp3I diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index af23b01b4e11bfe19cb0e611b733c409cc385352..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 zcmeIb33wdExh`BY-P6VPr{`g=I_DVjCM-9?i6*u_cYH z8QGQ>VC;a|_r)w>2?5L=!X6-OArL}H$ju3dhn)Nn0$I-CKe^!v9LP<$Rn^lyQ#~b{ zL(b*?hrj(iuI{Su{i?otYhQZQv#}!_(|kjb$+1ApR|RGPhXb7E^8o-v_%>cii}<(Q47ZWF!uhGQ+j;s-QP|=C zZ5ZH@rSS!dJ7=@s5#Jad4{7^)rpE>&qb=G{csv{nN5%*A*YV*s;ZdzUG|)~1smBhHeI?t-Wcy3wS+YB)8JgKfH*-T^Orsm8oW!`K z=1ELKzxRzerk>W)a~mahj^FRN&>ss7j%wDdTm5pvnBJz<9j%m{%VLSn zOB#vop?=73Z);m?x38dOO=Uz-ZUEZs>(p!T)_79ZM6jbWKL~ zghSe7shh1MWMr7x-dWw`8! z1Oupjc1QNkoB;#W92uP&8&Ai{VrhJt$DK0(+tmPWSJ={EV0>JgYz_oRw1ITf^;TvD zN@Oduif4=`rOjD&VBJeky}$HGpNL!BdHuM>S+%Tw582|ZVwk?s;;f?7HuD8qT%tf} zHmB7bqQ&8KPhMgEvHD^(>(opc^_{TB0GgH82uN%H^hVx0Jpp@3qo*>GFj`)3cub4N z0%H^XKGb>iwy%dhDeSLMP4o-yoMoks!z!+cMzScr0pu6~x?y6XSo=1#Z|pNi9s^@4 zrBp9NmdF?!V~h~pWJ^b4N;hefQP|MZdj7+JcjuIrI*zQs_0Wh+kDl}iWE~`hDK*d# zq!!W_sCjzLFb&qTlk8^8Puj~G>6%&nBFd=9mb=|Kt$w4(tQC2nD=?{z#|BWhZI$uV z^0T5+V@N4VD-2B-XruE|IGkY6r|Ca)HC-Re+ z0$J5g65C1gc7jY~xl*S^X~`m1=mv8qF*vDt660vZmmXQm>Ya3RvXf3>%W9{KY#>%~ zN)xe)zFbq$ZBEwmFEA6Cu?&)Z9qz}_dtYItcP!pB5wM9tJ~A3fgOQptaC7` zP43a)v?$s0CT5Gimew^*eI32N;M62;u`#2YhK)SJxN|D<9q~fkOnS6fEIdAp+jL^S zt%tB=eM-mSYJ{izy24D2wzSL1gTza*%O>6-U>j6?%K}Y^_J%gO8SLgQ13y zR_(8>3~K)B%K8d_pe9u74-S^s)z>vtYt=BgO4EYnwUt4CMRjeJzq+oz+#je4hWuJ> zO@&t8P*Yc{!QjEF%3y7Mogc;#^j8OKL;gTzpu%4js;{da912v1szd&|!K%SfO{mIW zUsYQPldB8)>l*^q{<`YQp-Qc?vZgjz=?`d?6&0aijX$VWmiwzKLIHn6MW7tUR9zjY ztF3{_4Eck#mG!lC!JxmkE>Q2UZV1-;0}Y{af90SyR8`v$svjJxgSi;0uCJ-C^Op~5 zwa}(eB}^FRBUn)x8mg)ZX<9>rAKFu0uho?MgY^y75LBc2>uYOk{dKh!T4e}YTwbC1 zLk*P`mBE^jzoD)s0F#5!1?p<5{FOsB^|gaTgG1$Yb^g#$u&$<|qQPGu3c%bARtNoq zq3RlcMQu%}axgelJ5*cY*J>(iYOA#&e|1egB6Fz1Utd=_1ant6R8tes8fqbZTByFF zy1JpxUsYaH3Q07qbKg!;aTG;6#qkfL%dhKP@E7u#TqeF_)K_9 zcviSxhzje462Z-X$iK#am%oDF%WvXW@`C#V_s`sSxzBU&a(B7syB*xS+;iOZ+^ zb#lwO1)Svi!1c20xa(5an5)Ot=vw4b*pJwsvk$S?v3uAv*%r2h<(NM(uP_fVmoQPL zo2h4V;cpE5*7>UQQRmIh^PR)a_0BS<$MJ#VImeBTJ&rC%sY3!FFYe?(v4iJglhgii z%nz>yg`)i1@7$Zq?Eid0+`)l5D6A!Am4FM^$uy0~OHn3jbJmbQFG}n4Y_W{TwKD2;4+q z5`GF3(#zb6^=1B8L1Efmm?FipU$$n+8T$ zw6ljfkdL*4;R!7|V8rSjvRFH4ND4K&wI;wDvZw}3)gWCp2^d5GA}=9rG%&rxh#@z? zfg%Gyin4bQIoWQgWDV%`P|x^QBRF%rUTJY8W~jH{V*3^YUw9_nb`#*;W>MW_s1|J1 ztK+y9+Z&nOWp5^O z-)E$qxk=9^j@%5*=+j%(bTB&DYd|x4^}wBhJ%Ju0FtbP3M`lH58KDK;y2))?tZQ9& zV0>6Bn}}AdHN*=ya-aeB7*O02fM3}Kq8j{_1$38ltNfjC^QN0yJ=AZFs~D} zbAiLg4@85L;fYvTbi_=jaDyHJAx|}A>3R;d!3f48>%E&{5WL-GW+f4D2UL z(c56jQH5bkVLd%ZCcs-~Q7t!BYw4;cz*}QcU1q9Q(^XA?x5}bgW~x@wRZYNx3Z0P} zk`R4vFxQA?VL9qIc+Oe|R@gEfW-SCOtW1YlCr%ca*Kf&Hv0+Z(QhKgTfOm;Sb-t;3 z3SHF%cuOs+MW$*AUDX757h6<)rs^WPstNEew5S%Estf31$3k%**H|mkq-oR~sIWOlpSi9JrRvf>}fo zBW$(=8AV}xV8U=?Bq#24!iPhB7wwYFRo`_##Fi=R-N)oo*TYg3o8dmobuIIWQtj4c z#kF6`WqzgPyE~+hT-!aLGtVoG^p@uXccp7JbEiAUwUD{cQ{|bfmdL-BpOTNsQ*yWT z1L-#DENPqP4bKCfi##L3Ekd1;$v?nf#E-cD!2OB)F?S~y=g#EnxH+y5T`K!W_9gaK z_5izyi7}nbDU8ecj`Jz!wW`dw3BUKu5f$e_;h)5d#J%dP;$PHf#dn0GaChMaaZqd% ztJO!;?aJ$7k$T)2bUf;~Qr#%tD!d>ZRPNxbl+TnQ_bbY~%1!(!LcqD6|D({s|3bY% zxm5m{e7}65JS?|Jk4aZa6ViImi=JCOhdf(_M}#YcQi0=d&`MK`5;aIS8Cg1t7^9|>H&ZEkcqEndQKXX<(3!H$@P+Qdt z)kgJzI^p<}@}_u-{E?eej_|xP?f$#tE&fI2CDDtDVLsF591HK$;N}8ajTsYued$p) zF+L1_P|UO^Ao^O3f_X8US?0t&lYbOW=Ej55SoH;!DRSzy9{Zo4%dBuFrgr{NH~_0q zG!_oRX&y}HxlCq>Da7+k82D@+Q0D_}g9>|NSg@-vk?-n&dNHrpgI73j*-_ zs(>H?n9iz50;3%8(nlS5?SXuy67Gxvd(XG z(cLJqv@IiDb{wf$=R3OSE>x7{_K+^Plg!~A)Es`B1l>*reTxL$Mg`qUf^MOLZYDwB zq=IfDK{rxCH=st6Ry6t)5L~a98(B69*)b%u7EVHT9g`ZZ7R6v?plEM+nF`4KhYRMrn{;vzUc?CK7v=JJHbx zvXt1#4697B9;%O|BOZ7QQr`fJ4il*i(NfU}NQedrqQI1N@vh*Y!W8L&*c(VmbqC^H zH)a481O{v;(&?wAb0z`VhNw3t0Q#=rRuqH>R&yut3{=y|0!r-uZAr0cGcp4!ZbGGv zcJ}(v3);==MKZjD*Mp)bckR0Kmq2#i*l~-FbRr-T26y2$6ftd% z6YjjNM+7H#+d7apxx=;&M{3zsJAE$G=$L6It=;5cEoy4G$q+kcZHt(Vj+5__tszRO zl~#}~1f-b;SxrEiXpqwg$SNA-RMeYT7S_1gH==4`?Xs|BC6ZYCEG$`}cUt85gC)xe zOB!gF)Dw_88l;wh)X*T+1f+@vsYF&)z?&B{h)ozkkTQu5Uc)Fbd~g1zuY!7f!(2h=mv9(BFi25%RvP(D>Y zQa)6Er#z(GtK6a7qSmO()KaxrEl_jR*{Vl%DWAi&`rFDsDL++yq`as+qdcx$uUw^E zq8wG?$^m6ci6{+9mEu2m3OsZ(l`R!MczGHJ0?DCJ11h5Jwu-Do=u)?kK*CPzoWeX`=8B#&4A5-&4A5-&4A5-&A@-20giDvCGe{L_>um2 z1wB0AWj6y4z@7p>OgvvoJb#dQzKCEPctL+WuRosCAJ6KK@9U3e^vBcs<0-6vANXG4 z`6Pbc3!X?kAIHyoz+;K$qxg9@cqH+B7(b7L?A!0n0WxA5~ia9iSeD}G)JZb>|E#?NcO zHxtjB@bhYLW8!%ON@fqZUVj|ZAJ^%RYxT!9`r~T!m;zT}#lzsr#PbULjDyP)&&%-h z9B^skc?nWG8(geEE<%s9z=itb0`xcp&etDD(c>UEPk)??9tXfT^v4nOh=RlVBd$Nr zaWM`@^la>&h22BgJ&4@{$erAe+}+dI-G|)Gd$GF*yHnVWVK<81N$l=M?#>D9MvxmG z$L<(%M@F%`3%SEPu^Yzj2yzF8kvlkqT@AT`5O#ye-7$#W0CKnQK~2TymVWG> ziQG-wu)7tzXJB^=a{D%8cN21Z`;gnyi`-c~$X(lw-Hq7o!fq#aHy~GCkKGRJuEXx> z*low|TI{xAcMWnITd~`M+?CDPU5(roP1rpRxyx5!_f+H-G-7upc2{6`IdUr+uv?GZ z@;dC+B6nF0cB_$FR)yV4&rk zaW6aJ2|stA^cH)C=f}=xxy#u}=WPn$rlhCYUeANhZ^-X+TcumrTF+I^Vfn|>5zjvE zRMzV}ohxEKbuJYj7H?4J$lsC=$i1>(=HRNiRhkFay8*a&kRkpX{}DV%-{k(S`x*DO zZkOw0*H2vEb{%kayGq!nS(UCIN(xo|I{Nt`3(@vkapySKq_7izh8l$Vs4 zyNkbNWN0uCAY{0(#O)7QjMf|e&^ZfImN?>zY;|EY5aTq7{A8-3-|r* z^SHmT54zrWJ?*;6wbRw)%4YwSeU5pZxt-a^tY_vsKXE!7zjWN|I7hig*ug)|*Sl-f zDm4!GF?Oq(@}zLN{3NF+o82YKI`>@nUzOX1{pq9EY_`yua`Fww059uzrXPOa4IZ{Y z;qX9*9tRIupm5}%L+=6)TA*-Hp+oNk_ZP4Yj`VX-yom<~pSf%ul2Z1C_kw$|(7NfG z(7Xo=t=p~%;oUgVv@^1V^f*?vZp$Wwcjd8F4%%_`UT~)+*Kj1H=lXi^Z42}mxSb9? z2EJv1!ts+1y$;-Jfx@Ac4!suKY=Od2mkzxK++=~m0htcH8r(3CT|p^KeMcLP+=;R# zOVf}Z!%}N;8q({q)LNc~^je&7T7eqkYZB#6Px$ItY@s9BT;ROHl4Cf7py&87xWWR3 zlM6aD4lc7m;k<(mJqKJuS_G#gIjrB2)_%_h7m+|XTcHBa0vC`#IFX?O4}qg35YBO^ zz=Pmi5(uY1RNw({WDZ;GNIeLLbE8DFwzO+}5Den^Y)yKb*JbDAL0Q^43znUYMb-*} zMQ7#1UW9%m9zBHBtc@M39rUslP%Zt#r30C4sUx}nk1rBU?pI+gN*;~xp3a6vmb&qe zVY~Nv*c^v`MzMLX#O68@2jrXgh-?;|BBGCvrpTx^$FK<5v^ko^E=fr`@p;iCHi$fl z-MpKOW#-vCqyNb{U-AT93|$!?R(%(8Klf z>fsTY%|{{n2S3APii1Pc6bCgD76?&cfglb}u>v2A?--oL7A1_(0|KcwY~O)PNH=fm z04_QV+q#`hbxS`r)h%a|uua==L6HaRo3`RW@@Re28Mw}pMQVInvnAEWzRlPytlqZ? z*A)EmOdo#5pUm`Pg#MvS4^E6cXkXhs7Y@QR9JR0Ah_hxrY+u`jYa(&94nKhD#9$&6 zefF}Um~C^M_{d#dkBcIC=&p9)faI~ex=xSWa`3L6K96m5%y{&!wkP>f*WxCfe*CVs zm9QIOYd!gADr?9RZEU3$d}9jW<+UViSq&AoteS+CRZ(GO zmDp|z75a2wZUwIGRxT34axAoxkq|D!LhE3W5SEda75k}{6)z=W^OsOz^G_jRMWs|& zQ3(n2EvCYJi%3}ELMp6q0q&Ahj`8z~bK!KCc95Spf5xFWuV}`hIL|lZaGO_%dnWT# z9S@he^Kj$E_03z5GF*D+k~#9`n`5Lmk2Xenb5lFb9Ix3?X6Kk4Wma~wqg1l6rKUM4 z$M$k2#Zox~*A4nXzdVP^w>(>5GvJsHKSh{@tusDAP!+Zy(Osg?4is#b{;`3~vl##% z`g_=1V4V7^Y!OI3_MgQTLx1wS0zqL5L2`1!OKd(cPyTU4iKBn~o;dr@VJiUb@E<1z z7oEBE=__3Rq2K=pv(ne4c8JY@&4A5-&4A5-&4A5-&4A5-&4A5-&4A5-&A``(0rdO- z_WJ+pQ=WECYzAxwYzAxwYzAxwYzAxwYzAxwYzAxwYzAly*ysN=R_rjF0h_WA$Ut32)8*bLYV*bLYV*bLYV*bLYV*bLYV*bLYV z*bLAZu+RT#tk_{T12zLT12zLT12zLT12zLT12zLT12zLT179x&?DPMxS9#jGu^F%# zuo4hgU^8GdU^8GdU^8GdU^8GdU^8GdU^75t0ImN;Hv`mK z<+n;yIxfxftP?L4F5=&IGu%ez3g@TJZs+MVO*_nHfX)E>P|jw*Bfc>_9@6&pOpgsl zMq9L@@OU^Dj*JiJuj9jO!lPPyXrP@2Qk%P5n|fP)?HgKJxA?Ywp*Z?w(Fgx^Zb--X z`%1Qv$@Z7Vvt)NpGc>b}Zsvx-m_|2FIf-#e&6Ajffc?Ja&W;Y0*A1P`O+Brp=Qc|2 z9KYXjp+6QF9M!B@xBBITF}+QzJ6b6@m&FpDmoyUFL;aB7-qyC(ZeLe-`}(HtGkoh> z&+s+%^>(&zfYGjR-OvlIg8%zEI+iA4>6(n}35T@FRBZ#JLr@`fx2|dJZr#w_+T+`1 zXta*U!m;W85;FisQJPeN<<{5Lf{1`LG&i-h5~7yYj@G2eFh(bE!=|S0=Cw`TC6zTb zrKZ6aUJaEsQ=_BP8>a%J;i0e=qD4TKhoQF)){-P&Mve_>Q!uDSqv65uD9WNqs}*Lc zgK4;AmQx8t4W(x~8q>y13avqiN?%g@%W&Bd2?kL6?2hc6IRgf$IWjsmHlB`?#nSjP zk2_}owyOc$uCS%S!1%Z}*&GOtXanh{>#fWRl*m?Q70(z?N}IFlz`B>7dVlGWJ`uOL z^ZId%vuauW9N{bL z0W>SG5s=pY>5aU1dII*6Mo(oVVYIy7@R$~j1;!@&eW>&3ZC?+2QrKUin&=nYIm=2N zhgDn?jbu@L1IRG~bi>3%vG#3f-`Ho4JO;*8N~vCkERiud#uy>G$(D}9ly1@{qp+c+ z_56nc@6IVLbsSlN>!A^u9zE$3$T~<0Q)-|gNG+r2%GM{x1dYPUI&s1+uE0B({^}?F5;~a-~j-(vn52&<*BJ zVsKLPB*xK*FFmrB)jR3tWG9`%meo!d*+8t~lqO;oeYvKh+nlWBUtlIOV;Lm-I^2(; z`4sy1C8h-bSP$PGMcnlJR=1~513LoISm$6=o7|(pX;HH0P0SX3Ev;*s`Z{`j!Kq2y zVq-=(4I6ocapzRzJK}}7ne=F}Sa^IGx9P-uTMuE$`jn2t)d)}bb%mK4ZE2U2%UQC- zaR#nA(cN&4rVT{3-Ba2)oVAf&hNw3dVaYhG{7a!`X}rzh&dJYr9M*803EL76ClSZC zL}*HtON4x7HEmO1bPATErFQCrBwqi6OM$vUy43Trr<1R6ALL$UJDA&G;8*_dyjhv< zEWe+>X!D-1winISy8^KhJOYNbsMVj~c~g7qW}j8&3q)mcb9?Vv*lwEpx_jC;wWed5 zdJy5IyWS}x|K;kvb?K|Vjc-u(^K}JH#aQ`Z2rN6zQt!Q_Q6M2nVC(PkJMbp zMv}UE{wzg_&|OJP`-Tm06?!^cccw9ckZXG2vObB1nW2 z%2JEnQL|#m;)#s?B1S?}XR*_3zy0C%HnJ9!4uhdNrpRTTd5;{hGkaK5{Lz6 zTm>chL9lGHDx_JSprF&Zf)6_78B>?28GN>@n= zzFd!)jKefFIm9LgtYqc-62t62xbik8%c;3DmN~?zZvgddoMKmPir96))5C6UNQ0e0P#ZAc zP<=2q9+P#$6lc!VSWE;xDr$2vbzo_k@45kS!B9EtWJb4W6WVwvFdjRJ(HSQgtt z_MhIewDS31+Y=?T^JTUGO}Y~mG-=!a-GvBY7n%_E`^@fThR);vU~gmYJdyiSi9M$U zirYT?Xh&x{DP4>8&|=1wntk|TAAWqPosNHS3TB*Z{QvLp!~XvNE8pa>6SNty8L%0! z8L%0!8L%0!8L%0!8L%0!8L%1n${DcN|6e)fc7iqoHUl;THUl;THUl;THUl;THUl;T zHUl;TUpWKz@Be+}l-mi~4A>0V4A>0V4A>0V4A>0V4A>0V4A>0V41DDb*ysOWIpubO zHUl;THUl;THUl;THUl;THUl;THUl;THUnQd1L*ue?vQ}`minyvP4%d{TivQQsf$!e z`B?o>c}IC!c~H4g*{}2{)ru;AD*smgsry2kxJ_?{c5#-sSFc&v!exce&@d>$&}0i0kB*a|<}h^?~bU*KyaS zt}$1StI@T{rLZ5dKW86euVeSHXRzOgB@{GSUha>LM5dyF@sNLVB1*!FFBGTeu3$e0N*w|>5txL(WEj&X%XUU1Q*{?z)db}4 z2}vPXuDY5i25ZL~j}xVbRVW=0HBy4u&VR=ztNc zcgSMxpdl&L=+>G5Z^)t=Fja$e)g)jL0f@YWw9&xy4kL!#00)W;04d7eLF8n+p^`PA z*F!zyTaDn%?Rurfk(i<0ev9o}41D34blXjUcbi3Zlc8F$Rj-cYT5NA*a+iN7Ff|&B zCdFsy4Kp|rh(!IdNMy8Ze|W+aFW92@5@cnDJr^o46P3N0$bFxYcIGBMn>cbaG^0;% zRnx)fV6Oqq=+y&v2KEGcjKItuT_2ehon?d;bn7O!X|b+#-GT98t!yG%vDOeT+{l3j z*keF3`oYLS_yer)uPj8S#$yDmuuG>D!kR*%N%&V7v?u|X*NNJ>z+vMDqQS}VM64`2 zVy08LL63ltry8zOW?G9 zT5u|+5u$avs3j8IrA?yV#?&f2Jz>ODG!_~2n^u~D#qAtuM7fBJ@6jgl4?cam+hEC2g<(r!Jv~Pz zz*}cgEjLwb>8d8cTVqjOW~x@xRZW1m%A#6ks#elfO~8T*osk-n5Pfbi*NA3eIqElf z&RPam*fJevEd(p9Oov$~P8OKgZ^>1$VNT&vdag`>cZo%HzNvZ&UDX75OD(EJrfLaY z)dYAKTU33f>LR+T3Ggnos1};43+SpQAg?%Wew}A1&!5kMDp+oo(na$P6H{C?^Rzh$ z^36PLPJ#+&o)DX$f_eG~Wlju8lhQpQ>UzEus7ernkmW1OU_Qs zzgw$7h3gkXk}JT9izMi`4q7_I-; za$%tUT76NyO+8NysqN}wxcdL2@>AtL<#J_A*{GB$bL3Cpy8ll3EP0b$CcC8HNI#Tr zmySvyX|1$S5?$Q|0MoM{Fb<1+$^pTy~6*3>-}eh8-%ljZNe&H zt^oLd;h*R4;m_rRaJ`@J{dEn9IkuOer0epG8OWpzd%|R+ZXc~iIv3RqPNj0 zpiQw!&2Q|j=({{+6XV0+DFeDV4i~#CAQW$aoe1fV!^LkKM2>~`X>f-aZK<6IUlxaJ z;dT?R@4lT#!3Y1)7~HMHR>w5|DCBTFIE~EZ3~O`aaFL9*A@m6jAzKuO%j6YMmRQmI zL*W3NIYeXOAY9$2L^3Z9m&<7D!~o*0h7`bpI9xTOA~gZ>x0=?(bdpY)4Ok>+H^;kp@Z5#ybjl&r#qav`M8oPdG*3>tiK zxIFelS;|xt*N`M6HxAdyr24%{b+|;Ps+*A9I9w}}>h~no;WC-3ZbEY7aJ@{b-Wm5gFq&i$6Q`JpKZX7O-N%cFE>TpF&RW~6E z<8Wz=R_bX7DtJM)*NAFC9IlY{gBNn)Z-v3-GJ;tb{#F=VG$WXG;ZMRA#^DMY8JBjh zLgE(0;X)ckXWbwmVe{i~RgG4+Z%TwIgt*Co~AnwqL^LUQA9MNO(-n^cDjX{x#j$&JIsG^u_~QXMX-sp=*q zH;$Iq1a(&@)!_o0s%}CS#o=;$1uUMls;KYt>@nh67>Da_z0Q(#F%1XT;WO_-rNjr9 z<_Kr4jh6Tp#o=ll8JJcbEx?6wxPaH|?FkL^#^D;CII5d6@|YWk>vxjN!-mWkM~ik^ zH8df)aky+J)#FKZxO}Ion~>Z%T*;H_=OoqPVxFpQLcDRf#3k}|wxL}Zhl_sN8KjBu z#^DA4p?p?S8SVhklud*;jy3||7-o(`hmy*0D}bhKBD`_9D?lh8Oe({z0h+Rj@W$ab z0ik>#sSNiAXv!u+bY_6loubqEIWylWa{uJ~t@{A?J^na*o$#9TW$tEnpYv|_4(^C} zh}|lD$9b{4l^YRvuq%bDoe}pEu|=5XI@o#6Zf+U#xwBe*lYLbEKKK9ftN0RrHvcRB zCDAWt3!e+W7Y2oOLbXsJaPXvmzxy-yd+yiVnOu(RbJy=&KXpCsy4iKEYn1tb`3ds~ zb0c$@5uEu<*m0%u7x!+VMZ8oP7nTWs72a2WC`Q!piCg$L#Wt~4cwKl%xJi9L?NS~P z&V~CIP2wCOkAGD;+r16mU8v>WQC?DF?k@gbei45)uc%ilA^A#qm)s&3NFPgQN;Q(= z`JHE@=M)bk{z?$tr}6LcWBeNTFWmRL&*T2WKInSi^|b3M*G^ZHE1UgS_BrNt=5}Tu zvmUbbiPPcurQ=@5Im$J{4*qGr-d&?ssd2Rw-l5QxCxy%9Cpksg>@HE(x#zn7s@yK@ zPoK&=9bm+1RvBs?x z9xSx>gbB^NaiVG6UqX5utJ23{a918%<#5tQUT~+tX2DFuEixxPx7UMjt89@D(f8LF za69{Rupyn8W8hm@kSxsWz-`G`lW!^49{?->x&X#T7hDH!r3ktvC(wHHp%uCww(7ZTbQc{K)MB zH>8)&VQ>W&Bugg_E~nEH2bV$U`6*599B?TedJeb*LiZ%0XM>A#Sid7J{jJ%@f2G2i5 zya667k(Gdo+;S#0xUq#AymB=)c*SYd;N_>{(znzmJen0W;#zNQE4pkYmRTE%E?bdk zEhI;}Y&q46ih62rc`Y?~Sv57dtP-bd$%@{S&#l1aX3a}NSdN9(%p`=%0B|Mh5P4yx zO&6T}n#vjsG^$&uv6X6mV+#Q6-y9}vWiu7Fay5kgG6`GJM1`$54ZH%Q>oP?FvQDNn^ z5ccCFY*`HzwyYY$zMX`XRZ(GOl@NBwN`+B8m+$#`ZKu3}- z9(o%ci8};t=qY#THwQTQz5q{j@K9#yBTHa6;rIeq`PQKC|IgxH1Kexs@6^}%XZS1C zht!+YbNHwlQ%BSub)~wPnC*Un|2zK?|9eP*{m*8=X252^X5hau1N7YzxE+djE$H_Sz^i!I zf_jYrypqM1I-Hiv1K?#J+vs${iOvjH2EY#s*%eMFn&40m{=rKN**2&1B-aDL4;HcQ z25RO@0pLY1yUc;Cv0McJFU)3(9L|&r0N{DN>1G_(TaW$0bJ^??2Q(Ys^YWBE?Da%gvec*faQoIj5X@TAgo}feT z1&>>x_khRDNn~%I`I?eP8) zIMug(N2;%HbE+@LYhetYLs&xKaf2lUo+?;E?gS55LaqmQSVE40+btn*o7@s|Ex5%J zat-*VCFE*wqb1}pxY7~=w|Fffa3^;bTj(G*Y{`JLz=dSMA#gq!a1fkF1{?t2AOohr zRVqv+Ig8&tP5O6EkpA#E=^q&-{ewfKKM*4QTlz`=<{0VUw2kyPwvzsp&7^-t6X{>R ziu6}BkpA*I(!Z>R^p{nU{$fArpTC6k7nPEJ-(u2VxRCV2H6>dJl6>`c_0RtXaeKwViBB6xX2H%=k3fe6a2rFA%~A8!n}>Jt%!P33Ix;g8jvbbj z=j47$VD3Chpq!BfJL9B!;^WjwTBtV{cSnhD69;f?#{IFxXM$Uc**1s1N}cfww)F~I zkieh|^oqph19Rbtvy4CL>os2!Yw*Nk7k6Zdr71SS@?Bpy-t3#%ygw z@+n;h4oLZcZXNDR_3tmY<4A(mPv}m^mg(zb*F3h-;h6Cwy7nBl0yxrd+q0N<;tN6e z1!1S29{S?a_^uFrH@E@k9)pt~VxEER#DRUAlJDwTymw0fEOQHvh?H&KjcH8Ty-uxj zbLa!&J>XHg03Irf&Zj_^^I^{Urt@Rx!|rF;^Z5+-x5a;RJuH^7W9|!G*RmV=zq)se zZ@Bi0nQSfp8}}CRG1qqCGd7=pRlG@f*L|vMH4EIuu7%8R)dyWaRgb~b^S=uh3RA)k zk6Sz{PKy2FTH!U}5%piyU-CWh9zZSsD1R$|k^2vBnfnBO-~VIoQSKJ*0xs%O*-zQ` z*q^YEv$w&M_9vKcF&8`EaX!!N;g|Alo;jl8JShB=c#*hQeO3I6`mFela1{Q!zzc9M zpiQh+A5pg}uZupd@eZuK1UY!x06t`JJ$jfGqJL;O~LuKR6h>(ktI z+$6W2E8!T|ui?!Fz`o5s#$LgWvTcmUoW|rs9^Y`@=RB%BDLRD-{xfH#v%m@X47F9g zP;FEXs1uGqDQ}9W$RD{mX zfCZG9Ab46h3Ou+;fTt9uFgYfJ@4-r0kW$C>JDX3!P&eGCcQYCKJp~tl7dx{Uf7)p) zc${al^kaRh_)&!^!s5h{zUxD`7|q!_?4+sG$#1L+{UL8fLhz0q#SkNxiHA?nNT&$qlYi;2tERod|HYUoYW&>QA5E7A$ncelayI=kedTS9gW z$*dG6WY-~?mBWPWT9jZKi3#B~I>XciuSN{xnryu}4}KH^SMp22d1>|h3KW{GotIN7 zxD0~!CP9}{L6<<#ND_206?73#4ZeaJdKoqJ5^Cs0)X)p4p+~8q=TbwDAWo@Q9zZ;o zsYz=+r~?G&c$pgNiObnYU@dl}a#k)=2TxlpC)`MK2&q_`4H6v8W-2Jx91dhM{?yYA z+jD7uys;fo6Rfr|Cs#fn&75 zT{%pZ^%N12G=HX&D4MAxe8MeYzSUL@1)8?f4A5wSL0aG`w7?Qt;3CglkYzRHOd9eu z_^Tka@KaGPEobw%%WXvU&Du9%$x0-#R#7Zjq1REe>%o%cw6yDKfwi>2YFc0=O3h-r z-Un9XF%4<9>!NZbvKp_8mLZX~9qFPnTKe$#mpzEdCl1%({R0?$((4EC_5pj)tT3&# z1klZcaTC%^gP>anJ4{Fu4RRWUG@6iAGzhwFkY{01uLMw#Mx)?6nl4-`FZTH~i#gKiRBZ$g&PAm|ps9urbZgPGTeSsUyT@u{)&l8v& z{jxxT@;X?pGdUN&)|uAlLtg<>&x0?Srn_yvyj*U-wng%-FP zo&WFS2LV6GPpKcP|E9jHzOFv0-ogJsy%gSKA5u4}ZE8Kd)1Ik(s(hflt-PVUqCBfS ztlXgNfxij3Mp>ZDRyg_3@~`C|%TLI6$QSeX$VcS;@Q!_-TrZc%8Peb2x&OP;|Bzmi z9+&QxZj>&O&X#sdL8(t_lNzKYQh}sO4$nuP_dRcVe&l(|bHC?i&t;x-Ji9%Eo*qw& zr^d6$ljGsVPsKlqZ;P*q&xj9*w}_XEak#S(gugMcPFy8ciC&QrJ`nyzctdzzcv84W zxJ9^3I9E6z>=L#Lok9zL8UN41a-m$v6?p!0{$rSJ`=8B#&4A5-&4A5-&A|UL2IerO z4r6OT{}I*QXkkYNC4P!>3)*X;Ueo}uqP-T{H4X4e22*Oeqyb(oU>aw>qVYpx!q{iL zeJE0MSz{z%(C=b72pMP+Pc?#D-fC7#La*`$=A8FnBvr10pPI86sO(^C^qM) zJ?2}M$`qws*#OU@_~_F`G@-Aj8g-a>l6NqTQ2y;qUmD@pI= zr1w(Ndok&~ko2BUde0-h-;kNYHYez}6zB?ZkHn)=Nx*c?VvZ&$ON7a@!X= zz(glP)MG=`w-^`V5qD_8-)p?!mA}5^Mwv=nNI;n)?;~`hwLbke!bVg9talN*Q0XOa zB6J{c@*cuE)Pv(<-Hw#4cMwiTrX+44%w-y9ynxV-R{fOg2dKy_w+}jTI+nW!8&E#U Xn+IozOpbop4m^d7#L`XX+uHvPgNTz6 diff --git a/cosmos/scripts/chaos/chaos_script.ps1 b/cosmos/scripts/chaos/chaos_script.ps1 index dffd12b9..b5947e6c 100644 --- a/cosmos/scripts/chaos/chaos_script.ps1 +++ b/cosmos/scripts/chaos/chaos_script.ps1 @@ -1,31 +1,3 @@ -<# -.SYNOPSIS -This script introduces network faults into a Cosmos DB environment for testing purposes. -.DESCRIPTION -The script takes several parameters to configure the fault injection, including the endpoint, master key, database ID, container ID, duration of fault, drop percentage, delay in milliseconds, fault region, and wait time for fault to start. It then uses these parameters to introduce network faults using the Clumsy utility. -.PARAMETER endpoint -The endpoint for the Cosmos DB instance. -.PARAMETER masterKey -The master key for the Cosmos DB instance. -.PARAMETER databaseId -The ID of the database in the Cosmos DB instance. -.PARAMETER containerId -The ID of the container in the database. -.PARAMETER durationOfFaultInSec -The duration of the network fault in seconds. -.PARAMETER dropPercentage -The percentage of packets to drop (optional). -.PARAMETER delayInMs -The delay to introduce in milliseconds (optional). -.PARAMETER faultRegion -The region where the fault should be introduced. -.PARAMETER waitForFaultToStartInSec -The time to wait before starting the fault in seconds (optional). -.EXAMPLE -.\chaos_script.ps1 -endpoint "https://my-cosmos-db.documents.azure.com:443/" -masterKey "my-master-key" -databaseId "my-database" -containerId "my-container" -durationOfFaultInSec 60 -dropPercentage 50 -delayInMs 200 -faultRegion "West US" -waitForFaultToStartInSec 10 -This example introduces a network fault that drops 50% of packets and introduces a 200ms delay for 60 seconds in the "West US" region of the specified Cosmos DB instance. It waits 10 seconds before starting the fault. -#> - param ( [parameter(Mandatory = $true)] [ValidateNotNull()] @@ -57,6 +29,28 @@ param ( [string] $waitForFaultToStartInSec ) +function Show-Help { + Write-Host "This script introduces network faults into a Cosmos DB environment for testing purposes." + Write-Host "Parameters:" + Write-Host " -endpoint: The Cosmos DB endpoint." + Write-Host " -masterKey: The master key for the Cosmos DB account." + Write-Host " -databaseId: The ID of the database." + Write-Host " -containerId: The ID of the container." + Write-Host " -durationOfFaultInSec: The duration of the fault in seconds." + Write-Host " -dropPercentage: The percentage of packets to drop (optional)." + Write-Host " -delayInMs: The delay to introduce in milliseconds (optional)." + Write-Host " -faultRegion: The region where the fault should be introduced." + Write-Host " -waitForFaultToStartInSec: The time to wait before starting the fault in seconds (optional)." + Write-Host "Note: Both dropPercentage and delayInMs cannot be null together." + Write-Host "Usage:" + Write-Host " .\chaos_script.ps1 -endpoint -masterKey -databaseId -containerId -durationOfFaultInSec -faultRegion [-dropPercentage ] [-delayInMs ] [-waitForFaultToStartInSec ]" +} + +if (!$endpoint -or !$masterKey -or !$databaseId -or !$containerId -or !$durationOfFaultInSec -or !$faultRegion) { + Show-Help + return +} + if (!$dropPercentage -and !$delayInMs) { throw "Both dropPercentage and delayInMs cannot be null together" diff --git a/cosmos/scripts/chaos/chaos_script.sh b/cosmos/scripts/chaos/chaos_script.sh index 0281b76b..47dbbb2c 100644 --- a/cosmos/scripts/chaos/chaos_script.sh +++ b/cosmos/scripts/chaos/chaos_script.sh @@ -1,5 +1,10 @@ #!/bin/bash +if [ -z "$fault_region" ]; then + echo "Error: fault_region parameter cannot be null. Please provide a value for this parameter." + exit 1 +fi + fetch_host_port() { url=$1 # extract the host and port @@ -30,37 +35,25 @@ install_powershell() { # Start PowerShell pwsh } - -print_help() { - echo "This script is a network fault injection system that introduces network faults such as packet loss and delay to specific endpoints for testing purposes." - echo "Parameters: The script uses several environment variables as parameters. These include endpoint, databaseid, containerid, wait_for_fault_to_start_in_sec, duration_of_fault_in_sec, fault_region, drop_probability, and delay_in_ms. These parameters need to be set in the environment before running the script." +if [ "$1" == "-h" | "$1" == "--help" ]; then + echo "Usage: ./chaos_script.sh [OPTIONS]" + echo "Simulates network faults by dropping packets and adding latency." echo - echo "Example: To execute the script, you would typically do the following in a bash shell: - - # Set the environment variables - export endpoint="your_endpoint" - export databaseid="your_databaseid" - export containerid="your_containerid" - export wait_for_fault_to_start_in_sec="your_wait_time" - export duration_of_fault_in_sec="your_duration" - export fault_region="your_fault_region" - export drop_probability="your_drop_probability" - export delay_in_ms="your_delay" - - # Make the script executable - chmod +x chaos_script.sh - - # Run the script - sudo ./chaos_script.sh" -} - -while getopts ":h" option; do - case $option in - h) # display Help - print_help - exit;; - esac -done + echo "Options:" + echo " --endpoint ENDPOINT The endpoint to target." + echo " --databaseid DATABASEID The ID of the database." + echo " --containerid CONTAINERID The ID of the container." + echo " --wait_for_fault_to_start_in_sec The time to wait before starting the fault, in seconds." + echo " --duration_of_fault_in_sec The duration of the fault, in seconds." + echo " --fault_region FAULT_REGION The region where the fault should occur." + echo " --drop_probability DROP_PROB The probability of dropping a packet (0-1)." + echo " --delay_in_ms DELAY The delay to add to packets, in milliseconds." + echo " --help Display this help message." + echo + echo "Example:" + echo " ./chaos_script.sh --endpoint http://example.com --databaseid mydatabase --containerid mycontainer --wait_for_fault_to_start_in_sec 10 --duration_of_fault_in_sec 60 --fault_region uswest --drop_probability 0.1 --delay_in_ms 100" + exit 0 +fi if ! command -v pwsh &>/dev/null; then install_powershell From 017bd868104e2dda7b8142102b08921d98f7bcc9 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 10 Nov 2023 16:24:37 -0800 Subject: [PATCH 04/58] Updated the help/usage --- cosmos/scripts/chaos/chaos_script.ps1 | 50 ++++++++++++++----------- cosmos/scripts/chaos/chaos_script.sh | 53 +++++++++++++++------------ 2 files changed, 58 insertions(+), 45 deletions(-) diff --git a/cosmos/scripts/chaos/chaos_script.ps1 b/cosmos/scripts/chaos/chaos_script.ps1 index b5947e6c..dffd12b9 100644 --- a/cosmos/scripts/chaos/chaos_script.ps1 +++ b/cosmos/scripts/chaos/chaos_script.ps1 @@ -1,3 +1,31 @@ +<# +.SYNOPSIS +This script introduces network faults into a Cosmos DB environment for testing purposes. +.DESCRIPTION +The script takes several parameters to configure the fault injection, including the endpoint, master key, database ID, container ID, duration of fault, drop percentage, delay in milliseconds, fault region, and wait time for fault to start. It then uses these parameters to introduce network faults using the Clumsy utility. +.PARAMETER endpoint +The endpoint for the Cosmos DB instance. +.PARAMETER masterKey +The master key for the Cosmos DB instance. +.PARAMETER databaseId +The ID of the database in the Cosmos DB instance. +.PARAMETER containerId +The ID of the container in the database. +.PARAMETER durationOfFaultInSec +The duration of the network fault in seconds. +.PARAMETER dropPercentage +The percentage of packets to drop (optional). +.PARAMETER delayInMs +The delay to introduce in milliseconds (optional). +.PARAMETER faultRegion +The region where the fault should be introduced. +.PARAMETER waitForFaultToStartInSec +The time to wait before starting the fault in seconds (optional). +.EXAMPLE +.\chaos_script.ps1 -endpoint "https://my-cosmos-db.documents.azure.com:443/" -masterKey "my-master-key" -databaseId "my-database" -containerId "my-container" -durationOfFaultInSec 60 -dropPercentage 50 -delayInMs 200 -faultRegion "West US" -waitForFaultToStartInSec 10 +This example introduces a network fault that drops 50% of packets and introduces a 200ms delay for 60 seconds in the "West US" region of the specified Cosmos DB instance. It waits 10 seconds before starting the fault. +#> + param ( [parameter(Mandatory = $true)] [ValidateNotNull()] @@ -29,28 +57,6 @@ param ( [string] $waitForFaultToStartInSec ) -function Show-Help { - Write-Host "This script introduces network faults into a Cosmos DB environment for testing purposes." - Write-Host "Parameters:" - Write-Host " -endpoint: The Cosmos DB endpoint." - Write-Host " -masterKey: The master key for the Cosmos DB account." - Write-Host " -databaseId: The ID of the database." - Write-Host " -containerId: The ID of the container." - Write-Host " -durationOfFaultInSec: The duration of the fault in seconds." - Write-Host " -dropPercentage: The percentage of packets to drop (optional)." - Write-Host " -delayInMs: The delay to introduce in milliseconds (optional)." - Write-Host " -faultRegion: The region where the fault should be introduced." - Write-Host " -waitForFaultToStartInSec: The time to wait before starting the fault in seconds (optional)." - Write-Host "Note: Both dropPercentage and delayInMs cannot be null together." - Write-Host "Usage:" - Write-Host " .\chaos_script.ps1 -endpoint -masterKey -databaseId -containerId -durationOfFaultInSec -faultRegion [-dropPercentage ] [-delayInMs ] [-waitForFaultToStartInSec ]" -} - -if (!$endpoint -or !$masterKey -or !$databaseId -or !$containerId -or !$durationOfFaultInSec -or !$faultRegion) { - Show-Help - return -} - if (!$dropPercentage -and !$delayInMs) { throw "Both dropPercentage and delayInMs cannot be null together" diff --git a/cosmos/scripts/chaos/chaos_script.sh b/cosmos/scripts/chaos/chaos_script.sh index 47dbbb2c..0281b76b 100644 --- a/cosmos/scripts/chaos/chaos_script.sh +++ b/cosmos/scripts/chaos/chaos_script.sh @@ -1,10 +1,5 @@ #!/bin/bash -if [ -z "$fault_region" ]; then - echo "Error: fault_region parameter cannot be null. Please provide a value for this parameter." - exit 1 -fi - fetch_host_port() { url=$1 # extract the host and port @@ -35,25 +30,37 @@ install_powershell() { # Start PowerShell pwsh } -if [ "$1" == "-h" | "$1" == "--help" ]; then - echo "Usage: ./chaos_script.sh [OPTIONS]" - echo "Simulates network faults by dropping packets and adding latency." - echo - echo "Options:" - echo " --endpoint ENDPOINT The endpoint to target." - echo " --databaseid DATABASEID The ID of the database." - echo " --containerid CONTAINERID The ID of the container." - echo " --wait_for_fault_to_start_in_sec The time to wait before starting the fault, in seconds." - echo " --duration_of_fault_in_sec The duration of the fault, in seconds." - echo " --fault_region FAULT_REGION The region where the fault should occur." - echo " --drop_probability DROP_PROB The probability of dropping a packet (0-1)." - echo " --delay_in_ms DELAY The delay to add to packets, in milliseconds." - echo " --help Display this help message." + +print_help() { + echo "This script is a network fault injection system that introduces network faults such as packet loss and delay to specific endpoints for testing purposes." + echo "Parameters: The script uses several environment variables as parameters. These include endpoint, databaseid, containerid, wait_for_fault_to_start_in_sec, duration_of_fault_in_sec, fault_region, drop_probability, and delay_in_ms. These parameters need to be set in the environment before running the script." echo - echo "Example:" - echo " ./chaos_script.sh --endpoint http://example.com --databaseid mydatabase --containerid mycontainer --wait_for_fault_to_start_in_sec 10 --duration_of_fault_in_sec 60 --fault_region uswest --drop_probability 0.1 --delay_in_ms 100" - exit 0 -fi + echo "Example: To execute the script, you would typically do the following in a bash shell: + + # Set the environment variables + export endpoint="your_endpoint" + export databaseid="your_databaseid" + export containerid="your_containerid" + export wait_for_fault_to_start_in_sec="your_wait_time" + export duration_of_fault_in_sec="your_duration" + export fault_region="your_fault_region" + export drop_probability="your_drop_probability" + export delay_in_ms="your_delay" + + # Make the script executable + chmod +x chaos_script.sh + + # Run the script + sudo ./chaos_script.sh" +} + +while getopts ":h" option; do + case $option in + h) # display Help + print_help + exit;; + esac +done if ! command -v pwsh &>/dev/null; then install_powershell From 65c01e6b1457e3ad9ba534fe7fba626e1c91ac99 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 10 Nov 2023 16:30:08 -0800 Subject: [PATCH 05/58] Made fault_region env variable mandatory --- cosmos/scripts/chaos/chaos_script.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cosmos/scripts/chaos/chaos_script.sh b/cosmos/scripts/chaos/chaos_script.sh index 0281b76b..b0aa3dd5 100644 --- a/cosmos/scripts/chaos/chaos_script.sh +++ b/cosmos/scripts/chaos/chaos_script.sh @@ -62,6 +62,12 @@ while getopts ":h" option; do esac done +if [ -z "$fault_region" ]; then + echo "Error: The fault_region environment variable is not set." + echo "Please set the fault_region environment variable and try again." + exit 1 +fi + if ! command -v pwsh &>/dev/null; then install_powershell fi From 448c43d5bec8b177147e97fe30fe7345cece871e Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 10 Nov 2023 16:38:20 -0800 Subject: [PATCH 06/58] Uninstalling Clumsy utility after the fault has stopped --- cosmos/scripts/chaos/chaos_script.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cosmos/scripts/chaos/chaos_script.ps1 b/cosmos/scripts/chaos/chaos_script.ps1 index dffd12b9..fdd4ba7c 100644 --- a/cosmos/scripts/chaos/chaos_script.ps1 +++ b/cosmos/scripts/chaos/chaos_script.ps1 @@ -169,4 +169,7 @@ if ($durationOfFaultInSec) } # Clearing the fault -Stop-Process -Name clumsy \ No newline at end of file +Stop-Process -Name clumsy + +# Uninstall Clumsy +choco uninstall clumsy -y \ No newline at end of file From 96dc12c3e87c1451b2b670a550d75a83084a94ee Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 1 Dec 2023 11:35:24 -0800 Subject: [PATCH 07/58] Updated the help/usage for chaos_script.sh --- cosmos/scripts/chaos/chaos_script.sh | 74 ++++++++++++------- .../update/100-thousand-rps-update/README.md | 2 +- .../update/30-thousand-rps-update/README.md | 2 +- .../update/50-thousand-rps-update/README.md | 2 +- .../update/500-thousand-rps-update/README.md | 2 +- 5 files changed, 50 insertions(+), 32 deletions(-) diff --git a/cosmos/scripts/chaos/chaos_script.sh b/cosmos/scripts/chaos/chaos_script.sh index b0aa3dd5..9e236100 100644 --- a/cosmos/scripts/chaos/chaos_script.sh +++ b/cosmos/scripts/chaos/chaos_script.sh @@ -31,36 +31,54 @@ install_powershell() { pwsh } -print_help() { - echo "This script is a network fault injection system that introduces network faults such as packet loss and delay to specific endpoints for testing purposes." - echo "Parameters: The script uses several environment variables as parameters. These include endpoint, databaseid, containerid, wait_for_fault_to_start_in_sec, duration_of_fault_in_sec, fault_region, drop_probability, and delay_in_ms. These parameters need to be set in the environment before running the script." - echo - echo "Example: To execute the script, you would typically do the following in a bash shell: - - # Set the environment variables - export endpoint="your_endpoint" - export databaseid="your_databaseid" - export containerid="your_containerid" - export wait_for_fault_to_start_in_sec="your_wait_time" - export duration_of_fault_in_sec="your_duration" - export fault_region="your_fault_region" - export drop_probability="your_drop_probability" - export delay_in_ms="your_delay" - - # Make the script executable - chmod +x chaos_script.sh - - # Run the script - sudo ./chaos_script.sh" +while getopts "e:m:d:c:w:t:r:p:l:" opt; +do + case "$opt" in + e) endpoint=$OPTARG;; + m) masterkey=$OPTARG;; + d) databaseid=$OPTARG;; + c) containerid=$OPTARG;; + w) wait_for_fault_to_start_in_sec=$OPTARG;; + t) duration_of_fault_in_sec=$OPTARG;; + r) fault_region=$OPTARG;; + p) drop_probability=$OPTARG;; + l) delay_in_ms=$OPTARG;; + esac +done + +usage(){ + echo "Usage: ./chaos_script.sh -e -d -c -w -t -r -p -l " } -while getopts ":h" option; do - case $option in - h) # display Help - print_help - exit;; - esac -done +if [ -z "$endpoint" ]; then + echo "The endpoint for the Cosmos DB instance is not set. Please pass it with -e option." + usage + exit 1 +fi + +if [ -z "$masterkey" ]; then + echo "The masterkey for the Cosmos DB instance is not set. Please pass it with -m option." + usage + exit 1 +fi + +if [ -z "$databaseid" ]; then + echo "The databaseid for the Cosmos DB instance is not set. Please pass it with -d option." + usage + exit 1 +fi + +if [ -z "$containerid" ]; then + echo "The containerid for the Cosmos DB instance is not set. Please pass it with -c option." + usage + exit 1 +fi + +if [ -z "$duration_of_fault_in_sec" ]; then + echo "The duration_of_fault_in_sec is not set. Please pass it with -t option." + usage + exit 1 +fi if [ -z "$fault_region" ]; then echo "Error: The fault_region environment variable is not set." diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/README.md b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/README.md index 7efaa8a3..27c6a69c 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/README.md +++ b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/README.md @@ -1,5 +1,5 @@ # 100 Thousand Updates Per Second -This recipe encapsulates a update only workload with a maximum requests per second of 10 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. +This recipe encapsulates a update only workload with a maximum requests per second of 100 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. ## Recipe definition diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/README.md b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/README.md index ec5b00dc..104f6b09 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/README.md +++ b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/README.md @@ -1,5 +1,5 @@ # 30 Thousand Updates Per Second -This recipe encapsulates a update only workload with a maximum requests per second of 10 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. +This recipe encapsulates a update only workload with a maximum requests per second of 30 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. ## Recipe definition diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/README.md b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/README.md index 00eb2e76..256dfc72 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/README.md +++ b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/README.md @@ -1,5 +1,5 @@ # 50 Thousand Updates Per Second -This recipe encapsulates a update only workload with a maximum requests per second of 10 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. +This recipe encapsulates a update only workload with a maximum requests per second of 50 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. ## Recipe definition diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/README.md b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/README.md index 035f1805..5369f880 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/README.md +++ b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/README.md @@ -1,5 +1,5 @@ # 500 Thousand Updates Per Second -This recipe encapsulates a update only workload with a maximum requests per second of 10 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. +This recipe encapsulates a update only workload with a maximum requests per second of 500 thousand. This "1-Click" recipe combines both the load and run phases of YCSB. ## Recipe definition From 48f0b4b8b17a7fc20bc4e7170cfe698f08ac7bfc Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 1 Dec 2023 16:28:11 -0800 Subject: [PATCH 08/58] Converted microseconds to milliseconds --- .../aggregate_multiple_file_results.py | 139 ++++++++++++++---- cosmos/scripts/converting_log_to_csv.py | 36 ++--- 2 files changed, 129 insertions(+), 46 deletions(-) diff --git a/cosmos/scripts/aggregate_multiple_file_results.py b/cosmos/scripts/aggregate_multiple_file_results.py index 7db23108..761e3e7d 100644 --- a/cosmos/scripts/aggregate_multiple_file_results.py +++ b/cosmos/scripts/aggregate_multiple_file_results.py @@ -1,6 +1,22 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +""" +This script aggregates results from multiple log files. It takes a directory containing log files as input and outputs a CSV file containing aggregated metrics from the log files. + +Usage: + python aggregate_multiple_files_result.py + +Arguments: + FilesDirectory: The directory containing the log files to aggregate. + +Raises: + Exception: If the FilesDirectory argument is not provided. + +Outputs: + A CSV file named 'aggregation.csv' containing aggregated metrics from the log files. +""" + import csv import glob import os @@ -12,6 +28,7 @@ def main(): raise Exception("Input log files directory not provided. Syntax = 'python aggregate_multiple_files_result.py " "'") path = sys.argv[1] + # Initialize count and throughput variables total_read_count = 0 total_read_failed_count = 0 total_update_count = 0 @@ -22,10 +39,14 @@ def main(): total_scan_failed_count = 0 total_throughput = 0 + # Loop over all log files in the provided directory for filename in glob.glob(os.path.join(path, '*.log')): with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode current_file = open(filename, 'r') lines = current_file.readlines() + # For each line in the current log file, check if it contains certain keywords + # that indicate the type of operation and whether the operation was successful or failed + # Then increment the corresponding count variable by the number of operations indicated in the line for line in lines: if '[READ], Operations,' in line: total_read_count += int(line.replace('[READ], Operations, ', '')) @@ -46,6 +67,7 @@ def main(): elif '[OVERALL], Throughput(ops/sec), ' in line: total_throughput += float(line.replace('[OVERALL], Throughput(ops/sec), ', '')) + # Initialize latency variables total_read_avg = 0 total_read_p95 = 0 total_read_p99 = 0 @@ -94,6 +116,7 @@ def main(): total_scan_failed_min = sys.maxsize total_scan_failed_max = 0 + # Loop over all log files in the provided directory again for filename in glob.glob(os.path.join(path, '*.log')): with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode current_file = open(filename, 'r') @@ -107,6 +130,10 @@ def main(): current_scan_operation = 0 current_scan_failed_operation = 0 + # For each line in the current log file, check if it contains certain keywords + # that indicate the type of operation and whether the operation was successful or failed + # Then calculate the weighted average, 95th percentile, and 99th percentile latencies for the current + # operation and update the minimum and maximum latencies if necessary. for line in lines: if '[READ], ' in line and total_read_count == 0: continue @@ -324,52 +351,108 @@ def main(): if total_scan_failed_max < weighted_current_max: total_scan_failed_max = weighted_current_max - # create the csv writer + # Convert read times to milliseconds + total_read_avg_ms = total_read_avg / 1000 + total_read_p95_ms = total_read_p95 / 1000 + total_read_p99_ms = total_read_p99 / 1000 + total_read_min_ms = total_read_min / 1000 + total_read_max_ms = total_read_max / 1000 + + # Convert read failed times to milliseconds + total_read_failed_avg_ms = total_read_failed_avg / 1000 + total_read_failed_p95_ms = total_read_failed_p95 / 1000 + total_read_failed_p99_ms = total_read_failed_p99 / 1000 + total_read_failed_min_ms = total_read_failed_min / 1000 + total_read_failed_max_ms = total_read_failed_max / 1000 + + # Convert update times to milliseconds + total_update_avg_ms = total_update_avg / 1000 + total_update_p95_ms = total_update_p95 / 1000 + total_update_p99_ms = total_update_p99 / 1000 + total_update_min_ms = total_update_min / 1000 + total_update_max_ms = total_update_max / 1000 + + # Convert update failed times to milliseconds + total_update_failed_avg_ms = total_update_failed_avg / 1000 + total_update_failed_p95_ms = total_update_failed_p95 / 1000 + total_update_failed_p99_ms = total_update_failed_p99 / 1000 + total_update_failed_min_ms = total_update_failed_min / 1000 + total_update_failed_max_ms = total_update_failed_max / 1000 + + # Convert write times to milliseconds + total_write_avg_ms = total_write_avg / 1000 + total_write_p95_ms = total_write_p95 / 1000 + total_write_p99_ms = total_write_p99 / 1000 + total_write_min_ms = total_write_min / 1000 + total_write_max_ms = total_write_max / 1000 + + # Convert write failed times to milliseconds + total_write_failed_avg_ms = total_write_failed_avg / 1000 + total_write_failed_p95_ms = total_write_failed_p95 / 1000 + total_write_failed_p99_ms = total_write_failed_p99 / 1000 + total_write_failed_min_ms = total_write_failed_min / 1000 + total_write_failed_max_ms = total_write_failed_max / 1000 + + # Convert scan times to milliseconds + total_scan_avg_ms = total_scan_avg / 1000 + total_scan_p95_ms = total_scan_p95 / 1000 + total_scan_p99_ms = total_scan_p99 / 1000 + total_scan_min_ms = total_scan_min / 1000 + total_scan_max_ms = total_scan_max / 1000 + + # Convert scan failed times to milliseconds + total_scan_failed_avg_ms = total_scan_failed_avg / 1000 + total_scan_failed_p95_ms = total_scan_failed_p95 / 1000 + total_scan_failed_p99_ms = total_scan_failed_p99 / 1000 + total_scan_failed_min_ms = total_scan_failed_min / 1000 + total_scan_failed_max_ms = total_scan_failed_max / 1000 + +# create the csv writer output_csv = open("aggregation" + ".csv", 'w', newline='') writer = csv.writer(output_csv) - header = ['Operation', 'Count', 'Throughput', 'Min(microsecond)', 'Max(microsecond)', 'Avg(microsecond)', - 'P95(microsecond)', 'P99(microsecond)'] + header = ['Operation', 'Count', 'Throughput', 'Min(millisecond)', 'Max(millisecond)', 'Avg(millisecond)', + 'P95(millisecond)', 'P99(millisecond)'] writer.writerow(header) if total_read_count > 0: - row_in_csv = ['READ', total_read_count, int(total_throughput), total_read_min, total_read_max, - int(total_read_avg), int(total_read_p95), - int(total_read_p99)] + row_in_csv = ['READ', total_read_count, int(total_throughput), total_read_min_ms, total_read_max_ms, + int(total_read_avg_ms), int(total_read_p95_ms), + int(total_read_p99_ms)] writer.writerow(row_in_csv) if total_read_failed_count > 0: - row_in_csv = ['READ-FAILED', total_read_failed_count, int(total_throughput), total_read_failed_min, - total_read_failed_max, - int(total_read_failed_avg), - int(total_read_failed_p95), int(total_read_failed_p99)] + row_in_csv = ['READ-FAILED', total_read_failed_count, int(total_throughput), total_read_failed_min_ms, + total_read_failed_max_ms, + int(total_read_failed_avg_ms), + int(total_read_failed_p95_ms), int(total_read_failed_p99_ms)] writer.writerow(row_in_csv) if total_update_count > 0: - row_in_csv = ['UPDATE', total_update_count, int(total_throughput), total_update_min, total_update_max, - int(total_update_avg), int(total_update_p95), - int(total_update_p99)] + row_in_csv = ['UPDATE', total_update_count, int(total_throughput), total_update_min_ms, total_update_max_ms, + int(total_update_avg_ms), int(total_update_p95_ms), + int(total_update_p99_ms)] writer.writerow(row_in_csv) if total_update_failed_count > 0: - row_in_csv = ['UPDATE-FAILED', total_update_failed_count, int(total_throughput), total_update_failed_min, - total_update_failed_max, int(total_update_failed_avg), - int(total_update_failed_p95), int(total_update_failed_p99)] + row_in_csv = ['UPDATE-FAILED', total_update_failed_count, int(total_throughput), total_update_failed_min_ms, + total_update_failed_max_ms, int(total_update_failed_avg_ms), + int(total_update_failed_p95_ms), int(total_update_failed_p99_ms)] writer.writerow(row_in_csv) if total_write_count > 0: - row_in_csv = ['WRITE', total_write_count, int(total_throughput), total_write_min, total_write_max, - int(total_write_avg), int(total_write_p95), - int(total_write_p99)] + row_in_csv = ['WRITE', total_write_count, int(total_throughput), total_write_min_ms, total_write_max_ms, + int(total_write_avg_ms), int(total_write_p95_ms), + int(total_write_p99_ms)] writer.writerow(row_in_csv) if total_write_failed_count > 0: - row_in_csv = ['WRITE-FAILED', total_write_failed_count, int(total_throughput), total_write_failed_min, - total_write_failed_max, int(total_write_failed_avg), - int(total_write_failed_p95), int(total_write_failed_p99)] + row_in_csv = ['WRITE-FAILED', total_write_failed_count, int(total_throughput), total_write_failed_min_ms, + total_write_failed_max_ms, int(total_write_failed_avg_ms), + int(total_write_failed_p95_ms), int(total_write_failed_p99_ms)] writer.writerow(row_in_csv) if total_scan_count > 0: - row_in_csv = ['SCAN', total_scan_count, int(total_throughput), total_scan_min, total_scan_max, - int(total_scan_avg), int(total_scan_p95), - int(total_scan_p99)] + row_in_csv = ['SCAN', total_scan_count, int(total_throughput), total_scan_min_ms, total_scan_max_ms, + int(total_scan_avg_ms), int(total_scan_p95_ms), + int(total_scan_p99_ms)] writer.writerow(row_in_csv) if total_scan_failed_count > 0: - row_in_csv = ['SCAN-FAILED', total_scan_failed_count, int(total_throughput), total_scan_failed_min, - total_scan_failed_max, int(total_scan_failed_avg), - int(total_scan_failed_p95), int(total_scan_failed_p99)] + row_in_csv = ['SCAN-FAILED', total_scan_failed_count, int(total_throughput), total_scan_failed_min_ms, + total_scan_failed_max_ms, int(total_scan_failed_avg_ms), + int(total_scan_failed_p95_ms), int(total_scan_failed_p99_ms)] writer.writerow(row_in_csv) output_csv.close() diff --git a/cosmos/scripts/converting_log_to_csv.py b/cosmos/scripts/converting_log_to_csv.py index be9d830a..837a0ec1 100644 --- a/cosmos/scripts/converting_log_to_csv.py +++ b/cosmos/scripts/converting_log_to_csv.py @@ -18,8 +18,8 @@ def main(): # create the csv writer output_csv = open(filename_withoutextention + ".csv", 'w', newline='') writer = csv.writer(output_csv) - header = ['Date', 'Time', 'Operation', 'RPS', 'Count', 'MAX(microsecond)', 'MIN(microsecond)', 'AVG(microsecond)', - 'P90(microsecond)', 'P99(microsecond)', 'P999(microsecond)', 'P9999(microsecond)'] + header = ['Date', 'Time', 'Operation', 'RPS', 'Count', 'MAX(millisecond)', 'MIN(millisecond)', 'AVG(millisecond)', + 'P90(millisecond)', 'P99(millisecond)', 'P999(millisecond)', 'P9999(millisecond)'] writer.writerow(header) # Strips the newline character @@ -61,13 +61,13 @@ def parse_line_for_formatting(line, writer): return operation = '' count = '' - max_in_micro_sec = '' - min_in_micro_sec = '' - avg_in_micro_sec = '' - p9999_in_micro_sec = '' - p999_in_micro_sec = '' - p99_in_micro_sec = '' - p90_in_micro_sec = '' + max_in_milli_sec = '' + min_in_milli_sec = '' + avg_in_milli_sec = '' + p9999_in_milli_sec = '' + p999_in_milli_sec = '' + p99_in_milli_sec = '' + p90_in_milli_sec = '' for metrics in third_part.split(' '): metrics = metrics.strip() metrics = metrics.replace(']', '') @@ -78,22 +78,22 @@ def parse_line_for_formatting(line, writer): elif 'Count=' in metrics: count = metrics.replace('Count=', '') elif 'Max=' in metrics: - max_in_micro_sec = metrics.replace('Max=', '') + max_in_milli_sec = metrics.replace('Max=', '')/1000 elif 'Min=' in metrics: - min_in_micro_sec = metrics.replace('Min=', '') + min_in_milli_sec = metrics.replace('Min=', '')/1000 elif 'Avg=' in metrics: - avg_in_micro_sec = metrics.replace('Avg=', '') + avg_in_milli_sec = metrics.replace('Avg=', '')/1000 elif '99.99=' in metrics: - p9999_in_micro_sec = metrics.replace('99.99=', '') + p9999_in_milli_sec = metrics.replace('99.99=', '')/1000 elif '99.9=' in metrics: - p999_in_micro_sec = metrics.replace('99.9=', '') + p999_in_milli_sec = metrics.replace('99.9=', '')/1000 elif '99=' in metrics: - p99_in_micro_sec = metrics.replace('99=', '') + p99_in_milli_sec = metrics.replace('99=', '')/1000 elif '90=' in metrics: - p90_in_micro_sec = metrics.replace('90=', '') + p90_in_milli_sec = metrics.replace('90=', '')/1000 - row_in_csv = [date, time, operation, rps, count, max_in_micro_sec, min_in_micro_sec, avg_in_micro_sec, - p90_in_micro_sec, p99_in_micro_sec, p999_in_micro_sec, p9999_in_micro_sec] + row_in_csv = [date, time, operation, rps, count, max_in_milli_sec, min_in_milli_sec, avg_in_milli_sec, + p90_in_milli_sec, p99_in_milli_sec, p999_in_milli_sec, p9999_in_milli_sec] writer.writerow(row_in_csv) From 453e602d7b4ee5673614f2c870da076f2576045f Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sat, 2 Dec 2023 08:16:12 -0800 Subject: [PATCH 09/58] updated the logic for converting to milliseconds. --- cosmos/scripts/converting_log_to_csv.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cosmos/scripts/converting_log_to_csv.py b/cosmos/scripts/converting_log_to_csv.py index 837a0ec1..6fd46d44 100644 --- a/cosmos/scripts/converting_log_to_csv.py +++ b/cosmos/scripts/converting_log_to_csv.py @@ -78,19 +78,19 @@ def parse_line_for_formatting(line, writer): elif 'Count=' in metrics: count = metrics.replace('Count=', '') elif 'Max=' in metrics: - max_in_milli_sec = metrics.replace('Max=', '')/1000 + max_in_milli_sec = str(float(metrics.replace('Max=', '')) / 1000, '.4f') elif 'Min=' in metrics: - min_in_milli_sec = metrics.replace('Min=', '')/1000 + min_in_milli_sec = str(float(metrics.replace('Min=', '')) / 1000, '.4f') elif 'Avg=' in metrics: - avg_in_milli_sec = metrics.replace('Avg=', '')/1000 + avg_in_milli_sec = str(float(metrics.replace('Avg=', '')) / 1000, '.4f') elif '99.99=' in metrics: - p9999_in_milli_sec = metrics.replace('99.99=', '')/1000 + p9999_in_milli_sec = str(float(metrics.replace('99.99=', '')) / 1000, '.4f') elif '99.9=' in metrics: - p999_in_milli_sec = metrics.replace('99.9=', '')/1000 + p999_in_milli_sec = str(float(metrics.replace('99.9=', '')) / 1000, '.4f') elif '99=' in metrics: - p99_in_milli_sec = metrics.replace('99=', '')/1000 + p99_in_milli_sec = str(float(metrics.replace('99=', '')) / 1000, '.4f') elif '90=' in metrics: - p90_in_milli_sec = metrics.replace('90=', '')/1000 + p90_in_milli_sec = str(float(metrics.replace('90=', '')) / 1000, '.4f') row_in_csv = [date, time, operation, rps, count, max_in_milli_sec, min_in_milli_sec, avg_in_milli_sec, p90_in_milli_sec, p99_in_milli_sec, p999_in_milli_sec, p9999_in_milli_sec] From 09e226a315f6beb509370891b0d43254fbf64354 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 4 Dec 2023 13:59:35 -0800 Subject: [PATCH 10/58] Setting project name as Storage metadata table name --- cosmos/scripts/custom-script.sh | 38 ++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index fa87349f..83753b23 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -3,6 +3,32 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +# This script is used to run a YCSB (Yahoo! Cloud Serving Benchmark) test on a Cosmos DB instance. +# It takes several environment variables as input, which are used to configure the test. +# The script supports both load and run operations, and can optionally introduce faults during the test. + +# The PROJECT_NAME environment variable is used to name the benchmark. +# The DB_BINDING_NAME environment variable specifies the YCSB binding to use. +# The VM_NAME environment variable is used to name the virtual machine that runs the test. +# The YCSB_RECORD_COUNT environment variable specifies the number of records for the test. +# The MACHINE_INDEX environment variable is used to calculate the start index for insert operations. +# The YCSB_OPERATION_COUNT environment variable specifies the number of operations for the test. +# The VM_COUNT environment variable is used to calculate the total number of records for read operations. +# The WRITE_ONLY_OPERATION environment variable determines whether to run a write-only workload. +# The BENCHMARKING_TOOLS_BRANCH_NAME and BENCHMARKING_TOOLS_URL environment variables are used to clone the benchmarking tools repository. +# The YCSB_GIT_BRANCH_NAME and YCSB_GIT_REPO_URL environment variables are used to clone the YCSB repository. +# The WAIT_FOR_FAULT_TO_START_IN_SEC, DURATION_OF_FAULT_IN_SEC, DROP_PROBABILITY, FAULT_REGION, and DELAY_IN_MS environment variables are used to configure fault injection. + +# The script starts by printing the values of all the environment variables. +# It then clones the benchmarking tools and YCSB repositories, and builds YCSB from source. +# The script then checks whether to run a load operation, and if so, it executes the load operation. +# After the load operation, the script checks whether to introduce faults, and if so, it starts a chaos script. +# Finally, the script executes the run operation, and copies the results to a storage account. + +# This script assumes that the Azure CLI and azcopy are installed and that the user is logged in to the Azure CLI. +# This script should be run on a virtual machine that has network access to the Cosmos DB instance. + +echo "##########PROJECT_NAME###########: $PROJECT_NAME" echo "##########VM NAME###########: $DB_BINDING_NAME" echo "##########VM NAME###########: $VM_NAME" echo "##########YCSB_RECORD_COUNT###########: $YCSB_RECORD_COUNT" @@ -27,10 +53,10 @@ insertstart=$((YCSB_RECORD_COUNT * (MACHINE_INDEX - 1))) recordcount=$((YCSB_RECORD_COUNT * MACHINE_INDEX)) # Record count for Run. Since we run read workload after load this is the total number of records loaded by all VMs/clients during load. totalrecordcount=$((YCSB_RECORD_COUNT * VM_COUNT)) -benchmarkname=ycsbbenchmarking +benchmarkname=$PROJECT_NAME if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true - benchmarkname=ycsbwithfault + benchmarkname="{$PROJECT_NAME}withfault" fi #Cloning Test Bench Repo @@ -91,6 +117,8 @@ if [ $MACHINE_INDEX -eq 1 ]; then fi ## Creating SAS URL for result storage container + # The block also checks if the current machine is the first one to start the job. If it is, it inserts a new entity into the metadata table in Azure Storage. + # If the current machine is not the first one, it waits until the first machine has inserted the entity, and then retrieves the job start time and SAS URL from the entity. echo "########## Creating SAS URL for result storage container ###########" end=$(date -u -d "30 days" '+%Y-%m-%dT%H:%MZ') current_time="$(date '+%Y-%m-%d-%Hh%Mm%Ss')" @@ -125,7 +153,7 @@ else for i in $(seq 1 10); do latest_table_entry=$(az storage entity show --table-name "${benchmarkname}Metadata" --connection-string $RESULT_STORAGE_CONNECTION_STRING --partition-key "${tool_api}" --row-key "${GUID}") if [ -z "$latest_table_entry" ]; then - echo "sleeping for 1 min, table row not availble yet" + echo "sleeping for 1 min, table row not available yet" sleep 1m continue fi @@ -284,7 +312,7 @@ if [ $MACHINE_INDEX -eq 1 ]; then finish_time="$(date '+%Y-%m-%dT%H:%M:%SZ')" echo "Updating latest table entry with incremented NoOfClientsCompleted" az storage entity merge --table-name "${benchmarkname}Metadata" --connection-string $RESULT_STORAGE_CONNECTION_STRING --entity PartitionKey="${tool_api}" RowKey="${GUID}" JobFinishTime=$finish_time JobStatus="Finished" NoOfClientsCompleted=$no_of_clients_completed --if-match=$etag - echo "Job finished sucessfully at $finish_time" + echo "Job finished successfully at $finish_time" else for j in $(seq 1 60); do echo "Reading latest table entry for updating NoOfClientsCompleted" @@ -301,7 +329,7 @@ else echo "Hit race condition on table entry for updating no_of_clients_completed" sleep 1s else - echo "Task finished sucessfully" + echo "Task finished successfully" break fi done From 3c6b61faf6ec51821b8f77640c71f12d777471c3 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 4 Dec 2023 14:02:54 -0800 Subject: [PATCH 11/58] Updated the deploy json to pass the projectName to the shell script --- cosmos/infra/azuredeploy.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index 18445392..f59783d0 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -68,7 +68,7 @@ "resultsStorageConnectionString": { "type": "string", "metadata": { - "description": "Specifies a connection string of the storage account where results will be avaialble" + "description": "Specifies a connection string of the storage account where results will be available." } }, "cosmosURI": { @@ -155,7 +155,7 @@ "type": "bool", "defaultValue": false, "metadata": { - "description": "Specifies if the gateway connectivity mode should be used. The default value 'flase' indicates direct connectivity mode" + "description": "Specifies if the gateway connectivity mode should be used. The default value 'false' indicates direct connectivity mode" } }, "diagnosticsLatencyThresholdInMS": { @@ -493,7 +493,7 @@ "settings": { }, "protectedSettings": { - "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('PROJECT_NAME=',parameters('projectName'),' ','DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, From 42a5fad6e802c3865baf5492361f84de3d3e6761 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Tue, 5 Dec 2023 12:26:50 -0800 Subject: [PATCH 12/58] Added updated metadata-status image --- images/metadata-status.png | Bin 12490 -> 59051 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/metadata-status.png b/images/metadata-status.png index 00691bf53269bd17513e0a33f1bbcd502687829f..0228d1a5bab1562c1d10420ce2fd16afba712427 100644 GIT binary patch literal 59051 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 From 3a595038c0157a87d75bc5fc974795f3aad2e6ea Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Wed, 6 Dec 2023 09:24:25 -0800 Subject: [PATCH 13/58] Forcing the install of chocolatey-compatibility.extension and clumsy to prevent errors arising from corrupt previous installs. --- cosmos/scripts/chaos/chaos_script.ps1 | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/chaos/chaos_script.ps1 b/cosmos/scripts/chaos/chaos_script.ps1 index fdd4ba7c..1b104d20 100644 --- a/cosmos/scripts/chaos/chaos_script.ps1 +++ b/cosmos/scripts/chaos/chaos_script.ps1 @@ -68,9 +68,9 @@ if ($waitForFaultToStartInSec) } Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) -choco install chocolatey-compatibility.extension -choco install clumsy -y -#choco uninstall clumsy +choco install chocolatey-compatibility.extension -y --force +choco install clumsy -y --force +Write-Host "To remove WinDivertXX.sys, please remove/uninstall all WinDivert client application(s) and reboot." -ForegroundColor Cyan $databaseAccountResponseJson = & .\GetDatabaseAccount.ps1 -Endpoint $endpoint -MasterKey $masterKey $databaseAccountResponseObject = $databaseAccountResponseJson | ConvertFrom-Json @@ -172,4 +172,5 @@ if ($durationOfFaultInSec) Stop-Process -Name clumsy # Uninstall Clumsy -choco uninstall clumsy -y \ No newline at end of file +choco uninstall clumsy -y +Write-Host "To remove WinDivertXX.sys, please remove/uninstall all WinDivert client application(s) and reboot." -ForegroundColor Cyan \ No newline at end of file From 5808f9662632e9d8db17d81d739834ee15a7fc8f Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Tue, 27 Feb 2024 16:45:53 -0800 Subject: [PATCH 14/58] fixing typo --- cosmos/scripts/custom-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 77233b90..94b2babd 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -58,7 +58,7 @@ totalrecordcount=$((YCSB_RECORD_COUNT * VM_COUNT)) benchmarkname=$PROJECT_NAME if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true - benchmarkname="{$PROJECT_NAME}withfault" + benchmarkname="${PROJECT_NAME}withfault" fi #Cloning Test Bench Repo From 4e6cb595603e0c7e340b5c2cab558adda4ba2b74 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 29 Feb 2024 09:59:49 -0800 Subject: [PATCH 15/58] Addressed PR comments --- cosmos/scripts/converting_log_to_csv.py | 14 +++++++------- cosmos/scripts/custom-script.sh | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cosmos/scripts/converting_log_to_csv.py b/cosmos/scripts/converting_log_to_csv.py index 6fd46d44..4d3a1c3f 100644 --- a/cosmos/scripts/converting_log_to_csv.py +++ b/cosmos/scripts/converting_log_to_csv.py @@ -78,19 +78,19 @@ def parse_line_for_formatting(line, writer): elif 'Count=' in metrics: count = metrics.replace('Count=', '') elif 'Max=' in metrics: - max_in_milli_sec = str(float(metrics.replace('Max=', '')) / 1000, '.4f') + max_in_milli_sec = format(float(metrics.replace('Max=', '')) / 1000, '.4f') elif 'Min=' in metrics: - min_in_milli_sec = str(float(metrics.replace('Min=', '')) / 1000, '.4f') + min_in_milli_sec = format(float(metrics.replace('Min=', '')) / 1000, '.4f') elif 'Avg=' in metrics: - avg_in_milli_sec = str(float(metrics.replace('Avg=', '')) / 1000, '.4f') + avg_in_milli_sec = format(float(metrics.replace('Avg=', '')) / 1000, '.4f') elif '99.99=' in metrics: - p9999_in_milli_sec = str(float(metrics.replace('99.99=', '')) / 1000, '.4f') + p9999_in_milli_sec = format(float(metrics.replace('99.99=', '')) / 1000, '.4f') elif '99.9=' in metrics: - p999_in_milli_sec = str(float(metrics.replace('99.9=', '')) / 1000, '.4f') + p999_in_milli_sec = format(float(metrics.replace('99.9=', '')) / 1000, '.4f') elif '99=' in metrics: - p99_in_milli_sec = str(float(metrics.replace('99=', '')) / 1000, '.4f') + p99_in_milli_sec = format(float(metrics.replace('99=', '')) / 1000, '.4f') elif '90=' in metrics: - p90_in_milli_sec = str(float(metrics.replace('90=', '')) / 1000, '.4f') + p90_in_milli_sec = format(float(metrics.replace('90=', '')) / 1000, '.4f') row_in_csv = [date, time, operation, rps, count, max_in_milli_sec, min_in_milli_sec, avg_in_milli_sec, p90_in_milli_sec, p99_in_milli_sec, p999_in_milli_sec, p9999_in_milli_sec] diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 94b2babd..0deeb672 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -58,7 +58,7 @@ totalrecordcount=$((YCSB_RECORD_COUNT * VM_COUNT)) benchmarkname=$PROJECT_NAME if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true - benchmarkname="${PROJECT_NAME}withfault" + benchmarkname="${PROJECT_NAME}" + "withfault" fi #Cloning Test Bench Repo From 744646cbfc35602813a05427cdbbe64789ac246d Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 29 Feb 2024 16:09:17 -0800 Subject: [PATCH 16/58] updated custom-script.sh --- cosmos/scripts/custom-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 0deeb672..e9b6e5c1 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -58,7 +58,7 @@ totalrecordcount=$((YCSB_RECORD_COUNT * VM_COUNT)) benchmarkname=$PROJECT_NAME if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true - benchmarkname="${PROJECT_NAME}" + "withfault" + benchmarkname= $PROJECT_NAME + "withfault" fi #Cloning Test Bench Repo From 6c8487a4afe15c12dda3c9719a5190fa65d1ca27 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sat, 2 Mar 2024 12:18:22 -0800 Subject: [PATCH 17/58] Removed project name --- cosmos/infra/azuredeploy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index a4894b46..c40273a8 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -502,7 +502,7 @@ }, "protectedSettings": { - "commandToExecute": "[concat('PROJECT_NAME=',parameters('projectName'),' ','DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, From aeaa8b6f8faf01a6958d7170408eb8c3a7c509a8 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sat, 2 Mar 2024 14:39:49 -0800 Subject: [PATCH 18/58] added project name --- cosmos/infra/azuredeploy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index c40273a8..ef4f7949 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -502,7 +502,7 @@ }, "protectedSettings": { - "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'),' ','PROJECT_NAME=',parameters('projectName'),' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, From fbd0ae6200a82cb377fad0f79e87e501abcb5ae7 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sat, 2 Mar 2024 16:30:46 -0800 Subject: [PATCH 19/58] commit --- cosmos/infra/azuredeploy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index ef4f7949..175417c8 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -502,7 +502,7 @@ }, "protectedSettings": { - "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'),' ','PROJECT_NAME=',parameters('projectName'),' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'),' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, From 329a6fee951a86b20dfbf6052506d5cee25a8b23 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sun, 3 Mar 2024 12:46:50 -0800 Subject: [PATCH 20/58] commit --- cosmos/infra/azuredeploy.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index 175417c8..effaded9 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -501,8 +501,7 @@ "settings": { }, "protectedSettings": { - - "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'),' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, @@ -518,4 +517,3 @@ "value": "The Benchmarking job has been triggered successfully. Please check the storage account you provided for Job Status and Results. The jobs status will be available in a storage table within a few minutes and results will be available once the job finishes." } } -} From ed76360ddda96d036110477246286d57ac68f719 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sun, 3 Mar 2024 12:47:09 -0800 Subject: [PATCH 21/58] commit --- cosmos/infra/azuredeploy.json | 1 + 1 file changed, 1 insertion(+) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index effaded9..6a64c10b 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -517,3 +517,4 @@ "value": "The Benchmarking job has been triggered successfully. Please check the storage account you provided for Job Status and Results. The jobs status will be available in a storage table within a few minutes and results will be available once the job finishes." } } +} \ No newline at end of file From d3ed85256f560e403c469a0bbb99ac529e841e98 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sun, 3 Mar 2024 13:24:26 -0800 Subject: [PATCH 22/58] revert name changes --- cosmos/scripts/custom-script.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index e9b6e5c1..a6362fe6 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -55,10 +55,10 @@ insertstart=$((YCSB_RECORD_COUNT * (MACHINE_INDEX - 1))) recordcount=$((YCSB_RECORD_COUNT * MACHINE_INDEX)) # Record count for Run. Since we run read workload after load this is the total number of records loaded by all VMs/clients during load. totalrecordcount=$((YCSB_RECORD_COUNT * VM_COUNT)) -benchmarkname=$PROJECT_NAME +benchmarkname=ycsbbenchmarking if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true - benchmarkname= $PROJECT_NAME + "withfault" + benchmarkname=ycsbwithfault fi #Cloning Test Bench Repo From 47619bc1c4b084f6ee38d28fd66d61fae18995e3 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sun, 3 Mar 2024 15:31:09 -0800 Subject: [PATCH 23/58] commit --- cosmos/infra/azuredeploy.json | 2 +- cosmos/scripts/custom-script.sh | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index 6a64c10b..703e2f2f 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -501,7 +501,7 @@ "settings": { }, "protectedSettings": { - "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','PROJECT_NAME=',parameters('projectName'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index a6362fe6..2e52b42e 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -29,7 +29,7 @@ # This script should be run on a virtual machine that has network access to the Cosmos DB instance. echo "##########PROJECT_NAME###########: $PROJECT_NAME" -echo "##########VM NAME###########: $DB_BINDING_NAME" +echo "##########DB_BINDING_NAME###########: $DB_BINDING_NAME" echo "##########VM NAME###########: $VM_NAME" echo "##########YCSB_RECORD_COUNT###########: $YCSB_RECORD_COUNT" echo "##########MACHINE_INDEX###########: $MACHINE_INDEX" @@ -55,10 +55,21 @@ insertstart=$((YCSB_RECORD_COUNT * (MACHINE_INDEX - 1))) recordcount=$((YCSB_RECORD_COUNT * MACHINE_INDEX)) # Record count for Run. Since we run read workload after load this is the total number of records loaded by all VMs/clients during load. totalrecordcount=$((YCSB_RECORD_COUNT * VM_COUNT)) -benchmarkname=ycsbbenchmarking + +benchmarkname="" +if [[ -n $PROJECT_NAME ]]; then + benchmarkname=$PROJECT_NAME +else + benchmarkname=ycsbbenchmarking +fi + if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true - benchmarkname=ycsbwithfault + if [[ -n $PROJECT_NAME ]]; then + benchmarkname=$PROJECT_NAME + else + benchmarkname=ycsbwithfault + fi fi #Cloning Test Bench Repo From 0ea9b92576e09e071010d2e55719c383ed1c1bbf Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Sun, 3 Mar 2024 23:30:30 -0800 Subject: [PATCH 24/58] Updated the benchmarkname with fault --- cosmos/scripts/custom-script.sh | 2 +- cosmos/scripts/execute.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 2e52b42e..d5e23a72 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -66,7 +66,7 @@ fi if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true if [[ -n $PROJECT_NAME ]]; then - benchmarkname=$PROJECT_NAME + benchmarkname="${PROJECT_NAME}withfault" else benchmarkname=ycsbwithfault fi diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index e8138bc6..6549ee78 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -16,7 +16,7 @@ then else echo Starting the worklaod. # Running custom-script in background, arm template completion wont wait on this -# stdout and stderr will be logged in <$HOME>/custom-script.out and <$HOME>/custom-script.err +# stdout and stderr will be logged in <$HOME>/agent.out and <$HOME>/agent.err curl -o custom-script.sh $CUSTOM_SCRIPT_URL nohup bash custom-script.sh > "/home/${ADMIN_USER_NAME}/agent.out" 2> "/home/${ADMIN_USER_NAME}/agent.err" & fi From 18716145a40ba384999ddddbdfef842042ea2633 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 4 Mar 2024 15:30:48 -0800 Subject: [PATCH 25/58] Added validation for Project name --- cosmos/infra/azuredeploy.json | 2 +- cosmos/infra/azuredeploy_mongo.json | 2 +- .../recipes/read/10-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/20-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/30-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json | 2 +- .../java/ycsb/recipes/read/try-it-read/azuredeploy.json | 2 +- .../recipes/update/10-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/20-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/30-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/5-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/write/10-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/20-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/30-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/5-thousand-rps-write/azuredeploy.json | 2 +- cosmos/scripts/custom-script.sh | 1 - cosmos/scripts/execute.sh | 7 +++++++ .../java/ycsb/chaos/build-your-own-recipe/azuredeploy.json | 2 +- .../delay/recipes/read-delay/azuredeploy.json | 2 +- .../delay/recipes/read-patch-delay/azuredeploy.json | 2 +- .../outage/recipes/read-outage/azuredeploy.json | 2 +- .../outage/recipes/read-patch-outage/azuredeploy.json | 2 +- .../outage/recipes/write-outage/azuredeploy.json | 2 +- .../java/ycsb/recipes/build-your-own/azuredeploy.json | 2 +- .../ycsb/recipes/read/1-million-rps-read/azuredeploy.json | 2 +- .../recipes/read/10-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/100-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/20-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/30-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/50-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/500-thousand-rps-read/azuredeploy.json | 2 +- .../java/ycsb/recipes/read/try-it-read/azuredeploy.json | 2 +- .../recipes/update/10-thousand-rps-update/azuredeploy.json | 2 +- .../update/100-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/20-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/30-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/50-thousand-rps-update/azuredeploy.json | 2 +- .../update/500-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/write/1-million-rps-write/azuredeploy.json | 2 +- .../recipes/write/10-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/100-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/20-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/30-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/50-thousand-rps-write/azuredeploy.json | 2 +- .../recipes/write/500-thousand-rps-write/azuredeploy.json | 2 +- 45 files changed, 50 insertions(+), 44 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index 703e2f2f..50879928 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/infra/azuredeploy_mongo.json b/cosmos/infra/azuredeploy_mongo.json index 5e3fe0eb..1da607a2 100644 --- a/cosmos/infra/azuredeploy_mongo.json +++ b/cosmos/infra/azuredeploy_mongo.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index eb062983..b0dfe470 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index 73d0157d..9defe0fc 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index 90717dce..bea8937b 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json index 0a4259e6..8a91b709 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index 2cd8b5d1..4c7de894 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index 8a575301..eb8e3b8f 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index a953fc95..aac4c389 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index 05749c07..37a9c226 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json index dbaa3f1a..e8dc2f82 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index c8a0e4c2..e205d071 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index a13eeb75..39ff241c 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index f8caf944..11db8257 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json index c98ebdc2..c93082b1 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index d5e23a72..8abb2ce9 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -48,7 +48,6 @@ echo "##########FAULT_REGION###########: $FAULT_REGION" echo "##########DELAY_IN_MS###########: $DELAY_IN_MS" echo "##########USER_AGENT###########: $USER_AGENT" - # The index of the record to start at during the Load insertstart=$((YCSB_RECORD_COUNT * (MACHINE_INDEX - 1))) # Records already in the DB + records to be added, during load diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index 6549ee78..c578d094 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -6,6 +6,13 @@ cloud-init status --wait echo "##########CUSTOM_SCRIPT_URL###########: $CUSTOM_SCRIPT_URL" + +if [[ $PROJECT_NAME =~ .*[-_ ].* ]]; then + echo "Error: PROJECT_NAME does not match the required pattern. + Project Name must start or end with a letter or number, and can contain only letters and numbers. No blankspace or special characters are allowed." + exit 1 +fi + # check to enforce only once instance of the workload is running. if pgrep -xf "bash custom-script.sh" then diff --git a/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json index 1965d302..179ab6ae 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json index 4ae53914..6448b9a0 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Chaos", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json index 10ad0061..6b143254 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Chaos", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json index 21a7fc73..3c3403ea 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Chaos", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json index 4bec7405..66f11325 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Chaos", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json index 9cee9b89..005ea433 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Chaos", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json index 6a6d327d..db397d37 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json index 105c9c05..9ffb1c63 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index a9fc5694..dcd30782 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json index dd337d60..7aeadf40 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index c18d8e3f..3baa8720 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index 1aec75f5..f52658f3 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json index b205ad6b..1defb7ef 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json index 928a59be..716b3c28 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index 937ada5e..16576965 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index 4c1db015..50cfc8dc 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json index 5fc66b0f..c8f6092b 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index c98a33e3..391b1b7e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index c63519a7..f4966433 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json index 7bf6d1f1..29480408 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json index 86bc50de..337b4c59 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json index f70632dc..cbdbf483 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index ec91a0aa..33a37743 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json index 5121bf97..0219e262 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index 4d6b7ce9..5012aab7 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index 1715d4db..5a1024b7 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json index 088a887e..c6e7349e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json index fc2d16ff..982ab157 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "Benchmarking", "metadata": { - "description": "Specifies a name for generating resource names." + "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } }, "location": { From ce39a234397dbb2f6cc87f53436d10b787d3ecb6 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 4 Mar 2024 16:02:12 -0800 Subject: [PATCH 26/58] updated execute.sh --- cosmos/scripts/execute.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index c578d094..c09a3940 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -6,10 +6,8 @@ cloud-init status --wait echo "##########CUSTOM_SCRIPT_URL###########: $CUSTOM_SCRIPT_URL" - -if [[ $PROJECT_NAME =~ .*[-_ ].* ]]; then - echo "Error: PROJECT_NAME does not match the required pattern. - Project Name must start or end with a letter or number, and can contain only letters and numbers. No blankspace or special characters are allowed." +if [ -n $PROJECT_NAME ] && [ $PROJECT_NAME =~ .*[-_ ].* ]; then + echo "Error: PROJECT_NAME does not match the required pattern. Project Name must start or end with a letter or number, and can contain only letters and numbers. No blankspace or special characters are allowed." exit 1 fi From 615ba866e926d5f298093385645b7bf3cfd8b672 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 4 Mar 2024 16:28:32 -0800 Subject: [PATCH 27/58] commit --- cosmos/scripts/execute.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index c09a3940..6549ee78 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -6,11 +6,6 @@ cloud-init status --wait echo "##########CUSTOM_SCRIPT_URL###########: $CUSTOM_SCRIPT_URL" -if [ -n $PROJECT_NAME ] && [ $PROJECT_NAME =~ .*[-_ ].* ]; then - echo "Error: PROJECT_NAME does not match the required pattern. Project Name must start or end with a letter or number, and can contain only letters and numbers. No blankspace or special characters are allowed." - exit 1 -fi - # check to enforce only once instance of the workload is running. if pgrep -xf "bash custom-script.sh" then From 21d10aa5811a17d08d77ee566f4e930e83006ecb Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 4 Mar 2024 16:34:04 -0800 Subject: [PATCH 28/58] Commit --- cosmos/scripts/custom-script.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 8abb2ce9..b6e8bc54 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -56,7 +56,7 @@ recordcount=$((YCSB_RECORD_COUNT * MACHINE_INDEX)) totalrecordcount=$((YCSB_RECORD_COUNT * VM_COUNT)) benchmarkname="" -if [[ -n $PROJECT_NAME ]]; then +if [ -n $PROJECT_NAME ]; then benchmarkname=$PROJECT_NAME else benchmarkname=ycsbbenchmarking @@ -64,7 +64,7 @@ fi if [ $WAIT_FOR_FAULT_TO_START_IN_SEC -gt 0 ] && [ $DURATION_OF_FAULT_IN_SEC -gt 0 ]; then fault=true - if [[ -n $PROJECT_NAME ]]; then + if [ -n $PROJECT_NAME ]; then benchmarkname="${PROJECT_NAME}withfault" else benchmarkname=ycsbwithfault From 22c623bfc25a9f8d9b6ddcbfa56f9d686eae69ad Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Tue, 5 Mar 2024 12:36:44 -0800 Subject: [PATCH 29/58] Added validation for projectName --- cosmos/scripts/execute.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index 6549ee78..a07fa5e8 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -5,6 +5,13 @@ cloud-init status --wait echo "##########CUSTOM_SCRIPT_URL###########: $CUSTOM_SCRIPT_URL" +echo "##########PROJECT_NAME###########: $PROJECT_NAME" + +# Regex check for $PROJECT_NAME +if [[ ! $PROJECT_NAME =~ ^[a-zA-Z0-9]+$ ]]; then + echo "Invalid project name. Project name should only contain lower case letters and numbers." + exit 1 +fi # check to enforce only once instance of the workload is running. if pgrep -xf "bash custom-script.sh" From 950c5d61d15737d40c35aa224f14d6d07ac7840e Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 8 Mar 2024 17:51:08 -0800 Subject: [PATCH 30/58] Updated the chaos tool zip file --- .../sql/tools/java/ycsb/chaos/chaos-tool.zip | Bin 6787 -> 7826 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/cosmos/sql/tools/java/ycsb/chaos/chaos-tool.zip b/cosmos/sql/tools/java/ycsb/chaos/chaos-tool.zip index bc44d6b75eddf4485f85a5dfaa892795bc504698..f464e8d33fd43c67a22812992dd7f5b2e06fc5c9 100644 GIT binary patch delta 4425 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 delta 3370 zcmZu!cQhLe`wd0yy)_ZD)JViADKV ztr2R3+I!WiuirT5_xsNI{&~*5&mZ^s>$&&bbd@N1w4v?|3U&YhKnXDZ zu|8xg+wM3f6P#pyMr#KUW31Rm?@Ci6G-3L<21q$39M#6ekFnxzh#lKu9GwpyX&Wu( zLAP?<;n2?`*I#JQVMu{Q4i^eye@tzI3lh zJVo+aiqw)hHd%kF@t(skf2!gHqbXJflw@Z2XU@05TNY0f=bEd&M7(Ph#qlTp;IU_9 z8FtB>A!aQ*d>(rMX|sQW!Z^XPI%JSPt;}_0SaCu_N%}9*Mi~@^9cLfFK6NBnwBP=% zVXmBoq*G@3LQ^N{0z}ywpOCeBf&Oi{kX%HkIMU^YK??ffm`D4Pwq%UQ<{>}lwcSz? z$2P=D52oV*?5j9OK1G)LGOeyHerldYgdd4nc&p)ESlkFB}mudT@xXj-IZ^$3o$wZ3@rVOMH5b=aIdwun^!r^8-0C zqlW%Hoc^VB(>qP^@op6^o9nXjMaKswJNm}AiwnyInpV+nB#r383&sYtAP09gs3Yw< zHw#Dq)9>43`4+!6n$Tr%+qu{TYaB~n>oGR)J}sVhZQa%Kt3a+C{Da7+D_D^F{Y(bD zw&1!jBqu$T>)rzBbBO8kA4EH;AN{aRD9(By!|L>8CjJB;s(qovr+12a)4BX-gGg1B z(F=8?-89wAS+*cysg;GZ{pLqGP}6pxL{mu?++yXlY#7{W!){lATSm63fJf66z> z>D*)t1bG@)X*75ee z`0TGDx69||BBA2D5_5nCjf3LSF#-7O z*oA@S2Rb}3o5Liq1JQFw;U^2w>GunaI+inS62Y+VA(#(ctrDrUje;10gY5S{9^aD>dN=BN;w3w2iM|L~ zw1xljTtq)lS@8{A>x@UX|;uBscKYPK7FN;K2m|F#X3|vAopuXmg^^Z&M9FO}a+iCuC;Cr)MfZNq`Sec=TdR_m{tL z5f{~jg$2r~b1`_ulwYmy0qRD0N#dh&<2G}Olh`?5PF;}lTIz!tepz|qJaInH3pm`F zV*(#?tR({f{yu-he0iXsf3)t#g00_(AVWy+3yK$IGB2SXe#VyA7PYpea+)TE9bH9#qt27LyqcrA3u}wyx(!)~w9Oe!&Rbwrb_ko=&F&aRIv$pDkv_JeVS{BeXF>);1+@AZaq5V63MaT1SvS=%38P-+n8_D?i>{8p z^E@d}1&xj}$R6ET$?tK`-!s!cKDzZTL_F_M`e^Bx^gfC>=%ggka`S|#F>;tm+atW^ zsaSVnR)D?hsg6%{HuKf>`jBPt@JiIPX~$yood7e?4~D{xGic4*jM2hFm4mw_MQt*% zK`8$CG zD@|_d`xSiWz6N!dr5{o|BWT*b3h*hxxT|t_owhXo)ukPm&bgKlcqmPWS_(^V$e z8^bJE&O<;H=Bt?_2@aa9uzt$L6@VZ`H0SyRBij_A*o!=7;FCo1={94}nA$kJL8{h}=Yo8sbvt>I z(tPs5&0#y9z?GuEGvMs}4T*q0p@e6e4A>TAq2@d}I%Qoflg`SvpS*(&lRl)2K zzKTPZ1kL$Uy>>{okxW<5csM*fhEggljW3`{tXEJl%P>->Q;fpQORr{PP%7n$3}4tu zt)a)4yQ<1os6jfHW7UE;3!B0GwS-x)fBmz?f{|i*clAw44~}&7)pRiO$mh>Xc68Y0 zMhEr0I;iuESGHyp+Eb8u1owZ_9ONBPruVpeg60pE!+@n*$jc3$@^27!W#`_~u{MOc zSqwlo(EPKIQdiZZsjb4?NH0lXI5CXTX{h6Hq8FE$gAVFHX?18xoN0~nzFX0?$W9z*J=LwwJR%Ng+m}e$ zybn_KNQ!Oi6d?1z<-a$4%1U({l6yZvZ(OVdtQdQj|9fFrQ0ndx_ujAo%V&XpD6l^k z+$6A_&j0fAmRI$}RFh^j(wE1fNyf}4#o(T^1vR2$jCl99f|+U&YGT!n8eM)qA8F-S zn}c%b3zUik0FiSAt$1Ins7>zrH>5?;pZnHW8&*EdU|Ck09yFFVERL$qe5nW92X&6; znMqlf)#7;OLGp~bcM0oIeI@LZV75$Jw2RWd?xMas{Z_l@>E8hm!HW8!pM*+p4}zr6 z*+AUKfSk;XTGt0Mlyvw4bh9KaT^{1w?_)k3Ct6pGob#Qe4Np&>rj}|nwd(d)6QJ|$ z&pTa>b5=DtubXwhe4Speo{I8bRcOv|q%!nb3|C<~B<}@5wcMzCLj_02e{{Y48S>ONw From ff40b28a7199226e1127f8c85412169d72f9a2b9 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 11 Mar 2024 12:16:38 -0700 Subject: [PATCH 31/58] changed projectName to lowercase --- .../network-faults/delay/recipes/read-delay/azuredeploy.json | 2 +- .../delay/recipes/read-patch-delay/azuredeploy.json | 2 +- .../network-faults/outage/recipes/read-outage/azuredeploy.json | 2 +- .../outage/recipes/read-patch-outage/azuredeploy.json | 2 +- .../network-faults/outage/recipes/write-outage/azuredeploy.json | 2 +- .../sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json | 2 +- .../java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json | 2 +- .../tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json | 2 +- .../ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/100-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/500-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/write/1-million-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json | 2 +- 27 files changed, 27 insertions(+), 27 deletions(-) diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json index 6448b9a0..5621895d 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Chaos", + "defaultValue": "chaos", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json index 6b143254..61bf8511 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Chaos", + "defaultValue": "chaos", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json index 3c3403ea..b6bc7be0 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Chaos", + "defaultValue": "chaos", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json index 66f11325..cf2624ad 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Chaos", + "defaultValue": "chaos", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json index 005ea433..c1b4d393 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Chaos", + "defaultValue": "chaos", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json index db397d37..38c49158 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json index 9ffb1c63..47e05756 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index dcd30782..ff941c2a 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json index 7aeadf40..6afca221 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index 3baa8720..d563aa5f 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index f52658f3..f77efc2b 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json index 1defb7ef..1798a95b 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json index 716b3c28..cf15463a 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index 16576965..f5cba31a 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index 50cfc8dc..389e2823 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json index c8f6092b..c4eabf39 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index 391b1b7e..58a1598d 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index f4966433..de588d1c 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json index 29480408..8da2fe6e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json index 337b4c59..6c099ac6 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json index cbdbf483..004cb221 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index 33a37743..084a93b9 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json index 0219e262..e9c678ac 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index 5012aab7..05ab8ce8 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index 5a1024b7..a7652921 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json index c6e7349e..dba4ced4 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json index 982ab157..659eba81 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } From 551c730c012c82e38f6f867e67ea9f93d56749d5 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 11 Mar 2024 12:21:17 -0700 Subject: [PATCH 32/58] changed projectName to lowercase for MongoAPI --- .../ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json | 2 +- .../java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json | 2 +- .../tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json | 2 +- .../ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index b0dfe470..5cfda410 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index 9defe0fc..6101b5b4 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index bea8937b..30465b1a 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json index 8a91b709..d67f3fbc 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index 4c7de894..b73a8edb 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index eb8e3b8f..c6e7eabe 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index aac4c389..e46b44b2 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index 37a9c226..2ecf1543 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json index e8dc2f82..f729ae98 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index e205d071..87c48bdc 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index 39ff241c..e77f89ea 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index 11db8257..8391dc2a 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json index c93082b1..56a926bc 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json @@ -4,7 +4,7 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." } From b155e3d3c29e145ccb0f4202d516ba0b4cbe5721 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 18 Mar 2024 12:21:03 -0700 Subject: [PATCH 33/58] Added support application insights using applicationinsights-agent --- cosmos/scripts/custom-script.sh | 1 + .../outage/recipes/read-outage/azuredeploy.json | 10 ++++++++++ .../ycsb/recipes/read/try-it-read/azuredeploy.json | 10 ++++++++++ system/cloud-init.txt | 3 +++ 4 files changed, 24 insertions(+) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 4d08eccc..e270195b 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -48,6 +48,7 @@ echo "##########FAULT_REGION###########: $FAULT_REGION" echo "##########DELAY_IN_MS###########: $DELAY_IN_MS" echo "##########USER_AGENT###########: $USER_AGENT" echo "##########CONSISTENCY_LEVEL###########: $CONSISTENCY_LEVEL" +echo "###########APP_INSIGHT_CONN_STR########: $APP_INSIGHT_CONN_STR" # The index of the record to start at during the Load insertstart=$((YCSB_RECORD_COUNT * (MACHINE_INDEX - 1))) diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json index b6bc7be0..cde164c0 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json @@ -209,6 +209,13 @@ "metadata": { "description": "Specifies field count in the item" } + }, + "appInsightConnectionString": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Specifies application insight connection string for live monitering" + } } }, "variables": { @@ -321,6 +328,9 @@ }, "dropProbability": { "value": "[parameters('dropProbability')]" + }, + "appInsightConnectionString": { + "value": "[parameters('appInsightConnectionString')]" } } } diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index f5cba31a..97465e1e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -183,6 +183,13 @@ "metadata": { "description": "Specifies field count in the item" } + }, + "appInsightConnectionString": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Specifies application insight connection string for live monitering" + } } }, "variables": { @@ -283,6 +290,9 @@ }, "fieldcount": { "value": "[parameters('fieldcount')]" + }, + "appInsightConnectionString": { + "value": "[parameters('appInsightConnectionString')]" } } } diff --git a/system/cloud-init.txt b/system/cloud-init.txt index 310cc455..8232b55c 100644 --- a/system/cloud-init.txt +++ b/system/cloud-init.txt @@ -18,3 +18,6 @@ runcmd: - sudo apt-get update - sudo apt-get install -y powershell - sudo apt install net-tools + - sudo wget https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.5.1/applicationinsights-agent-3.5.1.jar + - sudo cp ./applicationinsights-agent-3.5.1.jar /tmp/ycsb + - export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.0.jar" From 992823af3e0fac5a5d36b84644f60d9a89ad6eb7 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 18 Mar 2024 13:56:22 -0700 Subject: [PATCH 34/58] fixed dir creation issue --- cosmos/scripts/custom-script.sh | 2 +- system/cloud-init.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index e270195b..355b2b68 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -78,7 +78,7 @@ echo "########## Cloning Test Bench repository ##########" git clone -b "$BENCHMARKING_TOOLS_BRANCH_NAME" --single-branch "$BENCHMARKING_TOOLS_URL" echo "########## Pulling Latest YCSB TOOLS ##########" git -C azure-db-benchmarking pull -mkdir /tmp/ycsb +mkdir -p /tmp/ycsb # Clearing data from previous run rm -rf /tmp/ycsb/* rm -rf "/tmp/$VM_NAME-system-diagnostics" diff --git a/system/cloud-init.txt b/system/cloud-init.txt index 8232b55c..7384c918 100644 --- a/system/cloud-init.txt +++ b/system/cloud-init.txt @@ -19,5 +19,6 @@ runcmd: - sudo apt-get install -y powershell - sudo apt install net-tools - sudo wget https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.5.1/applicationinsights-agent-3.5.1.jar + - mkdir /tmp/ycsb - sudo cp ./applicationinsights-agent-3.5.1.jar /tmp/ycsb - export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.0.jar" From b2b31ed8217c8181c0f9f1faa8bb3389e7a0d9da Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 18 Mar 2024 14:41:59 -0700 Subject: [PATCH 35/58] updated custom-script.sh --- cosmos/scripts/custom-script.sh | 5 ++++- system/cloud-init.txt | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 355b2b68..f1fe75f8 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -83,7 +83,10 @@ mkdir -p /tmp/ycsb rm -rf /tmp/ycsb/* rm -rf "/tmp/$VM_NAME-system-diagnostics" cp -r ./azure-db-benchmarking/cosmos/scripts/* /tmp/ycsb -#cp -r ./azure-db-benchmarking/core/data/* /tmp/ycsb + +#Copying application insights java agent to /tmp/ycsb +cp /applicationinsights-agent-3.5.1.jar /tmp/ycsb +export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.0.jar" #Build YCSB from source echo "########## Cloning YCSB repository ##########" diff --git a/system/cloud-init.txt b/system/cloud-init.txt index 7384c918..ce190ffb 100644 --- a/system/cloud-init.txt +++ b/system/cloud-init.txt @@ -19,6 +19,3 @@ runcmd: - sudo apt-get install -y powershell - sudo apt install net-tools - sudo wget https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.5.1/applicationinsights-agent-3.5.1.jar - - mkdir /tmp/ycsb - - sudo cp ./applicationinsights-agent-3.5.1.jar /tmp/ycsb - - export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.0.jar" From 215543f39f00dc68c90bdbadb6c4c8706cff3edb Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 18 Mar 2024 15:21:38 -0700 Subject: [PATCH 36/58] updated the appinsights jar location --- cosmos/scripts/custom-script.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index f1fe75f8..a192ac89 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -85,8 +85,7 @@ rm -rf "/tmp/$VM_NAME-system-diagnostics" cp -r ./azure-db-benchmarking/cosmos/scripts/* /tmp/ycsb #Copying application insights java agent to /tmp/ycsb -cp /applicationinsights-agent-3.5.1.jar /tmp/ycsb -export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.0.jar" +export MAVEN_OPTS=-javaagent:"/applicationinsights-agent-3.5.0.jar" #Build YCSB from source echo "########## Cloning YCSB repository ##########" From 96bb601bb93f1aa6ee246032e9cc8868385b0eaa Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 18 Mar 2024 16:37:21 -0700 Subject: [PATCH 37/58] moved agent wget to custom-script --- cosmos/scripts/custom-script.sh | 4 ++-- system/cloud-init.txt | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index a192ac89..80e74ef9 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -85,12 +85,12 @@ rm -rf "/tmp/$VM_NAME-system-diagnostics" cp -r ./azure-db-benchmarking/cosmos/scripts/* /tmp/ycsb #Copying application insights java agent to /tmp/ycsb -export MAVEN_OPTS=-javaagent:"/applicationinsights-agent-3.5.0.jar" +wget -P /tmp/ycsb https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.5.1/applicationinsights-agent-3.5.1.jar +export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.0.jar" #Build YCSB from source echo "########## Cloning YCSB repository ##########" git clone -b "$YCSB_GIT_BRANCH_NAME" --single-branch "$YCSB_GIT_REPO_URL" - cd YCSB echo "########## Pulling Latest YCSB ##########" git pull diff --git a/system/cloud-init.txt b/system/cloud-init.txt index ce190ffb..310cc455 100644 --- a/system/cloud-init.txt +++ b/system/cloud-init.txt @@ -18,4 +18,3 @@ runcmd: - sudo apt-get update - sudo apt-get install -y powershell - sudo apt install net-tools - - sudo wget https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.5.1/applicationinsights-agent-3.5.1.jar From b61f940a043b374469463f67f9e79c75c5597c57 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Mon, 18 Mar 2024 16:39:09 -0700 Subject: [PATCH 38/58] updated the version of agent --- cosmos/scripts/custom-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 80e74ef9..6d78366e 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -86,7 +86,7 @@ cp -r ./azure-db-benchmarking/cosmos/scripts/* /tmp/ycsb #Copying application insights java agent to /tmp/ycsb wget -P /tmp/ycsb https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.5.1/applicationinsights-agent-3.5.1.jar -export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.0.jar" +export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.1.jar" #Build YCSB from source echo "########## Cloning YCSB repository ##########" From 37abc81fae15d766521f1a11dc32b4cc8100be94 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Tue, 19 Mar 2024 14:45:18 -0700 Subject: [PATCH 39/58] updated custom-script.sh --- cosmos/infra/azuredeploy.json | 23 ++++++++++++++++++++++- cosmos/scripts/azurecosmos-run.sh | 12 ++++++++++++ cosmos/scripts/custom-script.sh | 16 ++++++++++------ system/cloud-init.txt | 2 +- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index d8ae28e4..4ec9587f 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -239,6 +239,27 @@ "description": "Specifies application insight connection string for live monitering" } }, + "pointOperationLatencyThresholdInMS": { + "type": "int", + "defaultValue": 100, + "metadata": { + "description": "Specifies the threshold for point operation (e.g. point read, etc) latency in milliseconds. If latency exceeds this threshold, it will be logged in cosmos client diagnostics log." + } + }, + "nonPointOperationLatencyThresholdInMS": { + "type": "int", + "defaultValue": 500, + "metadata": { + "description": "Specifies the threshold for non-point operation (e.g. query, etc) latency in milliseconds. If latency exceeds this threshold, it will be logged in cosmos client diagnostics log." + } + }, + "requestChargeThreshold": { + "type": "int", + "defaultValue": 100, + "metadata": { + "description": "Specifies the threshold for request units. If latency exceeds this threshold, it will be logged in cosmos client diagnostics log." + } + }, "ycsbDatabaseBindingName": { "type": "string", "defaultValue": "azurecosmos", @@ -515,7 +536,7 @@ "settings": { }, "protectedSettings": { - "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','PROJECT_NAME=',parameters('projectName'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','PROJECT_NAME=',parameters('projectName'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ','POINT_OPERATION_THRESHOLD_IN_MS=','\"',parameters('pointOperationLatencyThresholdInMS'),'\"',' ','NON_POINT_OPERATION_THRESHOLD_IN_MS=','\"',parameters('nonPointOperationLatencyThresholdInMS'),'\"',' ','REQUEST_CHARGE_THRESHOLD=','\"',parameters('requestChargeThreshold'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, diff --git a/cosmos/scripts/azurecosmos-run.sh b/cosmos/scripts/azurecosmos-run.sh index c4aba8f3..7e6ca8ec 100644 --- a/cosmos/scripts/azurecosmos-run.sh +++ b/cosmos/scripts/azurecosmos-run.sh @@ -152,6 +152,18 @@ if [ ! -z "$exportfile" ]; then sed -i "s|^[#]*\s*exportfile\ =.*|exportfile\ =\ $exportfile|" azurecosmos.properties fi +if [ ! -z "$pointOperationLatencyThresholdInMS" ]; then + sed -i "s/^[#]*\s*azurecosmos.pointOperationLatencyThresholdInMS\ =.*/azurecosmos.pointOperationLatencyThresholdInMS\ =\ $pointOperationLatencyThresholdInMS/" azurecosmos.properties +fi + +if [ ! -z "$nonPointOperationLatencyThresholdInMS" ]; then + sed -i "s/^[#]*\s*azurecosmos.nonPointOperationLatencyThresholdInMS\ =.*/azurecosmos.nonPointOperationLatencyThresholdInMS\ =\ $nonPointOperationLatencyThresholdInMS/" azurecosmos.properties +fi + +if [ ! -z "$requestChargeThreshold" ]; then + sed -i "s/^[#]*\s*azurecosmos.requestChargeThreshold\ =.*/azurecosmos.requestChargeThreshold\ =\ $requestChargeThreshold/" azurecosmos.properties +fi + log_filename="/tmp/ycsb.log" if [ ! -z "$threads" ] && [ ! -z "$target" ] diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 6d78366e..7cbd59c4 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -49,6 +49,9 @@ echo "##########DELAY_IN_MS###########: $DELAY_IN_MS" echo "##########USER_AGENT###########: $USER_AGENT" echo "##########CONSISTENCY_LEVEL###########: $CONSISTENCY_LEVEL" echo "###########APP_INSIGHT_CONN_STR########: $APP_INSIGHT_CONN_STR" +echo "###########POINT_OPERATION_THRESHOLD########: $POINT_OPERATION_THRESHOLD_IN_MS" +echo "###########NON_POINT_OPERATION_THRESHOLD########: $NON_POINT_OPERATION_THRESHOLD_IN_MS" +echo "###########REQUEST_CHARGE_THRESHOLD########: $REQUEST_CHARGE_THRESHOLD" # The index of the record to start at during the Load insertstart=$((YCSB_RECORD_COUNT * (MACHINE_INDEX - 1))) @@ -84,9 +87,6 @@ rm -rf /tmp/ycsb/* rm -rf "/tmp/$VM_NAME-system-diagnostics" cp -r ./azure-db-benchmarking/cosmos/scripts/* /tmp/ycsb -#Copying application insights java agent to /tmp/ycsb -wget -P /tmp/ycsb https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.5.1/applicationinsights-agent-3.5.1.jar -export MAVEN_OPTS=-javaagent:"/tmp/ycsb/applicationinsights-agent-3.5.1.jar" #Build YCSB from source echo "########## Cloning YCSB repository ##########" @@ -105,6 +105,10 @@ user_home="/home/${ADMIN_USER_NAME}" echo "########## Extracting YCSB ##########" tar xfvz ycsb-$DB_BINDING_NAME-binding*.tar.gz +export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR +export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 +java -javaagent:"ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" -jar ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar + cp ./$DB_BINDING_NAME-run.sh ./$ycsb_folder_name cp ./*.properties ./$ycsb_folder_name cp ./aggregate_multiple_file_results.py ./$ycsb_folder_name @@ -231,7 +235,7 @@ if [ "$WRITE_ONLY_OPERATION" = True ] || [ "$WRITE_ONLY_OPERATION" = true ]; the ## Execute run phase for YCSB tests with write only workload echo "########## Run operation with write only workload for YCSB tests ###########" - uri=$COSMOS_URI primaryKey=$COSMOS_KEY workload_type=$WORKLOAD_TYPE ycsb_operation="run" insertproportion=1 readproportion=0 updateproportion=0 scanproportion=0 recordcount=$recordcountForWriteOps operationcount=$YCSB_OPERATION_COUNT threads=$THREAD_COUNT target=$TARGET_OPERATIONS_PER_SECOND useGateway=$USE_GATEWAY diagnosticsLatencyThresholdInMS=$DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS requestdistribution=$REQUEST_DISTRIBUTION insertorder=$INSERT_ORDER includeExceptionStackInLog=$INCLUDE_EXCEPTION_STACK fieldcount=$FIELD_COUNT appInsightConnectionString=$APP_INSIGHT_CONN_STR userAgent=$USER_AGENT preferredRegionList=$PREFERRED_REGION_LIST consistencyLevel=$CONSISTENCY_LEVEL bash $DB_BINDING_NAME-run.sh + uri=$COSMOS_URI primaryKey=$COSMOS_KEY workload_type=$WORKLOAD_TYPE ycsb_operation="run" insertproportion=1 readproportion=0 updateproportion=0 scanproportion=0 recordcount=$recordcountForWriteOps operationcount=$YCSB_OPERATION_COUNT threads=$THREAD_COUNT target=$TARGET_OPERATIONS_PER_SECOND useGateway=$USE_GATEWAY diagnosticsLatencyThresholdInMS=$DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS requestdistribution=$REQUEST_DISTRIBUTION insertorder=$INSERT_ORDER includeExceptionStackInLog=$INCLUDE_EXCEPTION_STACK fieldcount=$FIELD_COUNT appInsightConnectionString=$APP_INSIGHT_CONN_STR userAgent=$USER_AGENT preferredRegionList=$PREFERRED_REGION_LIST consistencyLevel=$CONSISTENCY_LEVEL pointOperationLatencyThreshold=$POINT_OPERATION_THRESHOLD_IN_MS nonPointOperationLatencyThreshold=$NON_POINT_OPERATION_THRESHOLD_IN_MS requestChargeThreshold=$REQUEST_CHARGE_THRESHOLD bash $DB_BINDING_NAME-run.sh else if [ "$SKIP_LOAD_PHASE" = False ] || [ "$SKIP_LOAD_PHASE" = false ]; then ## Execute load operation for YCSB tests @@ -242,7 +246,7 @@ else loadthreadcount=1 fi echo "##########loadthreadcount###########: $loadthreadcount" - uri=$COSMOS_URI primaryKey=$COSMOS_KEY workload_type=$WORKLOAD_TYPE ycsb_operation="load" recordcount=$recordcount insertstart=$insertstart insertcount=$YCSB_RECORD_COUNT threads=$loadthreadcount target=$TARGET_OPERATIONS_PER_SECOND useGateway=$USE_GATEWAY diagnosticsLatencyThresholdInMS=$DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS requestdistribution=$REQUEST_DISTRIBUTION insertorder=$INSERT_ORDER includeExceptionStackInLog=$INCLUDE_EXCEPTION_STACK fieldcount=$FIELD_COUNT appInsightConnectionString=$APP_INSIGHT_CONN_STR core_workload_insertion_retry_limit=5 userAgent=$USER_AGENT preferredRegionList=$PREFERRED_REGION_LIST consistencyLevel=$CONSISTENCY_LEVEL bash $DB_BINDING_NAME-run.sh + uri=$COSMOS_URI primaryKey=$COSMOS_KEY workload_type=$WORKLOAD_TYPE ycsb_operation="load" recordcount=$recordcount insertstart=$insertstart insertcount=$YCSB_RECORD_COUNT threads=$loadthreadcount target=$TARGET_OPERATIONS_PER_SECOND useGateway=$USE_GATEWAY diagnosticsLatencyThresholdInMS=$DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS requestdistribution=$REQUEST_DISTRIBUTION insertorder=$INSERT_ORDER includeExceptionStackInLog=$INCLUDE_EXCEPTION_STACK fieldcount=$FIELD_COUNT appInsightConnectionString=$APP_INSIGHT_CONN_STR core_workload_insertion_retry_limit=5 userAgent=$USER_AGENT preferredRegionList=$PREFERRED_REGION_LIST consistencyLevel=$CONSISTENCY_LEVEL pointOperationLatencyThreshold=$POINT_OPERATION_THRESHOLD_IN_MS nonPointOperationLatencyThreshold=$NON_POINT_OPERATION_THRESHOLD_IN_MS requestChargeThreshold=$REQUEST_CHARGE_THRESHOLD bash $DB_BINDING_NAME-run.sh fi now=$(date +"%s") wait_interval=$(($job_start_time - $now)) @@ -265,7 +269,7 @@ else ## Execute run phase for YCSB tests echo "########## Run operation for YCSB tests ###########" - uri=$COSMOS_URI primaryKey=$COSMOS_KEY workload_type=$WORKLOAD_TYPE ycsb_operation="run" recordcount=$totalrecordcount operationcount=$YCSB_OPERATION_COUNT threads=$THREAD_COUNT target=$TARGET_OPERATIONS_PER_SECOND insertproportion=$INSERT_PROPORTION readproportion=$READ_PROPORTION updateproportion=$UPDATE_PROPORTION scanproportion=$SCAN_PROPORTION useGateway=$USE_GATEWAY diagnosticsLatencyThresholdInMS=$DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS requestdistribution=$REQUEST_DISTRIBUTION insertorder=$INSERT_ORDER includeExceptionStackInLog=$INCLUDE_EXCEPTION_STACK fieldcount=$FIELD_COUNT appInsightConnectionString=$APP_INSIGHT_CONN_STR userAgent=$USER_AGENT preferredRegionList=$PREFERRED_REGION_LIST consistencyLevel=$CONSISTENCY_LEVEL bash $DB_BINDING_NAME-run.sh + uri=$COSMOS_URI primaryKey=$COSMOS_KEY workload_type=$WORKLOAD_TYPE ycsb_operation="run" recordcount=$totalrecordcount operationcount=$YCSB_OPERATION_COUNT threads=$THREAD_COUNT target=$TARGET_OPERATIONS_PER_SECOND insertproportion=$INSERT_PROPORTION readproportion=$READ_PROPORTION updateproportion=$UPDATE_PROPORTION scanproportion=$SCAN_PROPORTION useGateway=$USE_GATEWAY diagnosticsLatencyThresholdInMS=$DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS requestdistribution=$REQUEST_DISTRIBUTION insertorder=$INSERT_ORDER includeExceptionStackInLog=$INCLUDE_EXCEPTION_STACK fieldcount=$FIELD_COUNT appInsightConnectionString=$APP_INSIGHT_CONN_STR userAgent=$USER_AGENT preferredRegionList=$PREFERRED_REGION_LIST consistencyLevel=$CONSISTENCY_LEVEL pointOperationLatencyThreshold=$POINT_OPERATION_THRESHOLD_IN_MS nonPointOperationLatencyThreshold=$NON_POINT_OPERATION_THRESHOLD_IN_MS requestChargeThreshold=$REQUEST_CHARGE_THRESHOLD bash $DB_BINDING_NAME-run.sh fi #Copy YCSB log to storage account diff --git a/system/cloud-init.txt b/system/cloud-init.txt index 310cc455..ddd5da4b 100644 --- a/system/cloud-init.txt +++ b/system/cloud-init.txt @@ -17,4 +17,4 @@ runcmd: - rm packages-microsoft-prod.deb - sudo apt-get update - sudo apt-get install -y powershell - - sudo apt install net-tools + - sudo apt install net-tools \ No newline at end of file From 445174652d9da5a7c64c3d06f98b7c6e84bf0802 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Tue, 19 Mar 2024 16:05:22 -0700 Subject: [PATCH 40/58] fixed the javaagent issue --- cosmos/scripts/custom-script.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 7cbd59c4..bf2fc1aa 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -105,15 +105,17 @@ user_home="/home/${ADMIN_USER_NAME}" echo "########## Extracting YCSB ##########" tar xfvz ycsb-$DB_BINDING_NAME-binding*.tar.gz -export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR -export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 -java -javaagent:"ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" -jar ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar - cp ./$DB_BINDING_NAME-run.sh ./$ycsb_folder_name cp ./*.properties ./$ycsb_folder_name cp ./aggregate_multiple_file_results.py ./$ycsb_folder_name cp ./converting_log_to_csv.py ./$ycsb_folder_name +if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then + export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR + export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 + export MAVEN_OPTS=-javaagent:"ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" +fi + # Adding chaos scripts cp ./chaos/*.sh ./$ycsb_folder_name cp ./chaos/*.ps1 ./$ycsb_folder_name From 3f316fd6ea09e5db5b8d229b4b6806df71194c37 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Wed, 20 Mar 2024 00:11:26 -0700 Subject: [PATCH 41/58] added java_opts --- cosmos/scripts/custom-script.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index bf2fc1aa..2c38fa58 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -28,6 +28,8 @@ # This script assumes that the Azure CLI and azcopy are installed and that the user is logged in to the Azure CLI. # This script should be run on a virtual machine that has network access to the Cosmos DB instance. + + echo "##########PROJECT_NAME###########: $PROJECT_NAME" echo "##########DB_BINDING_NAME###########: $DB_BINDING_NAME" echo "##########VM NAME###########: $VM_NAME" @@ -100,9 +102,7 @@ cp -r ./$DB_BINDING_NAME/target/ycsb-$DB_BINDING_NAME-binding*.tar.gz /tmp/ycsb cp -r ./$DB_BINDING_NAME/conf/* /tmp/ycsb cd /tmp/ycsb/ -ycsb_folder_name=ycsb-$DB_BINDING_NAME-binding-*-SNAPSHOT -user_home="/home/${ADMIN_USER_NAME}" - +ycsb_folder_name=ycsb-$DB_BINDING_NAME-binding-*-SNAPSHOTexport APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 echo "########## Extracting YCSB ##########" tar xfvz ycsb-$DB_BINDING_NAME-binding*.tar.gz cp ./$DB_BINDING_NAME-run.sh ./$ycsb_folder_name @@ -111,9 +111,11 @@ cp ./aggregate_multiple_file_results.py ./$ycsb_folder_name cp ./converting_log_to_csv.py ./$ycsb_folder_name if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then + echo "########## Setting up Application Insights ###########" export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 - export MAVEN_OPTS=-javaagent:"ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + export JAVA_OPTS="$JAVA_OPTS -javaagent:"ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + echo env fi # Adding chaos scripts From 9889ca50771f979bda226e5a24ae6e3f4b5e887b Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Wed, 20 Mar 2024 10:24:52 -0700 Subject: [PATCH 42/58] added java agent args --- cosmos/scripts/azurecosmos-run.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/azurecosmos-run.sh b/cosmos/scripts/azurecosmos-run.sh index 7e6ca8ec..b3240f61 100644 --- a/cosmos/scripts/azurecosmos-run.sh +++ b/cosmos/scripts/azurecosmos-run.sh @@ -168,13 +168,13 @@ log_filename="/tmp/ycsb.log" if [ ! -z "$threads" ] && [ ! -z "$target" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -target $target 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -target $target 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" elif [ ! -z "$threads" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" elif [ ! -z "$target" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -target $target 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -target $target 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" else - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" fi From 6dfc74fe2df1cb4bdbc8dcf7a07136ee2920709d Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Wed, 20 Mar 2024 10:43:50 -0700 Subject: [PATCH 43/58] fixing bug --- cosmos/scripts/custom-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 2c38fa58..a5c1cc52 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -114,7 +114,7 @@ if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then echo "########## Setting up Application Insights ###########" export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 - export JAVA_OPTS="$JAVA_OPTS -javaagent:"ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + export JAVA_OPTS="$JAVA_OPTS -javaagent:/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" echo env fi From 6838f0dc64498e11c26a290dfd019d2b5aeb0d7d Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Wed, 20 Mar 2024 11:17:51 -0700 Subject: [PATCH 44/58] updated the jvm args --- cosmos/scripts/azurecosmos-run.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/azurecosmos-run.sh b/cosmos/scripts/azurecosmos-run.sh index b3240f61..75c28e1e 100644 --- a/cosmos/scripts/azurecosmos-run.sh +++ b/cosmos/scripts/azurecosmos-run.sh @@ -168,13 +168,13 @@ log_filename="/tmp/ycsb.log" if [ ! -z "$threads" ] && [ ! -z "$target" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -target $target 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -target $target -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" elif [ ! -z "$threads" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" elif [ ! -z "$target" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -target $target 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -target $target -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" else - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s 2>&1 | tee -a "$log_filename" -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" fi From bc0d70252f0c8054e7a65a62147728a588e4515c Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Wed, 20 Mar 2024 11:34:02 -0700 Subject: [PATCH 45/58] removed the jvm args --- cosmos/scripts/azurecosmos-run.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/azurecosmos-run.sh b/cosmos/scripts/azurecosmos-run.sh index 75c28e1e..7e6ca8ec 100644 --- a/cosmos/scripts/azurecosmos-run.sh +++ b/cosmos/scripts/azurecosmos-run.sh @@ -168,13 +168,13 @@ log_filename="/tmp/ycsb.log" if [ ! -z "$threads" ] && [ ! -z "$target" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -target $target -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -target $target 2>&1 | tee -a "$log_filename" elif [ ! -z "$threads" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -threads $threads 2>&1 | tee -a "$log_filename" elif [ ! -z "$target" ] then - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -target $target -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -target $target 2>&1 | tee -a "$log_filename" else - ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s -jvm-args= -javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" 2>&1 | tee -a "$log_filename" + ./bin/ycsb.sh $operation azurecosmos -P workloads/$workload -P azurecosmos.properties -s 2>&1 | tee -a "$log_filename" fi From 6ccb82d5ab3383c5b4e97124fef49a6bc2e9fe70 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Wed, 20 Mar 2024 11:44:39 -0700 Subject: [PATCH 46/58] Fixed bugs --- cosmos/scripts/custom-script.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index a5c1cc52..8c1e0299 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -83,7 +83,7 @@ echo "########## Cloning Test Bench repository ##########" git clone -b "$BENCHMARKING_TOOLS_BRANCH_NAME" --single-branch "$BENCHMARKING_TOOLS_URL" echo "########## Pulling Latest YCSB TOOLS ##########" git -C azure-db-benchmarking pull -mkdir -p /tmp/ycsb +mkdir /tmp/ycsb # Clearing data from previous run rm -rf /tmp/ycsb/* rm -rf "/tmp/$VM_NAME-system-diagnostics" @@ -102,7 +102,7 @@ cp -r ./$DB_BINDING_NAME/target/ycsb-$DB_BINDING_NAME-binding*.tar.gz /tmp/ycsb cp -r ./$DB_BINDING_NAME/conf/* /tmp/ycsb cd /tmp/ycsb/ -ycsb_folder_name=ycsb-$DB_BINDING_NAME-binding-*-SNAPSHOTexport APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 +ycsb_folder_name=ycsb-$DB_BINDING_NAME-binding-*-SNAPSHOT echo "########## Extracting YCSB ##########" tar xfvz ycsb-$DB_BINDING_NAME-binding*.tar.gz cp ./$DB_BINDING_NAME-run.sh ./$ycsb_folder_name @@ -114,8 +114,6 @@ if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then echo "########## Setting up Application Insights ###########" export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 - export JAVA_OPTS="$JAVA_OPTS -javaagent:/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" - echo env fi # Adding chaos scripts From b4bb2e39100e29c605f2bb86bc91fb4a7cdcd56b Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 01:10:47 -0700 Subject: [PATCH 47/58] Added JAVA_OPTS to custom_script --- cosmos/scripts/custom-script.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 8c1e0299..c4b3c8f4 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -114,6 +114,7 @@ if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then echo "########## Setting up Application Insights ###########" export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 + export JAVA_OPTS=-javaagent:"tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" fi # Adding chaos scripts From 94834c60995ce3db4f2e66386a0e0cf0cb0908d1 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 09:16:01 -0700 Subject: [PATCH 48/58] updated the JAVA_OPTS --- cosmos/scripts/custom-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index c4b3c8f4..f2bb8a9b 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -114,7 +114,7 @@ if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then echo "########## Setting up Application Insights ###########" export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 - export JAVA_OPTS=-javaagent:"tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" + export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" fi # Adding chaos scripts From 3ad884984df182e4cf720f9ebac53fde1b93aed6 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 09:30:30 -0700 Subject: [PATCH 49/58] Added setenv.sh --- cosmos/scripts/custom-script.sh | 7 +------ cosmos/scripts/setenv.sh | 10 ++++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 cosmos/scripts/setenv.sh diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index f2bb8a9b..305ce0a3 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -110,12 +110,7 @@ cp ./*.properties ./$ycsb_folder_name cp ./aggregate_multiple_file_results.py ./$ycsb_folder_name cp ./converting_log_to_csv.py ./$ycsb_folder_name -if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then - echo "########## Setting up Application Insights ###########" - export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR - export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 - export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" -fi +appInsightConnectionString=$APP_INSIGHT_CONN_STR bash source ./setenv.sh # Adding chaos scripts cp ./chaos/*.sh ./$ycsb_folder_name diff --git a/cosmos/scripts/setenv.sh b/cosmos/scripts/setenv.sh new file mode 100644 index 00000000..2d8a6b99 --- /dev/null +++ b/cosmos/scripts/setenv.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +if [ -n "$appInsightConnectionString" ] && [ "$appInsightConnectionString" != "null" ]; then + echo "########## Setting up Application Insights ###########" + export APPLICATIONINSIGHTS_CONNECTION_STRING=$appInsightConnectionString + export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 + export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" +fi From fcc75c77afd77938716c670a935bf16fb932f458 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 09:38:34 -0700 Subject: [PATCH 50/58] appending env variables to bashrc --- cosmos/scripts/custom-script.sh | 7 ++++++- cosmos/scripts/setenv.sh | 10 ---------- 2 files changed, 6 insertions(+), 11 deletions(-) delete mode 100644 cosmos/scripts/setenv.sh diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 305ce0a3..6c07329b 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -110,7 +110,12 @@ cp ./*.properties ./$ycsb_folder_name cp ./aggregate_multiple_file_results.py ./$ycsb_folder_name cp ./converting_log_to_csv.py ./$ycsb_folder_name -appInsightConnectionString=$APP_INSIGHT_CONN_STR bash source ./setenv.sh +if [ -n "$appInsightConnectionString" ] && [ "$appInsightConnectionString" != "null" ]; then + echo "########## Setting up Application Insights ###########" + echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=$appInsightConnectionString' >> ~/.bashrc && source ~/.bashrc + echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.bashrc && source ~/.bashrc + echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.bashrc && source ~/.bashrc +fi # Adding chaos scripts cp ./chaos/*.sh ./$ycsb_folder_name diff --git a/cosmos/scripts/setenv.sh b/cosmos/scripts/setenv.sh deleted file mode 100644 index 2d8a6b99..00000000 --- a/cosmos/scripts/setenv.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -if [ -n "$appInsightConnectionString" ] && [ "$appInsightConnectionString" != "null" ]; then - echo "########## Setting up Application Insights ###########" - export APPLICATIONINSIGHTS_CONNECTION_STRING=$appInsightConnectionString - export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10 - export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar" -fi From b43e9e4327e6e3cdad9e379fe73cd71fbc99ae90 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 10:57:12 -0700 Subject: [PATCH 51/58] Fixed variable name --- cosmos/scripts/custom-script.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 6c07329b..bb5e707a 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -110,11 +110,12 @@ cp ./*.properties ./$ycsb_folder_name cp ./aggregate_multiple_file_results.py ./$ycsb_folder_name cp ./converting_log_to_csv.py ./$ycsb_folder_name -if [ -n "$appInsightConnectionString" ] && [ "$appInsightConnectionString" != "null" ]; then +if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then echo "########## Setting up Application Insights ###########" - echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=$appInsightConnectionString' >> ~/.bashrc && source ~/.bashrc - echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.bashrc && source ~/.bashrc - echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.bashrc && source ~/.bashrc + echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR' >> ~/.bashrc + echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.bashrc + echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.bashrc + source ~/.bashrc fi # Adding chaos scripts From 24bba26af5342341956e8b9680db26b195f9b84b Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 11:38:02 -0700 Subject: [PATCH 52/58] moved the env variable export to execute.sh --- cosmos/scripts/custom-script.sh | 8 -------- cosmos/scripts/execute.sh | 9 +++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index bb5e707a..2b6edd19 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -110,14 +110,6 @@ cp ./*.properties ./$ycsb_folder_name cp ./aggregate_multiple_file_results.py ./$ycsb_folder_name cp ./converting_log_to_csv.py ./$ycsb_folder_name -if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then - echo "########## Setting up Application Insights ###########" - echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHT_CONN_STR' >> ~/.bashrc - echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.bashrc - echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.bashrc - source ~/.bashrc -fi - # Adding chaos scripts cp ./chaos/*.sh ./$ycsb_folder_name cp ./chaos/*.ps1 ./$ycsb_folder_name diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index a07fa5e8..97a39a61 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -22,6 +22,15 @@ then exit 1 else echo Starting the worklaod. + +if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then + echo "########## Setting up Application Insights ###########" + echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=${APP_INSIGHT_CONN_STR}' >> ~/.bashrc + echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.bashrc + echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.bashrc + source ~/.bashrc +fi + # Running custom-script in background, arm template completion wont wait on this # stdout and stderr will be logged in <$HOME>/agent.out and <$HOME>/agent.err curl -o custom-script.sh $CUSTOM_SCRIPT_URL From 7793774600d4d9064ac701b3994a874a5e8eaa34 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 11:57:29 -0700 Subject: [PATCH 53/58] adding env variables to profile file --- cosmos/scripts/execute.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index 97a39a61..5c86468a 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -25,10 +25,10 @@ else if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then echo "########## Setting up Application Insights ###########" - echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=${APP_INSIGHT_CONN_STR}' >> ~/.bashrc - echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.bashrc - echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.bashrc - source ~/.bashrc + echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=${APP_INSIGHT_CONN_STR}' >> ~/.profile + echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.profile + echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.profile + source ~/.profile fi # Running custom-script in background, arm template completion wont wait on this From a273b994c236ab23eb7627854325ad47d30d5b62 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Thu, 21 Mar 2024 18:31:39 -0700 Subject: [PATCH 54/58] added parameters for application insights --- cosmos/infra/azuredeploy.json | 9 ++++++++- cosmos/scripts/custom-script.sh | 7 +++++-- cosmos/scripts/execute.sh | 5 +++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index 4ec9587f..295026fd 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -260,6 +260,13 @@ "description": "Specifies the threshold for request units. If latency exceeds this threshold, it will be logged in cosmos client diagnostics log." } }, + "appInsightsMetricIntervalInSeconds": { + "type": "int", + "defaultValue": 10, + "metadata": { + "description": "Specifies the interval in seconds for logging metrics to application insights." + } + }, "ycsbDatabaseBindingName": { "type": "string", "defaultValue": "azurecosmos", @@ -536,7 +543,7 @@ "settings": { }, "protectedSettings": { - "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','PROJECT_NAME=',parameters('projectName'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ','POINT_OPERATION_THRESHOLD_IN_MS=','\"',parameters('pointOperationLatencyThresholdInMS'),'\"',' ','NON_POINT_OPERATION_THRESHOLD_IN_MS=','\"',parameters('nonPointOperationLatencyThresholdInMS'),'\"',' ','REQUEST_CHARGE_THRESHOLD=','\"',parameters('requestChargeThreshold'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", + "commandToExecute": "[concat('DB_BINDING_NAME=',parameters('ycsbDatabaseBindingName'),' ','ADMIN_USER_NAME=',parameters('adminUsername'),' ','PROJECT_NAME=',parameters('projectName'),' ','BENCHMARKING_TOOLS_URL=',variables('benchmarkingToolsURL'),' ','BENCHMARKING_TOOLS_BRANCH_NAME=',parameters('benchmarkingToolsBranchName'),' ','YCSB_GIT_REPO_URL=',variables('ycsbGitHubRepoUrl'),' ','GUID=',parameters('guidValue'),' ','YCSB_GIT_BRANCH_NAME=',parameters('ycsbGitHubBranchName'),' ','TARGET_OPERATIONS_PER_SECOND=',parameters('targetOperationsPerSecond'),' ','THREAD_COUNT=',parameters('threads'),' ','YCSB_OPERATION_COUNT=',parameters('ycsbOperationCount'), ' ','WORKLOAD_TYPE=',parameters('workloadType'),' ','VM_NAME=',variables('vmName'),copyIndex(1), ' ','RESULT_STORAGE_CONNECTION_STRING=','\"',parameters('resultsStorageConnectionString'),'\"',' ','COSMOS_URI=','\"',parameters('cosmosURI'),'\"', ' ','COSMOS_KEY=',parameters('cosmosKey'), ' ','VM_COUNT=',parameters('vmCount'), ' ','USE_GATEWAY=',parameters('useGateway'), ' ','DIAGNOSTICS_LATENCY_THRESHOLD_IN_MS=',parameters('diagnosticsLatencyThresholdInMS'), ' ','YCSB_RECORD_COUNT=',parameters('ycsbRecordCount'), ' ','WRITE_ONLY_OPERATION=',parameters('writeOnlyOperation'), ' ','READ_PROPORTION=',parameters('readproportion'), ' ','SCAN_PROPORTION=',parameters('scanproportion'), ' ','UPDATE_PROPORTION=',parameters('updateproportion'), ' ','INSERT_PROPORTION=',parameters('insertproportion'), ' ','REQUEST_DISTRIBUTION=',parameters('requestdistribution'), ' ','INSERT_ORDER=',parameters('insertorder'), ' ','CUSTOM_SCRIPT_URL=',variables('customScriptUrl'), ' ','MACHINE_INDEX=',copyIndex(1), ' ','INCLUDE_EXCEPTION_STACK=',parameters('includeExceptionStackInLog'), ' ','FIELD_COUNT=',parameters('fieldcount'), ' ','SKIP_LOAD_PHASE=',parameters('skipLoadPhase'), ' ','WAIT_FOR_FAULT_TO_START_IN_SEC=',parameters('waitForFaultToStartInSec'), ' ','DURATION_OF_FAULT_IN_SEC=',parameters('durationOfFaultInSec'), ' ','DROP_PROBABILITY=',parameters('dropProbability'), ' ','FAULT_REGION=','\"',parameters('faultRegion'),'\"',' ','DELAY_IN_MS=',parameters('delayInMs'),' ','USER_AGENT=',parameters('userAgent'), ' ','PREFERRED_REGION_LIST=','\"',parameters('preferredRegionList'),'\"',' ','APP_INSIGHT_CONN_STR=','\"',parameters('appInsightConnectionString'),'\"',' ','POINT_OPERATION_THRESHOLD_IN_MS=','\"',parameters('pointOperationLatencyThresholdInMS'),'\"',' ','NON_POINT_OPERATION_THRESHOLD_IN_MS=','\"',parameters('nonPointOperationLatencyThresholdInMS'),'\"',' ','REQUEST_CHARGE_THRESHOLD=','\"',parameters('requestChargeThreshold'),'\"',' ','APP_INSIGHT_METRIC_INTERVAL_IN_SECONDS=','\"',parameters('appInsightsMetricIntervalInSeconds'),'\"',' ', 'bash ',variables('vmScriptExtensionScriptName'))]", "fileUris": [ "[concat(variables('vmScriptExtensionScriptURL'))]" ] } }, diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 2b6edd19..88b2a54c 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -18,6 +18,11 @@ # The BENCHMARKING_TOOLS_BRANCH_NAME and BENCHMARKING_TOOLS_URL environment variables are used to clone the benchmarking tools repository. # The YCSB_GIT_BRANCH_NAME and YCSB_GIT_REPO_URL environment variables are used to clone the YCSB repository. # The WAIT_FOR_FAULT_TO_START_IN_SEC, DURATION_OF_FAULT_IN_SEC, DROP_PROBABILITY, FAULT_REGION, and DELAY_IN_MS environment variables are used to configure fault injection. +# The USER_AGENT environment variable is used to set the user agent for the test. +# The CONSISTENCY_LEVEL environment variable is used to set the Cosmos DB consistency level for the test. +# The APP_INSIGHT_CONN_STR environment variable is used to set the Application Insights connection string. +# The POINT_OPERATION_THRESHOLD and NON_POINT_OPERATION_THRESHOLD environment variables are used to set the latency thresholds for point and non-point operations, if these thresholds are breached client diagnotics will be logged for the request. +# The REQUEST_CHARGE_THRESHOLD environment variable is used to set the request charge threshold for the test, if this threshold is breached client diagnotics will be logged for the request. # The script starts by printing the values of all the environment variables. # It then clones the benchmarking tools and YCSB repositories, and builds YCSB from source. @@ -28,8 +33,6 @@ # This script assumes that the Azure CLI and azcopy are installed and that the user is logged in to the Azure CLI. # This script should be run on a virtual machine that has network access to the Cosmos DB instance. - - echo "##########PROJECT_NAME###########: $PROJECT_NAME" echo "##########DB_BINDING_NAME###########: $DB_BINDING_NAME" echo "##########VM NAME###########: $VM_NAME" diff --git a/cosmos/scripts/execute.sh b/cosmos/scripts/execute.sh index 5c86468a..b8945ee5 100644 --- a/cosmos/scripts/execute.sh +++ b/cosmos/scripts/execute.sh @@ -21,12 +21,13 @@ then exit 1 else - echo Starting the worklaod. + echo Starting the workload. +# Setting up Application Insights if [ -n "$APP_INSIGHT_CONN_STR" ] && [ "$APP_INSIGHT_CONN_STR" != "null" ]; then echo "########## Setting up Application Insights ###########" echo 'export APPLICATIONINSIGHTS_CONNECTION_STRING=${APP_INSIGHT_CONN_STR}' >> ~/.profile - echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=10' >> ~/.profile + echo 'export APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS=${APP_INSIGHT_METRIC_INTERVAL_IN_SECONDS}' >> ~/.profile echo 'export JAVA_OPTS=-javaagent:"/tmp/ycsb/ycsb-azurecosmos-binding-0.18.0-SNAPSHOT/lib/applicationinsights-agent-3.5.1.jar"' >> ~/.profile source ~/.profile fi From 94e7bfeacf4a5b162a87b28a42f44a94c808bec6 Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 5 Apr 2024 13:30:54 -0700 Subject: [PATCH 55/58] Merged with main and updated the description --- cosmos/infra/azuredeploy.json | 4 +- cosmos/infra/azuredeploy_mongo.json | 4 +- .../10-thousand-rps-read/azuredeploy.json | 2 +- .../20-thousand-rps-read/azuredeploy.json | 2 +- .../30-thousand-rps-read/azuredeploy.json | 2 +- .../read/5-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/try-it-read/azuredeploy.json | 2 +- .../10-thousand-rps-update/azuredeploy.json | 2 +- .../20-thousand-rps-update/azuredeploy.json | 2 +- .../30-thousand-rps-update/azuredeploy.json | 2 +- .../5-thousand-rps-update/azuredeploy.json | 2 +- .../10-thousand-rps-write/azuredeploy.json | 2 +- .../20-thousand-rps-write/azuredeploy.json | 2 +- .../30-thousand-rps-write/azuredeploy.json | 2 +- .../5-thousand-rps-write/azuredeploy.json | 2 +- cosmos/scripts/chaos/chaos_script.sh | 4 +- cosmos/scripts/custom-script.sh | 39 ++++++++++--------- .../build-your-own-recipe/azuredeploy.json | 2 +- .../delay/recipes/read-delay/azuredeploy.json | 2 +- .../recipes/read-patch-delay/azuredeploy.json | 2 +- .../recipes/read-outage/azuredeploy.json | 2 +- .../read-patch-outage/azuredeploy.json | 2 +- .../recipes/write-outage/azuredeploy.json | 2 +- .../recipes/build-your-own/azuredeploy.json | 2 +- .../read/1-million-rps-read/azuredeploy.json | 2 +- .../10-thousand-rps-read/azuredeploy.json | 2 +- .../100-thousand-rps-read/azuredeploy.json | 2 +- .../20-thousand-rps-read/azuredeploy.json | 2 +- .../30-thousand-rps-read/azuredeploy.json | 2 +- .../50-thousand-rps-read/azuredeploy.json | 2 +- .../500-thousand-rps-read/azuredeploy.json | 2 +- .../recipes/read/try-it-read/azuredeploy.json | 12 +----- .../10-thousand-rps-update/azuredeploy.json | 2 +- .../100-thousand-rps-update/azuredeploy.json | 2 +- .../20-thousand-rps-update/azuredeploy.json | 2 +- .../30-thousand-rps-update/azuredeploy.json | 2 +- .../50-thousand-rps-update/azuredeploy.json | 2 +- .../500-thousand-rps-update/azuredeploy.json | 2 +- .../1-million-rps-write/azuredeploy.json | 2 +- .../10-thousand-rps-write/azuredeploy.json | 2 +- .../100-thousand-rps-write/azuredeploy.json | 2 +- .../20-thousand-rps-write/azuredeploy.json | 2 +- .../30-thousand-rps-write/azuredeploy.json | 2 +- .../50-thousand-rps-write/azuredeploy.json | 2 +- .../500-thousand-rps-write/azuredeploy.json | 2 +- 45 files changed, 67 insertions(+), 76 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index b36b21aa..68359219 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -4,9 +4,9 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/infra/azuredeploy_mongo.json b/cosmos/infra/azuredeploy_mongo.json index 1da607a2..439d3e2e 100644 --- a/cosmos/infra/azuredeploy_mongo.json +++ b/cosmos/infra/azuredeploy_mongo.json @@ -4,9 +4,9 @@ "parameters": { "projectName": { "type": "string", - "defaultValue": "Benchmarking", + "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index 5cfda410..a3c86ed8 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index 6101b5b4..bb61130c 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index 30465b1a..2ed3c40f 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json index d67f3fbc..ed2e06f3 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index b73a8edb..63ba50db 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index c6e7eabe..10d47880 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index e46b44b2..e5d7732e 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index 2ecf1543..3e5a6f81 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json index f729ae98..8a63264f 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index 87c48bdc..b447cab5 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index e77f89ea..945287a7 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index 8391dc2a..78145e3f 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json index 56a926bc..572f5f85 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/scripts/chaos/chaos_script.sh b/cosmos/scripts/chaos/chaos_script.sh index 9e236100..49c3b783 100644 --- a/cosmos/scripts/chaos/chaos_script.sh +++ b/cosmos/scripts/chaos/chaos_script.sh @@ -81,8 +81,8 @@ if [ -z "$duration_of_fault_in_sec" ]; then fi if [ -z "$fault_region" ]; then - echo "Error: The fault_region environment variable is not set." - echo "Please set the fault_region environment variable and try again." + echo "The fault_region is not set. Please pass it with -r option." + usage exit 1 fi diff --git a/cosmos/scripts/custom-script.sh b/cosmos/scripts/custom-script.sh index 88b2a54c..294adc28 100644 --- a/cosmos/scripts/custom-script.sh +++ b/cosmos/scripts/custom-script.sh @@ -4,27 +4,27 @@ # Licensed under the MIT License. # This script is used to run a YCSB (Yahoo! Cloud Serving Benchmark) test on a Cosmos DB instance. -# It takes several environment variables as input, which are used to configure the test. +# It takes several inputs, which are used to configure the test. # The script supports both load and run operations, and can optionally introduce faults during the test. -# The PROJECT_NAME environment variable is used to name the benchmark. -# The DB_BINDING_NAME environment variable specifies the YCSB binding to use. -# The VM_NAME environment variable is used to name the virtual machine that runs the test. -# The YCSB_RECORD_COUNT environment variable specifies the number of records for the test. -# The MACHINE_INDEX environment variable is used to calculate the start index for insert operations. -# The YCSB_OPERATION_COUNT environment variable specifies the number of operations for the test. -# The VM_COUNT environment variable is used to calculate the total number of records for read operations. -# The WRITE_ONLY_OPERATION environment variable determines whether to run a write-only workload. -# The BENCHMARKING_TOOLS_BRANCH_NAME and BENCHMARKING_TOOLS_URL environment variables are used to clone the benchmarking tools repository. -# The YCSB_GIT_BRANCH_NAME and YCSB_GIT_REPO_URL environment variables are used to clone the YCSB repository. -# The WAIT_FOR_FAULT_TO_START_IN_SEC, DURATION_OF_FAULT_IN_SEC, DROP_PROBABILITY, FAULT_REGION, and DELAY_IN_MS environment variables are used to configure fault injection. -# The USER_AGENT environment variable is used to set the user agent for the test. -# The CONSISTENCY_LEVEL environment variable is used to set the Cosmos DB consistency level for the test. -# The APP_INSIGHT_CONN_STR environment variable is used to set the Application Insights connection string. -# The POINT_OPERATION_THRESHOLD and NON_POINT_OPERATION_THRESHOLD environment variables are used to set the latency thresholds for point and non-point operations, if these thresholds are breached client diagnotics will be logged for the request. -# The REQUEST_CHARGE_THRESHOLD environment variable is used to set the request charge threshold for the test, if this threshold is breached client diagnotics will be logged for the request. - -# The script starts by printing the values of all the environment variables. +# The PROJECT_NAME variable is used to name the benchmark. +# The DB_BINDING_NAME variable specifies the YCSB binding to use. +# The VM_NAME variable is used to name the virtual machine that runs the test. +# The YCSB_RECORD_COUNT variable specifies the number of records for the test. +# The MACHINE_INDEX variable is used to calculate the start index for insert operations. +# The YCSB_OPERATION_COUNT variable specifies the number of operations for the test. +# The VM_COUNT variable is used to calculate the total number of records for read operations. +# The WRITE_ONLY_OPERATION variable determines whether to run a write-only workload. +# The BENCHMARKING_TOOLS_BRANCH_NAME and BENCHMARKING_TOOLS_URL variables are used to clone the benchmarking tools repository. +# The YCSB_GIT_BRANCH_NAME and YCSB_GIT_REPO_URL variables are used to clone the YCSB repository. +# The WAIT_FOR_FAULT_TO_START_IN_SEC, DURATION_OF_FAULT_IN_SEC, DROP_PROBABILITY, FAULT_REGION, and DELAY_IN_MS variables are used to configure fault injection. +# The USER_AGENT variable is used to set the user agent for the test. +# The CONSISTENCY_LEVEL variable is used to set the Cosmos DB consistency level for the test. +# The APP_INSIGHT_CONN_STR variable is used to set the Application Insights connection string. +# The POINT_OPERATION_THRESHOLD and NON_POINT_OPERATION_THRESHOLD variables are used to set the latency thresholds for point and non-point operations, if these thresholds are breached client diagnotics will be logged for the request. +# The REQUEST_CHARGE_THRESHOLD variable is used to set the request charge threshold for the test, if this threshold is breached client diagnotics will be logged for the request. + +# The script starts by printing the values of all the input variables. # It then clones the benchmarking tools and YCSB repositories, and builds YCSB from source. # The script then checks whether to run a load operation, and if so, it executes the load operation. # After the load operation, the script checks whether to introduce faults, and if so, it starts a chaos script. @@ -106,6 +106,7 @@ cp -r ./$DB_BINDING_NAME/conf/* /tmp/ycsb cd /tmp/ycsb/ ycsb_folder_name=ycsb-$DB_BINDING_NAME-binding-*-SNAPSHOT +user_home="/home/${ADMIN_USER_NAME}" echo "########## Extracting YCSB ##########" tar xfvz ycsb-$DB_BINDING_NAME-binding*.tar.gz cp ./$DB_BINDING_NAME-run.sh ./$ycsb_folder_name diff --git a/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json index 179ab6ae..a529802d 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json index 5621895d..c03e28f3 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json index 61bf8511..eebaca08 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json index cde164c0..bbf304ae 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json index cf2624ad..78cc75a9 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json index c1b4d393..f2fb1562 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json index 38c49158..ef56974a 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json index 47e05756..87ad9d79 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index ff941c2a..79c9777e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json index 6afca221..70c01230 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index d563aa5f..1f29a74e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index f77efc2b..d4d4c6e0 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json index 1798a95b..d4395761 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json index cf15463a..7a7d21f9 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index 97465e1e..01b29e6c 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { @@ -183,13 +183,6 @@ "metadata": { "description": "Specifies field count in the item" } - }, - "appInsightConnectionString": { - "type": "string", - "defaultValue": "", - "metadata": { - "description": "Specifies application insight connection string for live monitering" - } } }, "variables": { @@ -290,9 +283,6 @@ }, "fieldcount": { "value": "[parameters('fieldcount')]" - }, - "appInsightConnectionString": { - "value": "[parameters('appInsightConnectionString')]" } } } diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index 389e2823..7bb61a7a 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json index c4eabf39..646d30a9 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index 58a1598d..0b609910 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index de588d1c..702856f4 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json index 8da2fe6e..dcb2ed1c 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json index 6c099ac6..158cf03a 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json index 004cb221..e90db159 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index 084a93b9..c613e3e5 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json index e9c678ac..de5849e7 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index 05ab8ce8..9bc5730e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index a7652921..7102ba0e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json index dba4ced4..d2a4e30b 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json index 659eba81..c90c2fa6 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." } }, "location": { From e8c26a11ac3cc0e17753155356c9446617cf9fbc Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 5 Apr 2024 13:37:16 -0700 Subject: [PATCH 56/58] Updated description --- cosmos/infra/azuredeploy.json | 2 +- cosmos/infra/azuredeploy_mongo.json | 2 +- .../ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json | 2 +- .../java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json | 2 +- .../tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json | 2 +- .../ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json | 2 +- .../java/ycsb/chaos/build-your-own-recipe/azuredeploy.json | 2 +- .../network-faults/delay/recipes/read-delay/azuredeploy.json | 2 +- .../delay/recipes/read-patch-delay/azuredeploy.json | 2 +- .../network-faults/outage/recipes/read-outage/azuredeploy.json | 2 +- .../outage/recipes/read-patch-outage/azuredeploy.json | 2 +- .../network-faults/outage/recipes/write-outage/azuredeploy.json | 2 +- .../sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json | 2 +- .../java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json | 2 +- .../ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json | 2 +- .../tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json | 2 +- .../ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/100-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json | 2 +- .../recipes/update/500-thousand-rps-update/azuredeploy.json | 2 +- .../ycsb/recipes/write/1-million-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json | 2 +- .../ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json | 2 +- 43 files changed, 43 insertions(+), 43 deletions(-) diff --git a/cosmos/infra/azuredeploy.json b/cosmos/infra/azuredeploy.json index 68359219..2c05054b 100644 --- a/cosmos/infra/azuredeploy.json +++ b/cosmos/infra/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/infra/azuredeploy_mongo.json b/cosmos/infra/azuredeploy_mongo.json index 439d3e2e..f391e57a 100644 --- a/cosmos/infra/azuredeploy_mongo.json +++ b/cosmos/infra/azuredeploy_mongo.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index a3c86ed8..2d0aa2b1 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index bb61130c..28848510 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index 2ed3c40f..26d2c501 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json index ed2e06f3..33b1ec9d 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/5-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index 63ba50db..81c4a260 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index 10d47880..6be7e5cd 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index e5d7732e..a3c16227 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index 3e5a6f81..dd9c43c6 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json index 8a63264f..6decf49e 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/update/5-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index b447cab5..13c85315 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index 945287a7..4c892a56 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index 78145e3f..315943db 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json index 572f5f85..7d72fed1 100644 --- a/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json +++ b/cosmos/mongoapi/tools/java/ycsb/recipes/write/5-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json index a529802d..0393c0e2 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/build-your-own-recipe/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json index c03e28f3..076fec4c 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-delay/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json index eebaca08..413ee0b3 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/delay/recipes/read-patch-delay/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json index bbf304ae..1ddc8b71 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json index 78cc75a9..c55c57c0 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/read-patch-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json index f2fb1562..2d98d561 100644 --- a/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/chaos/network-faults/outage/recipes/write-outage/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "chaos", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json index ef56974a..d9db3537 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/build-your-own/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json index 87ad9d79..aeacc12d 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/1-million-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json index 79c9777e..7db9c699 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/10-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json index 70c01230..1dcbad91 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/100-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json index 1f29a74e..80891d0f 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/20-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json index d4d4c6e0..7cfdc117 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/30-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json index d4395761..3c91dc41 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/50-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json index 7a7d21f9..29031089 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/500-thousand-rps-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json index 01b29e6c..d6f34799 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json index 7bb61a7a..c914e8da 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/10-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json index 646d30a9..4c6dee10 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/100-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json index 0b609910..3f24614e 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/20-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json index 702856f4..a200e57c 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/30-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json index dcb2ed1c..9166d4db 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/50-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json index 158cf03a..2f6305e1 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/update/500-thousand-rps-update/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json index e90db159..8e701fd6 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/1-million-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json index c613e3e5..6a22da55 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/10-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json index de5849e7..771529bf 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/100-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json index 9bc5730e..797f54fa 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/20-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json index 7102ba0e..10bd7307 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/30-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json index d2a4e30b..057358fd 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/50-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { diff --git a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json index c90c2fa6..46cf8dd1 100644 --- a/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json +++ b/cosmos/sql/tools/java/ycsb/recipes/write/500-thousand-rps-write/azuredeploy.json @@ -6,7 +6,7 @@ "type": "string", "defaultValue": "benchmarking", "metadata": { - "description": "Specifies a name for generating resource names. Should be one word, lowercase, do not use any hypens/minus or underscores." + "description": "Specifies a name for generating resource names. Should be one word, lowercase letters and numbers only." } }, "location": { From 54cda90d42f3f83c1e022c38feae5e8ca81fce0c Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 5 Apr 2024 13:42:26 -0700 Subject: [PATCH 57/58] Reverted the change to have time in milliseconds --- .../aggregate_multiple_file_results.py | 139 ++++-------------- cosmos/scripts/converting_log_to_csv.py | 38 ++--- 2 files changed, 47 insertions(+), 130 deletions(-) diff --git a/cosmos/scripts/aggregate_multiple_file_results.py b/cosmos/scripts/aggregate_multiple_file_results.py index 761e3e7d..7db23108 100644 --- a/cosmos/scripts/aggregate_multiple_file_results.py +++ b/cosmos/scripts/aggregate_multiple_file_results.py @@ -1,22 +1,6 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -""" -This script aggregates results from multiple log files. It takes a directory containing log files as input and outputs a CSV file containing aggregated metrics from the log files. - -Usage: - python aggregate_multiple_files_result.py - -Arguments: - FilesDirectory: The directory containing the log files to aggregate. - -Raises: - Exception: If the FilesDirectory argument is not provided. - -Outputs: - A CSV file named 'aggregation.csv' containing aggregated metrics from the log files. -""" - import csv import glob import os @@ -28,7 +12,6 @@ def main(): raise Exception("Input log files directory not provided. Syntax = 'python aggregate_multiple_files_result.py " "'") path = sys.argv[1] - # Initialize count and throughput variables total_read_count = 0 total_read_failed_count = 0 total_update_count = 0 @@ -39,14 +22,10 @@ def main(): total_scan_failed_count = 0 total_throughput = 0 - # Loop over all log files in the provided directory for filename in glob.glob(os.path.join(path, '*.log')): with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode current_file = open(filename, 'r') lines = current_file.readlines() - # For each line in the current log file, check if it contains certain keywords - # that indicate the type of operation and whether the operation was successful or failed - # Then increment the corresponding count variable by the number of operations indicated in the line for line in lines: if '[READ], Operations,' in line: total_read_count += int(line.replace('[READ], Operations, ', '')) @@ -67,7 +46,6 @@ def main(): elif '[OVERALL], Throughput(ops/sec), ' in line: total_throughput += float(line.replace('[OVERALL], Throughput(ops/sec), ', '')) - # Initialize latency variables total_read_avg = 0 total_read_p95 = 0 total_read_p99 = 0 @@ -116,7 +94,6 @@ def main(): total_scan_failed_min = sys.maxsize total_scan_failed_max = 0 - # Loop over all log files in the provided directory again for filename in glob.glob(os.path.join(path, '*.log')): with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode current_file = open(filename, 'r') @@ -130,10 +107,6 @@ def main(): current_scan_operation = 0 current_scan_failed_operation = 0 - # For each line in the current log file, check if it contains certain keywords - # that indicate the type of operation and whether the operation was successful or failed - # Then calculate the weighted average, 95th percentile, and 99th percentile latencies for the current - # operation and update the minimum and maximum latencies if necessary. for line in lines: if '[READ], ' in line and total_read_count == 0: continue @@ -351,108 +324,52 @@ def main(): if total_scan_failed_max < weighted_current_max: total_scan_failed_max = weighted_current_max - # Convert read times to milliseconds - total_read_avg_ms = total_read_avg / 1000 - total_read_p95_ms = total_read_p95 / 1000 - total_read_p99_ms = total_read_p99 / 1000 - total_read_min_ms = total_read_min / 1000 - total_read_max_ms = total_read_max / 1000 - - # Convert read failed times to milliseconds - total_read_failed_avg_ms = total_read_failed_avg / 1000 - total_read_failed_p95_ms = total_read_failed_p95 / 1000 - total_read_failed_p99_ms = total_read_failed_p99 / 1000 - total_read_failed_min_ms = total_read_failed_min / 1000 - total_read_failed_max_ms = total_read_failed_max / 1000 - - # Convert update times to milliseconds - total_update_avg_ms = total_update_avg / 1000 - total_update_p95_ms = total_update_p95 / 1000 - total_update_p99_ms = total_update_p99 / 1000 - total_update_min_ms = total_update_min / 1000 - total_update_max_ms = total_update_max / 1000 - - # Convert update failed times to milliseconds - total_update_failed_avg_ms = total_update_failed_avg / 1000 - total_update_failed_p95_ms = total_update_failed_p95 / 1000 - total_update_failed_p99_ms = total_update_failed_p99 / 1000 - total_update_failed_min_ms = total_update_failed_min / 1000 - total_update_failed_max_ms = total_update_failed_max / 1000 - - # Convert write times to milliseconds - total_write_avg_ms = total_write_avg / 1000 - total_write_p95_ms = total_write_p95 / 1000 - total_write_p99_ms = total_write_p99 / 1000 - total_write_min_ms = total_write_min / 1000 - total_write_max_ms = total_write_max / 1000 - - # Convert write failed times to milliseconds - total_write_failed_avg_ms = total_write_failed_avg / 1000 - total_write_failed_p95_ms = total_write_failed_p95 / 1000 - total_write_failed_p99_ms = total_write_failed_p99 / 1000 - total_write_failed_min_ms = total_write_failed_min / 1000 - total_write_failed_max_ms = total_write_failed_max / 1000 - - # Convert scan times to milliseconds - total_scan_avg_ms = total_scan_avg / 1000 - total_scan_p95_ms = total_scan_p95 / 1000 - total_scan_p99_ms = total_scan_p99 / 1000 - total_scan_min_ms = total_scan_min / 1000 - total_scan_max_ms = total_scan_max / 1000 - - # Convert scan failed times to milliseconds - total_scan_failed_avg_ms = total_scan_failed_avg / 1000 - total_scan_failed_p95_ms = total_scan_failed_p95 / 1000 - total_scan_failed_p99_ms = total_scan_failed_p99 / 1000 - total_scan_failed_min_ms = total_scan_failed_min / 1000 - total_scan_failed_max_ms = total_scan_failed_max / 1000 - -# create the csv writer + # create the csv writer output_csv = open("aggregation" + ".csv", 'w', newline='') writer = csv.writer(output_csv) - header = ['Operation', 'Count', 'Throughput', 'Min(millisecond)', 'Max(millisecond)', 'Avg(millisecond)', - 'P95(millisecond)', 'P99(millisecond)'] + header = ['Operation', 'Count', 'Throughput', 'Min(microsecond)', 'Max(microsecond)', 'Avg(microsecond)', + 'P95(microsecond)', 'P99(microsecond)'] writer.writerow(header) if total_read_count > 0: - row_in_csv = ['READ', total_read_count, int(total_throughput), total_read_min_ms, total_read_max_ms, - int(total_read_avg_ms), int(total_read_p95_ms), - int(total_read_p99_ms)] + row_in_csv = ['READ', total_read_count, int(total_throughput), total_read_min, total_read_max, + int(total_read_avg), int(total_read_p95), + int(total_read_p99)] writer.writerow(row_in_csv) if total_read_failed_count > 0: - row_in_csv = ['READ-FAILED', total_read_failed_count, int(total_throughput), total_read_failed_min_ms, - total_read_failed_max_ms, - int(total_read_failed_avg_ms), - int(total_read_failed_p95_ms), int(total_read_failed_p99_ms)] + row_in_csv = ['READ-FAILED', total_read_failed_count, int(total_throughput), total_read_failed_min, + total_read_failed_max, + int(total_read_failed_avg), + int(total_read_failed_p95), int(total_read_failed_p99)] writer.writerow(row_in_csv) if total_update_count > 0: - row_in_csv = ['UPDATE', total_update_count, int(total_throughput), total_update_min_ms, total_update_max_ms, - int(total_update_avg_ms), int(total_update_p95_ms), - int(total_update_p99_ms)] + row_in_csv = ['UPDATE', total_update_count, int(total_throughput), total_update_min, total_update_max, + int(total_update_avg), int(total_update_p95), + int(total_update_p99)] writer.writerow(row_in_csv) if total_update_failed_count > 0: - row_in_csv = ['UPDATE-FAILED', total_update_failed_count, int(total_throughput), total_update_failed_min_ms, - total_update_failed_max_ms, int(total_update_failed_avg_ms), - int(total_update_failed_p95_ms), int(total_update_failed_p99_ms)] + row_in_csv = ['UPDATE-FAILED', total_update_failed_count, int(total_throughput), total_update_failed_min, + total_update_failed_max, int(total_update_failed_avg), + int(total_update_failed_p95), int(total_update_failed_p99)] writer.writerow(row_in_csv) if total_write_count > 0: - row_in_csv = ['WRITE', total_write_count, int(total_throughput), total_write_min_ms, total_write_max_ms, - int(total_write_avg_ms), int(total_write_p95_ms), - int(total_write_p99_ms)] + row_in_csv = ['WRITE', total_write_count, int(total_throughput), total_write_min, total_write_max, + int(total_write_avg), int(total_write_p95), + int(total_write_p99)] writer.writerow(row_in_csv) if total_write_failed_count > 0: - row_in_csv = ['WRITE-FAILED', total_write_failed_count, int(total_throughput), total_write_failed_min_ms, - total_write_failed_max_ms, int(total_write_failed_avg_ms), - int(total_write_failed_p95_ms), int(total_write_failed_p99_ms)] + row_in_csv = ['WRITE-FAILED', total_write_failed_count, int(total_throughput), total_write_failed_min, + total_write_failed_max, int(total_write_failed_avg), + int(total_write_failed_p95), int(total_write_failed_p99)] writer.writerow(row_in_csv) if total_scan_count > 0: - row_in_csv = ['SCAN', total_scan_count, int(total_throughput), total_scan_min_ms, total_scan_max_ms, - int(total_scan_avg_ms), int(total_scan_p95_ms), - int(total_scan_p99_ms)] + row_in_csv = ['SCAN', total_scan_count, int(total_throughput), total_scan_min, total_scan_max, + int(total_scan_avg), int(total_scan_p95), + int(total_scan_p99)] writer.writerow(row_in_csv) if total_scan_failed_count > 0: - row_in_csv = ['SCAN-FAILED', total_scan_failed_count, int(total_throughput), total_scan_failed_min_ms, - total_scan_failed_max_ms, int(total_scan_failed_avg_ms), - int(total_scan_failed_p95_ms), int(total_scan_failed_p99_ms)] + row_in_csv = ['SCAN-FAILED', total_scan_failed_count, int(total_throughput), total_scan_failed_min, + total_scan_failed_max, int(total_scan_failed_avg), + int(total_scan_failed_p95), int(total_scan_failed_p99)] writer.writerow(row_in_csv) output_csv.close() diff --git a/cosmos/scripts/converting_log_to_csv.py b/cosmos/scripts/converting_log_to_csv.py index 4d3a1c3f..768bb6d2 100644 --- a/cosmos/scripts/converting_log_to_csv.py +++ b/cosmos/scripts/converting_log_to_csv.py @@ -18,8 +18,8 @@ def main(): # create the csv writer output_csv = open(filename_withoutextention + ".csv", 'w', newline='') writer = csv.writer(output_csv) - header = ['Date', 'Time', 'Operation', 'RPS', 'Count', 'MAX(millisecond)', 'MIN(millisecond)', 'AVG(millisecond)', - 'P90(millisecond)', 'P99(millisecond)', 'P999(millisecond)', 'P9999(millisecond)'] + header = ['Date', 'Time', 'Operation', 'RPS', 'Count', 'MAX(microsecond)', 'MIN(microsecond)', 'AVG(microsecond)', + 'P90(microsecond)', 'P99(microsecond)', 'P999(microsecond)', 'P9999(microsecond)'] writer.writerow(header) # Strips the newline character @@ -61,13 +61,13 @@ def parse_line_for_formatting(line, writer): return operation = '' count = '' - max_in_milli_sec = '' - min_in_milli_sec = '' - avg_in_milli_sec = '' - p9999_in_milli_sec = '' - p999_in_milli_sec = '' - p99_in_milli_sec = '' - p90_in_milli_sec = '' + max_in_micro_sec = '' + min_in_micro_sec = '' + avg_in_micro_sec = '' + p9999_in_micro_sec = '' + p999_in_micro_sec = '' + p99_in_micro_sec = '' + p90_in_micro_sec = '' for metrics in third_part.split(' '): metrics = metrics.strip() metrics = metrics.replace(']', '') @@ -78,24 +78,24 @@ def parse_line_for_formatting(line, writer): elif 'Count=' in metrics: count = metrics.replace('Count=', '') elif 'Max=' in metrics: - max_in_milli_sec = format(float(metrics.replace('Max=', '')) / 1000, '.4f') + max_in_micro_sec = metrics.replace('Max=', '') elif 'Min=' in metrics: - min_in_milli_sec = format(float(metrics.replace('Min=', '')) / 1000, '.4f') + min_in_micro_sec = metrics.replace('Min=', '') elif 'Avg=' in metrics: - avg_in_milli_sec = format(float(metrics.replace('Avg=', '')) / 1000, '.4f') + avg_in_micro_sec = metrics.replace('Avg=', '') elif '99.99=' in metrics: - p9999_in_milli_sec = format(float(metrics.replace('99.99=', '')) / 1000, '.4f') + p9999_in_micro_sec = metrics.replace('99.99=', '') elif '99.9=' in metrics: - p999_in_milli_sec = format(float(metrics.replace('99.9=', '')) / 1000, '.4f') + p999_in_micro_sec = metrics.replace('99.9=', '') elif '99=' in metrics: - p99_in_milli_sec = format(float(metrics.replace('99=', '')) / 1000, '.4f') + p99_in_micro_sec = metrics.replace('99=', '') elif '90=' in metrics: - p90_in_milli_sec = format(float(metrics.replace('90=', '')) / 1000, '.4f') + p90_in_micro_sec = metrics.replace('90=', '') - row_in_csv = [date, time, operation, rps, count, max_in_milli_sec, min_in_milli_sec, avg_in_milli_sec, - p90_in_milli_sec, p99_in_milli_sec, p999_in_milli_sec, p9999_in_milli_sec] + row_in_csv = [date, time, operation, rps, count, max_in_micro_sec, min_in_micro_sec, avg_in_micro_sec, + p90_in_micro_sec, p99_in_micro_sec, p999_in_micro_sec, p9999_in_micro_sec] writer.writerow(row_in_csv) if __name__ == '__main__': - main() + main() \ No newline at end of file From ff9eb2ea8d76e57ff4e7ace6918bff7cc574f00d Mon Sep 17 00:00:00 2001 From: Darshan Patnekar Date: Fri, 5 Apr 2024 13:43:44 -0700 Subject: [PATCH 58/58] blank space --- cosmos/scripts/converting_log_to_csv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmos/scripts/converting_log_to_csv.py b/cosmos/scripts/converting_log_to_csv.py index 768bb6d2..be9d830a 100644 --- a/cosmos/scripts/converting_log_to_csv.py +++ b/cosmos/scripts/converting_log_to_csv.py @@ -98,4 +98,4 @@ def parse_line_for_formatting(line, writer): if __name__ == '__main__': - main() \ No newline at end of file + main()