From 84b422a120e769f39cbd665d7583967db274ba1e Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 8 Jan 2021 11:42:04 -0500 Subject: [PATCH 01/46] ui: Refactor AdvancedMultiSelect as a class AdvancedMultiSelect can be broken up and composed of smaller, more focused components. This commit refactors AdvancedMultiSelect from a functional component to a class component. --- .../ui-components/AdvancedMultiSelect.js | 162 ++++++++++-------- 1 file changed, 87 insertions(+), 75 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 9c1468d8d..38e52271e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,5 +1,4 @@ -import React, {useState} from 'react'; - +import React from "react"; import {Card, Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; @@ -22,14 +21,6 @@ function getSelectValuesAfterClick(valueArray, clickedValue) { } } -function onMasterCheckboxClick(checkboxValue, defaultArray, onChangeFnc) { - if (checkboxValue) { - onChangeFnc([]); - } else { - onChangeFnc(defaultArray); - } -} - // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function function getFullDefinitionsFromRegistry(refString, registry) { @@ -46,76 +37,97 @@ function getFullDefinitionByKey(refString, registry, itemKey) { return fullArray.filter(e => (e.enum[0] === itemKey))[0]; } -function setPaneInfo(refString, registry, itemKey, setPaneInfoFnc) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); - setPaneInfoFnc({title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}); -} - function getDefaultPaneParams(refString, registry) { let configSection = getObjectFromRegistryByRef(refString, registry); return ({title: configSection.title, content: configSection.description}); } -function AdvancedMultiSelect(props) { - const [masterCheckbox, setMasterCheckbox] = useState(true); - const { - schema, - id, - options, - value, - required, - disabled, - readonly, - multiple, - autofocus, - onChange, - registry - } = props; - const {enumOptions} = options; - const [infoPaneParams, setInfoPaneParams] = useState(getDefaultPaneParams(schema.items.$ref, registry)); - getDefaultPaneParams(schema.items.$ref, registry); - const selectValue = cloneDeep(value); - return ( -
- - - {props.schema.title} - - - {enumOptions.map(({value, label}, i) => { - return ( - setPaneInfo(schema.items.$ref, registry, value, setInfoPaneParams)}> - - - {label} - - - ); - })} - - -
- ); +class AdvancedMultiSelect extends React.Component { + constructor(props) { + super(props) + this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; + this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + } + + onMasterCheckboxClick() { + if (this.state.masterCheckbox) { + this.props.onChange([]); + } else { + this.props.onChange(this.props.schema.default); + } + + this.toggleMasterCheckbox(); + } + + toggleMasterCheckbox() { + this.setState((state) => ({ + masterCheckbox: !state.masterCheckbox + })); + } + + setPaneInfo(refString, registry, itemKey) { + let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + } + render() { + const { + schema, + id, + options, + value, + required, + disabled, + readonly, + multiple, + autofocus, + onChange, + registry + } = this.props; + const {enumOptions} = options; + getDefaultPaneParams(schema.items.$ref, registry); + const selectValue = cloneDeep(value); + return ( +
+ + + {schema.title} + + + { + enumOptions.map(({value, label}, i) => { + return ( + this.setPaneInfo(schema.items.$ref, registry, value)}> + + + + {label} + + + ); + } + )} + + +
+ ); + } } export default AdvancedMultiSelect; From af329d56d826a5092cb3a2535bf0de65bd14600f Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 8 Jan 2021 16:18:24 -0500 Subject: [PATCH 02/46] ui: Factor MasterCheckbox() out of AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 38e52271e..b875a6426 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -42,6 +42,27 @@ function getDefaultPaneParams(refString, registry) { return ({title: configSection.title, content: configSection.description}); } +function MasterCheckbox(props) { + const { + title, + value, + disabled, + onClick, + checkboxState + } = props; + + return ( + + + {title} + + ); +} + class AdvancedMultiSelect extends React.Component { constructor(props) { super(props) @@ -69,6 +90,7 @@ class AdvancedMultiSelect extends React.Component { let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); } + render() { const { schema, @@ -88,14 +110,9 @@ class AdvancedMultiSelect extends React.Component { const selectValue = cloneDeep(value); return (
- - - {schema.title} - + Date: Mon, 11 Jan 2021 19:11:27 -0500 Subject: [PATCH 03/46] ui: Factor ChildCheckbox out of AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 191 ++++++++++-------- 1 file changed, 107 insertions(+), 84 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index b875a6426..7507f234f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -10,17 +10,6 @@ import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; -function getSelectValuesAfterClick(valueArray, clickedValue) { - if (valueArray.includes(clickedValue)) { - return valueArray.filter((e) => { - return e !== clickedValue; - }); - } else { - valueArray.push(clickedValue); - return valueArray; - } -} - // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function function getFullDefinitionsFromRegistry(refString, registry) { @@ -56,95 +45,129 @@ function MasterCheckbox(props) { {title} ); } +function ChildCheckbox(props) { + const { + onPaneClick, + onClick, + value, + disabled, + label, + checkboxState + } = props; + + return ( + onPaneClick(value)}> + + + {label} + + + ); +} + class AdvancedMultiSelect extends React.Component { - constructor(props) { - super(props) - this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; - this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + constructor(props) { + super(props) + this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; + this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); + this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); + } + + onMasterCheckboxClick() { + if (this.state.masterCheckbox) { + this.props.onChange([]); + } else { + this.props.onChange(this.props.schema.default); } - onMasterCheckboxClick() { - if (this.state.masterCheckbox) { - this.props.onChange([]); - } else { - this.props.onChange(this.props.schema.default); - } + this.toggleMasterCheckbox(); + } - this.toggleMasterCheckbox(); + onChildCheckboxClick(value) { + this.props.onChange(this.getSelectValuesAfterClick(value)); + } + + getSelectValuesAfterClick(clickedValue) { + const valueArray = cloneDeep(this.props.value); + + if (valueArray.includes(clickedValue)) { + return valueArray.filter((e) => { + return e !== clickedValue; + }); + } else { + valueArray.push(clickedValue); + return valueArray; } + } - toggleMasterCheckbox() { - this.setState((state) => ({ - masterCheckbox: !state.masterCheckbox - })); - } + toggleMasterCheckbox() { + this.setState((state) => ({ + masterCheckbox: !state.masterCheckbox + })); + } - setPaneInfo(refString, registry, itemKey) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); - this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); - } + setPaneInfo(refString, registry, itemKey) { + let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + } - render() { - const { - schema, - id, - options, - value, - required, - disabled, - readonly, - multiple, - autofocus, - onChange, - registry - } = this.props; - const {enumOptions} = options; - getDefaultPaneParams(schema.items.$ref, registry); - const selectValue = cloneDeep(value); - return ( -
- - - { - enumOptions.map(({value, label}, i) => { - return ( - this.setPaneInfo(schema.items.$ref, registry, value)}> + render() { + const { + schema, + id, + options, + value, + required, + disabled, + readonly, + multiple, + autofocus, + onChange, + registry + } = this.props; - - - {label} - - - ); - } - )} - - -
- ); - } + return ( +
+ + + { + enumOptions.map(({value, label}, i) => { + return ( + + ); + } + )} + + +
+ ); + } } export default AdvancedMultiSelect; From 19bc09196f22e6c1f65e3fd9190c894c4d621a20 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Mon, 11 Jan 2021 20:24:50 -0500 Subject: [PATCH 04/46] ui: Enable mixed-state behavior for master checkbox in AdavncedMultiSelect The AdvancedMultiSelect should adhere to some set of human interface guidelines. In the absence of a formal, agreed upon set of guidelines for Infection Monkey, this commit uses KDE's guidelines for checkboxes: https://hig.kde.org/components/editing/checkbox.html When child checkboxes are not all checked, the master checkbox displays a mixed-state icon, instead of a checked icon. Clicking the mixed-state icon checks all child checkboxes. Clicking an unchecked master checkbox also enables all child checkboxes. In the past, clicking an unchecked master checkbox checked only the *default* child checkboxes. While this may seem desirable so that unsafe exploits do not accidentally get selected by the user, it will confuse and frustrate users, as master/child checkboxes do not normally function this way. If there is concern that users may unknowingly select unsafe exploits/options, we should pop up a warning to inform the user when the config is saved/submitted. Issue #891 --- .../ui-components/AdvancedMultiSelect.js | 60 ++++++++++++++----- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 7507f234f..db759b013 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -2,6 +2,7 @@ import React from "react"; import {Card, Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faMinusSquare} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; import {cloneDeep} from 'lodash'; @@ -9,6 +10,12 @@ import {getComponentHeight} from './utils/HeightCalculator'; import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; +const MasterCheckboxState = { + NONE: 0, + MIXED: 1, + ALL: 2 +} + // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function @@ -40,12 +47,19 @@ function MasterCheckbox(props) { checkboxState } = props; + var newCheckboxIcon = faCheckSquare; + + if (checkboxState == MasterCheckboxState.NONE) + newCheckboxIcon = faSquare; + else if (checkboxState == MasterCheckboxState.MIXED) + newCheckboxIcon = faMinusSquare; + return ( {title} @@ -77,42 +91,57 @@ function ChildCheckbox(props) { class AdvancedMultiSelect extends React.Component { constructor(props) { super(props) - this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; + this.state = { + masterCheckboxState: this.getMasterCheckboxState(props.value), + infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) + }; this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); } onMasterCheckboxClick() { - if (this.state.masterCheckbox) { - this.props.onChange([]); - } else { - this.props.onChange(this.props.schema.default); + var newValues = this.props.options.enumOptions.map(({value}) => value); + + if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { + newValues = []; } - this.toggleMasterCheckbox(); + this.props.onChange(newValues); + this.setMasterCheckboxState(newValues); } onChildCheckboxClick(value) { - this.props.onChange(this.getSelectValuesAfterClick(value)); + var selectValues = this.getSelectValuesAfterClick(value) + this.props.onChange(selectValues); + + this.setMasterCheckboxState(selectValues); } getSelectValuesAfterClick(clickedValue) { const valueArray = cloneDeep(this.props.value); if (valueArray.includes(clickedValue)) { - return valueArray.filter((e) => { - return e !== clickedValue; - }); + return valueArray.filter(e => e !== clickedValue); } else { valueArray.push(clickedValue); return valueArray; } } - toggleMasterCheckbox() { - this.setState((state) => ({ - masterCheckbox: !state.masterCheckbox + getMasterCheckboxState(selectValues) { + if (selectValues.length == 0) + return MasterCheckboxState.NONE; + + if (selectValues.length != this.props.options.enumOptions.length) + return MasterCheckboxState.MIXED; + + return MasterCheckboxState.ALL; + } + + setMasterCheckboxState(selectValues) { + this.setState(() => ({ + masterCheckboxState: this.getMasterCheckboxState(selectValues) })); } @@ -132,7 +161,6 @@ class AdvancedMultiSelect extends React.Component { readonly, multiple, autofocus, - onChange, registry } = this.props; @@ -143,7 +171,7 @@ class AdvancedMultiSelect extends React.Component {
+ checkboxState={this.state.masterCheckboxState}/> Date: Tue, 12 Jan 2021 15:14:29 -0500 Subject: [PATCH 05/46] ui: refactor AdvancedMultiSelect.js for readability and flow --- .../ui-components/AdvancedMultiSelect.js | 236 +++++++++--------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index db759b013..c418a20c6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -16,6 +16,10 @@ const MasterCheckboxState = { ALL: 2 } +function getFullDefinitionByKey(refString, registry, itemKey) { + let fullArray = getFullDefinitionsFromRegistry(refString, registry); + return fullArray.filter(e => (e.enum[0] === itemKey))[0]; +} // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function @@ -28,16 +32,121 @@ function getObjectFromRegistryByRef(refString, registry) { return resolveObjectPath(refArray, registry); } -function getFullDefinitionByKey(refString, registry, itemKey) { - let fullArray = getFullDefinitionsFromRegistry(refString, registry); - return fullArray.filter(e => (e.enum[0] === itemKey))[0]; -} - function getDefaultPaneParams(refString, registry) { let configSection = getObjectFromRegistryByRef(refString, registry); return ({title: configSection.title, content: configSection.description}); } +class AdvancedMultiSelect extends React.Component { + constructor(props) { + super(props) + + this.state = { + masterCheckboxState: this.getMasterCheckboxState(props.value), + infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) + }; + + this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); + this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); + } + + onMasterCheckboxClick() { + let newValues = this.props.options.enumOptions.map(({value}) => value); + + if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { + newValues = []; + } + + this.props.onChange(newValues); + this.setMasterCheckboxState(newValues); + } + + onChildCheckboxClick(value) { + let selectValues = this.getSelectValuesAfterClick(value) + this.props.onChange(selectValues); + + this.setMasterCheckboxState(selectValues); + } + + getSelectValuesAfterClick(clickedValue) { + const valueArray = cloneDeep(this.props.value); + + if (valueArray.includes(clickedValue)) { + return valueArray.filter(e => e !== clickedValue); + } else { + valueArray.push(clickedValue); + return valueArray; + } + } + + setMasterCheckboxState(selectValues) { + this.setState(() => ({ + masterCheckboxState: this.getMasterCheckboxState(selectValues) + })); + } + + getMasterCheckboxState(selectValues) { + if (selectValues.length == 0) { + return MasterCheckboxState.NONE; + } + + if (selectValues.length != this.props.options.enumOptions.length) { + return MasterCheckboxState.MIXED; + } + + return MasterCheckboxState.ALL; + } + + setPaneInfo(refString, registry, itemKey) { + let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + } + + render() { + const { + schema, + id, + options, + value, + required, + disabled, + readonly, + multiple, + autofocus, + registry + } = this.props; + + const {enumOptions} = options; + getDefaultPaneParams(schema.items.$ref, registry); + + return ( +
+ + + { + enumOptions.map(({value, label}, i) => { + return ( + + ); + } + )} + + +
+ ); + } +} + function MasterCheckbox(props) { const { title, @@ -47,12 +156,13 @@ function MasterCheckbox(props) { checkboxState } = props; - var newCheckboxIcon = faCheckSquare; + let newCheckboxIcon = faCheckSquare; - if (checkboxState == MasterCheckboxState.NONE) + if (checkboxState == MasterCheckboxState.NONE) { newCheckboxIcon = faSquare; - else if (checkboxState == MasterCheckboxState.MIXED) + } else if (checkboxState == MasterCheckboxState.MIXED) { newCheckboxIcon = faMinusSquare; + } return ( @@ -88,114 +198,4 @@ function ChildCheckbox(props) { ); } -class AdvancedMultiSelect extends React.Component { - constructor(props) { - super(props) - this.state = { - masterCheckboxState: this.getMasterCheckboxState(props.value), - infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) - }; - this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); - this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); - this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); - } - - onMasterCheckboxClick() { - var newValues = this.props.options.enumOptions.map(({value}) => value); - - if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { - newValues = []; - } - - this.props.onChange(newValues); - this.setMasterCheckboxState(newValues); - } - - onChildCheckboxClick(value) { - var selectValues = this.getSelectValuesAfterClick(value) - this.props.onChange(selectValues); - - this.setMasterCheckboxState(selectValues); - } - - getSelectValuesAfterClick(clickedValue) { - const valueArray = cloneDeep(this.props.value); - - if (valueArray.includes(clickedValue)) { - return valueArray.filter(e => e !== clickedValue); - } else { - valueArray.push(clickedValue); - return valueArray; - } - } - - getMasterCheckboxState(selectValues) { - if (selectValues.length == 0) - return MasterCheckboxState.NONE; - - if (selectValues.length != this.props.options.enumOptions.length) - return MasterCheckboxState.MIXED; - - return MasterCheckboxState.ALL; - } - - setMasterCheckboxState(selectValues) { - this.setState(() => ({ - masterCheckboxState: this.getMasterCheckboxState(selectValues) - })); - } - - setPaneInfo(refString, registry, itemKey) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); - this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); - } - - render() { - const { - schema, - id, - options, - value, - required, - disabled, - readonly, - multiple, - autofocus, - registry - } = this.props; - - const {enumOptions} = options; - getDefaultPaneParams(schema.items.$ref, registry); - - return ( -
- - - { - enumOptions.map(({value, label}, i) => { - return ( - - ); - } - )} - - -
- ); - } -} - export default AdvancedMultiSelect; From 819e1778c854c36171f25bf862cdcccbc29e4e70 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 12 Jan 2021 15:25:23 -0500 Subject: [PATCH 06/46] docs: Update network-breach.PNG with mixed-state Exploiters checkbox --- .../images/usage/use-cases/network-breach.PNG | Bin 88525 -> 103676 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/static/images/usage/use-cases/network-breach.PNG b/docs/static/images/usage/use-cases/network-breach.PNG index 5dfd38ffbbf2471af19e874cd63e75664e4ec8cb..871a36bb67f258057fa58868052b4c0ed443e780 100644 GIT binary patch literal 103676 zcmb@ubyQVd7e0FE?hrw`q(LcxL$`DYNC~KbbazO1cXy|BNrN;;x}^_CO1in5*Z2K? z_ul{R7oeMkz zexcdQ>NtQvxEa8=6I`jCeJlt>1(K5#({MG|U-8h>aC#6qo*M=AM!bFnZ!hx)z95Nj znQe)8ud$K-oo?#F;TOKr?^e$m?hh^w{G1mmiOMT03#_DAY!2SBBrGY~-4g25aVWA?Ehy1VjgqG#Q7ptJ<8F`6XHOlO-2JC{Z})RE7C7G|eUkHU?(o3;AkjGf z*pd=6p@S;-eyvlS&j~I|1ihF$2xfgs1oJ6nM$w&iQ;kzto1Bd7Z}+#qh;I^edm(#J zFDiGgP@ z;xc{7|L5gfP3WJQ>edW1D0P;L&c}Trg#>-!xVny zc%U;m&SLRwP$gW|Xa49sHC1hk5~-rNuGI!0zP7ZRN#aeqsJlmD<56U7gjOq&6lqVNqT z<=jYtI29y38Ag*!i$P{rphA}}O&n0r=}f+<-k61LlZ4<4>P`(DroEtY4_PS!-`b-x z!B9Z6y_f4@*fgYH>cgy1L6&aNdbcxIi(^ay%)pIU@Kh?Wn80tr{UH)i8_so$H9Qnh z((l;gqIqnk3ldUv*drQfpmY+kG+1^>GkTWBiScR5PfDFfUEM(pf;Z_8KIG+okm1_z z|Bhibh|7&mJr@T435O_= z8ob+=P`Q;$0AqsQzs8@v`eRc{+=}N*EG(2@`pcanaW4iZaJvvF{dnjIQ-C=A6@kpIZap{r_@oS)I%w| zjhr!C3Q}lR4f5@hJr6j$HgJzmH< z1%aZxY>CCP5jP#Vy;z;mQCQAKYf%~=ec5ov@tZSIBZBr!Q9ChqMrK|k9WYLQ!?@5l z8xOu0RCt4?NCm3j?;F~MoH233aVib|aExfyxz{7ooXkB_(tccr(8_B2*GR#}lWbH@ z1uO+84X_n){iIECr|fJ0LB62oR`w`55C^f9*s z-L_N)iPWFOt@MHAy>qvL@9fc6B}8S(t=^ORv^mI~A^%1Gxd&Gtag&lh z@#IZ)kkZ3*Mz9a3bVpF^CCImpDC)lESCW;cl_h!}yG^C48Z_+1YRSDeFlph-q?k$2$5Op5VJ z=x=)4rhLxP{H&6iL#u1#K_8S`K4Vi4Bp6@rLpDif;IZJ=ke|e}o`=diB4y#=_z5?K zW2XH%7=>6d!r)KU%cNFAIScU*n4=;njeNOF`mT94rnp3&?Vx(FYBB8W%`JWgab3;5qz3hGrAT~kOdp@r0_CxY| za+#mI8&;ZPU8sl=33CBrXeC|*+i%yu1h6BDp+QUVva!2va8lUCuU7PxFY=h7oSwWv z6G5Ax3JbUo^Zg{ZQ5h{%wmiRre^1^SV%|Qdp$xDSSXKh;GIS8)4WG%IuN(A1XqOqHWZr?<9O-6IKtNS6l7`|o0q!j1G7=gbNs$&4UWC3uhv zO5Ouy27SqW+x(h7H;j;-@8*^-3h-`bxNeo&W@bNzaN=pO1t6$Qj`x zQyOvI%a<4K5{>aeIp?7FI6a&?dIrORbZsM!w(CEz%ofn@T@@CCp^RLfyrWuFFjWPC z5F-%+Qy!nM@e}SsHlywe?8&EH>B9ZBZ68u1`W`=gA!i^qK0%9EdC9R-{;+tiV5nj0 z2Vb&;`db%-`v)|BTP?5w%K1o<_85NL&wqpw(fs_z4mB&JW-0cp_DV|syyiRGM6{Q* zK~Dok!fj$eTo@ONdniAs=7^Z=2JzD+)0@J#IT+mm@Ork0tyLeBhKm8|^?3V-2BzqJ z4P7&m=b=e<0_P&kR694o0sF^5-jnc!#E0ghPbjdo0rptLV%nd_A$}eLj-e|Ly(0HyB3Pee`uw<)h$+2=&(nu~Fqc2$Fx9D=&CMReCPTRiC zOMU#w!!_B%5c*y^lJUzcC$~*Yldr0x6Vkb`IZCi+j z*OJY+)HqSg-l=@Q*1N7~mCt5CrL`tpdXIqrEf%n(Y_`YpR~y6uYxIq}mm@CI9i_zA zvrV>VbE1sK*b(gXxS(9|ldNTD8 zyJMpDJR7pos#|`iicJ1xO>&Q>E3jEJL~VIHsX5Jd0|$g_S1t3bU)d>B^Ux^dRZR@Ku z6-^pMB~@>G4;s{aM+2dbS;Ra6E<;tA*Q{fSKFcabgQFogm*aO&4KazR!5B4{VmA3B zMBl1g-M$`tJkc==erLYP(B@9p7awypE*qP53#DmdQ(&K#I6MHkZ)L(mGAZp;hE!U3WWTnS0o3LHQ&?X0-y#ZIf}YX&F3KcIJBB z%X~t|evjC={|P+U+nTz3I!5&~ics9Hiu=c6}m9bft}iSAD;F3H7BofV}?W z@LC=2k!)snvX*DIW$@f2-t@3lIFM=S7lqjseAz{>9Gs1}rdzdf z<>YXg_*YFrQn3-}t0(g!_(3K0uw+xlt5iE&f?3{Onsfbb9d%OUp1Uze6$)>-oCUlZ zAweUp*txZC?mjf4J{xT0OB*MtJgYc&;HCBq0} zzpQ+@USB@6rlLYEoVWu=+KRhE*i`^v8I;Tyjmv)NoTBBD1VeU#~ zV}iyhRcgh->~>9|Eb~gi+A=xH;y?SAIwK!rJ2Nlh&F)Zd{%{%=r7VIKIsIC_kM@yl zS)6sxh9+APAJ~dJp8fRId)t$Ca7(`E4DxkO(Gw7p8+JSv?vpHS`_vdG;y_m!ta49- zZRp>lq9M%Y?A#&x_&a&JqG=MB_=Zxsk`{yM=q|gE**C zF~a%L#=QPKSu_HH>ILUw6!nG+YKLORq(za$gpHb<{=HGiU)|{5xLi|qlusjvjS+fV zSL60YB;;eNnahPHC_q@!^>^=;p!>gGPr-?5YkB4#>NjVWtYISlV1&sPFqTExPeQk` zE-Hh;K^g^SfsVxaeCIc1Z%yZLY&npSxIrH>qDa<*92lckcRY-Wc!twqx~+N0UdAnA zmLY++wJ@bc%cWKVG!x-@3G{loR+!j#+HzLvx+b?sR8vm;LZa{2@LBOGMH6 zj(GcP-3NpdKUn3ZiplYCuICSEaQ(15f`sneJXYBHkt$JYd|t@!c4h+3DEXY2GCl~7A4c8#I&-|kBvA#L1>F}oHYb*TA4=dR ztg;0i<2TXlIYgV z91&jredbq0gz13+A;SV|=@||uy}Z`Zh#z>}t*4J@z_kD@8tE3)&-J!3BVsujQ_EGW zQHhysb)4~3gUTFOT4i-+4;aBWaN4cbb9`PAQD35|>6dsxlYvyzb&`c~yxJ?YF-fAr z7I3oR3fG6V#3rlwHmH2}D2&-hFs+#Jf|5tZ_nns{Co-al3eOOHJ3t59CHhz(+Gie0 zut@16)q|6HedyVyMp~HykS>e!7{8-efwJf1Os~9fA=_VrV-Hvh#cO&Bzr2Zhj(X-J zQ}hl^=Az@8JMwx5qhC@br=F#L%%#~sIWDb3V!H<=`Il#p-;51rZ;^r5#Abx#kIiKyrE z921|l#&lWd@R{TitWe6EVqQ)nunoa#5bjFYLZu~X3c4MMApesqU_77V9@meM6a=*t z>$g8I$@#?i-WgtWzYff1(mE2EJiK_VM=O^?(6ZMDNf! zfz`KM4lK5nNe}6_@0c&~CdYaV5{9hd$I0V$#^bO!?e{`-iPoYx6e;t)UxNUWn`wH7 zFB%)OCLxDm&h)z@26@sT^vHB$%Ymc~E&mbFDZABV**nDiH6RD)F4C;(K6c~dc7|X} zF>sk2c0eI);G(tP5UiH)b81D2-{+X*i%4ivbsL3iAtP$R5s(Lv@xf^qDbKZSdCEp2 zllx;MynM47+fd;;)c$IlnlSO57tZdx&mW_S{V*W8I8r} zzRhGB;sr^43OXC5)76>@LbsSa?4`IS1iTk8P6}RdU35OKHRGh>x3dtplWN-^9JyqN zT+A`V)IaUK;(mpqcIsNrwTGq6fu-S^VL+@20`lgum!&drj*X5yt=ABHrxoIhH)5@I zD|;=GW_^*UodlrCue5wUdo6Int~4~sp;m(~{AUE*-Ua;Wy;y?=8bV(?YHj!TU}qm& zlq@qmkq@0C+S`iHotqpU|%+ZJh!6oqTWL)~Xyw%tFhI%*|2Pq#B`_2mDw`3~eu=Jb1;4?(Ijm>@db zP85`hJ^iRoz6#rS$62MkQfXfPhYd%G1;aJ{3WJ?TQzl?nN@}tDH%072ewq{7Yz>Th zoxz){OV0%$GOfY+4*hyXrvH2)-^Rmz<4p3}5`zf`Uevh4YozY>=dQEQsvwq5=GeTF70Z=c~LDf*Fo*#ajwTUJuNHPP$oZXo(nv z)#wiAqU@+Vl>brdIGAq zJcE-s?0$K^xMw337S(0a!!l!$*bL@(Ckv}iC`Vv^O>XO+oKq(y6p6p05C4qRzQ2fj z%Kxpw`#BqF7fqr76P@)s*J5eC0GGy`t#{l$klpRWko3Nwk+9xQQ6rKIMq_0{<}6=3 zQU;-xGRls<^ieW-(0B8|R->T}1YOmE*Vls$DPc78X{HrYZhOfN>8V36ku%qxj05z%BPw; zjulOb4-?$l3TE=hJ`!?{LBsaXXFmM+@#EaVZNmz}n;n*(T-K2fDt?qk0JkhZo}Zg4*F1tC%YDA`xFX0!=QZKVGN! z7OipgDd+c2$<-U{v_Rm4K7md&aG|9uedaiK>f(H!CK@q8gcDS;6av$l%+vmk94Tf?^D9XBdA)2oVp5+M9m) zfS*$*RvoC=kZqZv0y#PC!kqJ%WrQwHB$L^0P90C}M|LG4Y*Vf0vWQ*$NTlHLQ%u~9 z#ckoSHU6gx!RuhL;O;v2w`XLO!<6Th$y$X<7C&ys@!)sLWhO&xX<8yn%>!V`E<6h_n+`pqh`ZXWE*xB2NFivah(!&V{lwZ7y zkMK$4*$mfjv*AR4I=|7~a%|Rx98;5u_;~^RxcieoK%CLUxF#8m<}p)DjphSa7?aQM z@n2+M4hlOJ8<8>`5-;^9_cpGW5c)dv7x9FsqGeZ8q3VVNSc0yM*h$+?Q0dY{6)ciW z1TxuPdZ0Gg+@ONw{O~z9K1<%O4#Kg3eg&OdY0q^Tpf(XuJK)_W$jFCSktqow4|-#! zf8{#*G3dkX<=0!cZT^a_h^Ne75HuN@HdAts@&W~yFuHkn3!ZYE_N5Qv*kf?l%LsR* zqN?}!_*&%5*;1P_wn^fAn1HZhmlTk%9b6~8SfO^v46eyvp|}4}F#_?mwbz%PA#3ac zs0)KX%kF~L3b~EgeH9?BaavzwIAXJ47tMm-0d0yxi7IHIOzppUY`k<`XA_jf;F4ff%IR&lF6E#RE}6btaevW) z)lI;;m*Wn#guF*w;WSg6ByF30v~FJ7QlyV;nZ%Nr=32n|uNPnvNFqDx)AB7VU6VE> zidp#blB9{6`TcT+Be!+wTEUJqP{=TM#d%L~wh6q+igWn@C>BhuZ<-Cw(s1wO7$XU^ zRb%C1^j}?WRdN+i01q@S!J_>utZC2CP{U+IUFS59+i8k7EgvIk0nMi50x0OraHL(2 zYO?yBXKQj4E zPRVFYRw~^KlZAcMA7gX7MDJ%synkf(x18{gip8f>8ko;iw_nOu$HoFQ>6_M|99QhJ zrg|LA>0O9_PR@KrR_e#POEoh#7RCWVjNWWU{7kTb-5uO? zCkBZ2h$uR;U~2aZA=x2zv^TvLZN-8wa_vM(@Y5Qg83Q@~oz6t5KxP9-Kr9))Tt3=JtrWogydx+rte(UI%owy)Fh2p$&taGg< zlu2OKiI)tbQ??=ZA|nW4H+PSq)^wU>^!P}b_9&1Y5tJcgYb)?&&9@E_C|7=gv?F}N zG4jEGaT{}tBgw8VlKiy%aVJcHD;B3T665*WK{buf^O_%r?*$Z~c)U8UgXFKi$>0P6 z8{E9y>}lm!HuZUq%`lznqb+FOYrehw2OZ%Ep?jQ6Z4pA|HhjAaUjGaS@gq!~V_Mos0}vQOMk1U@a!gvjKJ@$|~p z$VQ?ZIK#~x$mKPEbN`bezi#x-+VS0Z% zhMwMimfxKtK}neS{M9Vo3t@=*iTFRxNkXjF4Z6i&Lf5~b9%t$1!K&uxugu_YasHDg z%V1sPziu845=SUmx_)vzCBw8!2(}Y(G8te}W7w1p_~Yyh{%=vG2?^83q_yO~u~`*0 z%=z=mh5py^Lj>4OcNLBLPSI7?YpS3MU@-%EKc5ec!Qf!D{~KRh_8aA>to7<~UoQRW z@HB$NYDVfTK%I>H{_PM#hWE$5|J+S9bIMV!c8P6NSH%61m3f;2{Rv!vloHiSmY!%a zmDBs)fdg;)`E<;x=~67Fp+=}mag3RY5f<}H-e-iVE<~wHv*#Kcc%m954$}4xz~diG4MB6+S5G>h<5 zbH#LXq#D5c2U*1mo1ifG|DGKwC)U%cbZ^CNkc-fmQGl%XSX9;q|3kKfdEIZ~Y6Uf-VugqXQ#O_hQ;7hPVvjUT z@?n>_ILmaN!tU%#Y2n%!x~DQXUM#vlc5z3;S!->UcsM zrHL_3tD5D6(O6}uKOS#4RlZ}k0w3HiKj><17G&!V?yR05+djs|XkU7mx^ zgZ}T5v+QjQ8CCoPTU{-o!3G{+;dAfZh4Fk*Yrh{_OJazQD@L;mE>YPH8pM&~3JhD! z*|s2P&!;F=C(F`%ITysr{JOxD;gaVNR6R%S^It<)LC+M+4Fj#m8I$A-(6YN*BB9+& z0c-8!GsL411mBHUn^qGF%g1g3$CH+hY#oJ|UEg$v3vorqwTv*bvVM` zp9X-=hX7~!xT_g2`LH@blg2%2ZGou&XwGf3HwC>sh5O%DzG=peHG4)7P;1z*kKSZd zM4r1D#2E+(4OTp>!Rr2KJ0@#Qyto=j@@~~ba$Z1Hm8_os_1?$K7wRfrQm){YkG7Qt zYIGWz%bFkGUo5(Q8vBv=N&@K3d9!Nts=1Ygk;y9&NlT-cZlN7R`SW%kV6&PR|E}}e zKNZ`1;k-j`Ccd^rBaFXG%U3i{!4Eg8DM3N`n_NGT@n8Bm#hjSm)V|%Oi6XKg3sMX{sTV}~2mT8MR zrntukGJh3MMS<(uZy^(R>M3OIf@H1)gT=`(s!Eh1&Rw-0G;;pRm*xcUlZIgN8T-v*ho+sXldcI2am6e z4o421?8mz9suw6(sgQfe#%AVtme7IqHPQ04z|+P5EsFB>)6A~diu>SR!c-Wd?MFM? zhaD!H`uN+*s_1;{!z-scXz+x`(tc8rr^cQZ${O40D423M+Srgaxb1Qx>BL81daKeOtXK`EH*dogbThjHtqEEc>MN}(EYo-N}_ ziCyL?>z^y?50ABESvSV}zaJORt+RQ7@n3BUaaoAQ#e(1K4A$;$gpWn}YNl@nHZDMi z0bYfJh5-cBbIF8qrbcA|umPGkEirHG9%prLf>KyUkea@EFX9crVN4=HB}}NnLEy>l z1J~b{)~hNeQTe8-6x*u+W~3ZiFY9d}U_$^9;wBQurpC?6W1vgOA zQD~blTTY0Lr)(4w6my48-Hntbjd7p=$=N;_8)OwPjBVmjov4N`yKF;AT3WiymIVG*jU6xS0;$p~=`6MK#Ee?V{axksB<_? zi+D^__l6bi$eKbi77sWG3+2x#UoC*uD}@rqg+toHeFhnbd6R;G$MR_po67bejUysZUc(fH~5jD?)2jGtZ- z;95HCPbj0rB$8z&ZfdcXw%H>1_Gx?E=s9t{{nt~9)D}rlvZfmf5587jC;YhG$Li`X zZtbnyPd+A{Z2Kdy#st1ABeg*_R|(|s`MpOKWvmuS+y(U7Tl$5242i|W`*#(?S^v}4 zCatqnk!`ZO1c3%>0QEEi`4wBPjR2g|mtr`|!z_LZN>0DiM)04ZHEI2Ylu}NpEi-_Q z-|UT@DG!}Z#Ir|Jb=n*auJDe?1RLS-w8-@`WZU_ zZ4sr#&C4Z1NO!!VXwu2y$Qq@r=ZOIhN;fE|7H0(-1;k|g*)FxVWK_j`216MrMm8B3H2jk1dP5^H zUFtfsdce-h(VR#5Mf+d4y9Ub7oeKa}-MmmAt>Poo-*aGjrl*q$RPRnd&94&-{G(kh zZN^xkwHE**Q)?ERT-iDVd^NzgO<4tsDE^f<3g?DO4o_{z%SKj&Kj zj1R!)#sw#Un-cMeB|6=NEm9eAGqke_Oh149MBkjz=^4F-$8b1a@`|+7I7-{sxkvnC zP$AGWKp=d)ZPtSnBLD-fqorb6ty(;q)au`s1}bX$Z`4Z8b71?L04rMA4wf%}$kH78 zX&trkiq<#b<5EU=#j4G}BmM9JX7}}!P+ z2CIe=5@!cs!LvTZwI{2z;ORQLzxD!4H5}2vXZ5hs z!|`|-@GT11y1-x-zJY7?4eIL2pB!Q+A{N^6gCE(`4ZlB}hE!yb%n;+q6>4T@r6!#2 zd+!MTReDG%q)f1cjJHim7Ev~$q4RqI^qgLb!M~j}JIhS>@k)$o1N33x?&OWPW$X{Y z`DlJrySz{hS?f?rC?S?EWPar7yQi1O!V#u>_N*Xy)q+H&O2D% z)=oFD2qbkv>! z^iR=zb&v+2O5HK*qMel)(^6`4jSU#t8L3?gPhsvHz;1yi)Y4b46p)iIoiYD~%}1`O zTpIvgmAtjblZ`&-voMWk2{(P4J8$nZ%?ps1kFy$T|7L(wR#Agox%gu3cNO|x1-cIq zB+uyPIdo#%I72@xnrmmggZy5iqW}Ew=?VagI7_VcxpL>ch(SA}6^faQF>%xT88e_{ti?yq%Sye`-HV+TZWqdyv-SVAyalMM4exduS;$OOO~o~l((X&4WB z_m_Xn>V5-p7LwG?umF&fNpU9uL_!U0b)4nfC>O^jC*wcE1uMb*Fr2@*ABtvinjwB4 z9Z2`rJp&;yi7g<@idFoT{g`-pU`^bBzH;?90Wa|@X5bZcRGUaLy}Tw6e#!iL`Ql9S z)5J!7Sib{vB6#}fztb{mMvB338XBKvClrR439BRc0jA_bgAFq7SyU_LmBrZ|t-m1v z0-P5|fGM+h0FDfZX@F@DEB#fLJh*HOb3<{WnNt6e1saTh)qrmg|_G`)Vltq#PbXlKL!i`3Y3B&@Yb* z*tB{vFQAI`G8|^kQ0M(xSEYX~n)Kx;P@+}TAMs8+jLJAJ&0~=La>?{Q*O<3;bO8I` zGevk1QRAXsQMt^YHFh3!zCg3^v^kdBS|}6p!%Vp(NbzT4!gPT8WOIdYL9laU zW5Mp-i9voe4uzUH00rnY%=|lPC^w)zIjqfP?@KnHdTNG4@lKwC0Ki|uN>^0K>z{IV z%P*=)j^tno$e+kjO0%|s3VXEMUrUw*Od$9xKEZ6GyLs#hba*ecvEoy|cM&t7j|t}3 ze#>_?=;iI}c_@H=0+92n8VHR#PUpoQ%fu}l&8cj7H)7B_UTLwIyM4_h5D@V>{&dL8bAJm>Q>N;nd zrHUPvW>+egjdB6pbU==TRHb1mHvW1G%-~<0_&Rt%B#}^$A@OpMis;k7HY%XYIb{?g zpE+A&5{=Xa)W&t**h>x7XJ6|E$NjrwqsEiK9qHy{x8pQ@YD_{Y1B+XD!opL$8I0|eNNBKsdRg_);Q0k$IC zqy`QRDd}7wuWWFN%uQNH_BSZrW)~v0tr}Mf?$yy$fA+>c0D@aV0VH$t>YgiCQ^6>O zI{e0;6KOV3?-=z)067SV=$BeSQY$vD*mW2juthHx(^`9}){Qq-w z?f=`*h$VvKRGCQY75@S*)rk;GD6!c*U?vyn}9Vp__>T{tAd>SaN(c6WX=wq0c%HRN}Yc_T{YF)u8^F|Ka($G+Ra~WBPIx+_#8I=ntsduKN3C8 z?u8?O8S?`LF6WN=P2j`mstHPta@YK&(bCtG;AshX2j&d}M9@+cHM!$tV2OtY7b<8+ z!wCmC2G_OGAD*6;rjc2$RgI1I=O%dyhlhu!^LFKEV{`NIB)PL>P)JilgVpf+-MHY< z-JY^f8AU#2WP{YvK`lkAkn>IkB$?$l+4DT&&1C%@BM!6RL;{w`mZxsVWz?y)un4yt zSXxqYE13G7>`4R)X@dB(ZvGjQ!LP#$YQ|l=O*vt&QiLec&(L5Ld0*`|Bl!$$yOD;o z+74UaZiWwiBo*;)Z`I0&m~lJojN)b8LS!fvGX-YMxEbi_J8lo#hLaQP8yly?ygFWwXHdMkKk`|FK;Wo^gznDg43j_e^6@EW3xnC%#hQfQ- zRVGfA-@Y9wQcQ2OUMZtE{${s1P*G7aI;ya~9!A7s;2ArlCnC^habW}gPP@6(Im-`A zxYvz7x@y0B`zcykgqvLVWac&F0T1k}cf;Jx{p_Y7@=f`q3N8gj6~wI3YN?0<#NG;} ziIhIQ?0nP*Ps%JTEU2og0`LLqQsi6V_IdDhI#T&&2FXjeZk1bk>rL`172A~7gZd&` zOhx=rtC<9`NFy5S)oKe4$Pa%SEQ!$drNR3QBJ=g@S0p4PCMG8F-TY`__c?tRw1c|i2qqR55~pz=DrjbAhHuUD^k?DQXKe55 z&8LbCA8+Pfn~q0>hZ7jcs~8%JcwFqq#l;0vdSB&*vwyL%S*tUhs5Kdcho63=Yt^gL zwQi9rp0ZkQRxO??mEOzvvsav*rogagq^+G|Y%8kgFvdgabN8nw5CaYnkMQNPL+9N# z2c>&SdY^zmaf9Q0Hj7?|{SM^}LdW&h)iYp2n_YfdsgjgZ&72dlak^ zK6`ew+TpP!`;Y=rQB_m>X1m_Q@%>61EGm(B!(j;{Gu@jU9zV{0LzJj*mD%sYiwMcl z?)1J-U{c4&$DggzXF(z#h$0ts-q$uCzxuPu0mx!6S5#IZMcAwLq;cpg0?NMgtw}VP zn2_-72W|A-(c{C>cduIwv0xNR&tu?;Hs=F*Sy^27s_!>nwh@Q!FV`M{@7>*995P-7 zu=H-s^VgrXS&8@7lMTJEPewR`gM%N>t9@p^G^hdR`uf6w+5Ym!dC!`3eY#t%+jO`! z6mK#R(XtsOC>=>k-IXT(c*=gz7^%o`^Ft-y33?lwM8%pA$q*xNRS>_Rm zOv$4_25~noJh*-QjiWdigp#&Hr{^tZ_R9A%+WXt}k6=(1$LK2*>?!klc9-4d02Vb9 zc6gO9f`8_`7IJT52GtIq8GPK%>eQ;&V9T^O-LEOxalXBk5fRq#p%X1nr|^Er2pB=& z763Vo2Nh#HIGdj-7Y8ZNpY;YeUL>`kY5h1t03AF3L20wViNJa8wN_wQ9t3^C>2kR2 zvg)>L<8zx1F-s7btJHNlpV2y6YEtHkg(|oobzCl6H?<}Q)qH)#7~m(`(Ya48u~Cxh zA*Hi=_89IV)}fw*GEf@ghQGNg^V6BGLN$Aj6W5VgyGmj-enTt5?Wc>97>?2@f`%7A z)*~_5a8qsut)g$WF)qHB-<6_brA(M^J8shNnJGlb^NoIdm^J*Q4sN4Ldz2l=*_$nD zA@CtmpHOHDqn9WD4Wgv*%gzq8HKXNQShRS~o!yD|;|-#nhwE_!_d1M=@}s*VTmEqlX@{IrX|G2)>^N$c0Qa}Yw0`903$PEl7rnHr-~E-ocKLk z>G8X=36zkWjFB#wmX>zdemeffVW$E>PC>z2U{2rnzl{jrpQ%SD7dc3kkF>aMRFay# z+jnp2sFMI=zOWFEZ9G3r^musahA7Vwb&4FtuX)*?5rCo(^>hwu;IBG|^#L>HU)5_l zzlzFGG>i^7=S+rTVbyjcsqr z!mzi1>1Y;Mw|vI?_^V#o=z(+R`K&I+GxqwWgRoH7KmE_*ks@^TDp?A3O+x|2|m+l2{WKb1b=WO{t7tK(?did$Y@-kT~W z!wiDt%ZOaeoAgM}Jzi%&x^2bEe7`$+Yvf{OV32i8c$7^kCNAFd%+T}C&$k>>GBUcX z#K|Kwz2OKo?<;Xc?riPtzd_6tWMy4prNsrwdFr!ksn|@`^B8t!q-SU$-uOwsx7BeD z0$+Yt&_|&b=rv(W&O_BftIjW|yV4d&Q^&i;-486$TUF+~OhyAdJ(N_B5X(%Nfg9a}@DG_l<_M*J((7$IGD>aVj%|JguPMEi%e{ea9-uY6VV&zW2#F&Tic{|)rnbx#I#9_S zG=tJyW9U@L^xM0I+zbI|jE;e^=JR-8Qt~o+Br!exw%qVu9$d-+0B8f?I0X-zH)CZe zp7!?PtXQPf4CPC-yNau`DdqS$ZNY=(CcuAmb&2MJt(Tj3vplR1 z78?Kq@z}2&+!@cjz4=}Jc-)JFLChNCZK;&OZ?{*NT&3T}%gycBA4Zg#n!2~Q2l#_H zL%fpeYQtt*BM*;TfFS-=T4O=jJ^4vhRP z52v!S(qgvaInS5rfk-k5aq)|zwd~~N%W%Uxac^^hratWO_D^>WWIjLiwa!*E33f`Q zv#)jnNo7{{uij2EuDaJe*bX#tRL-Bvf7zEp;=A`)Z(UE>*h(hGsb;(_SKi`s^nmlv{hLz-o+mZw+`wb zKKvTvTf3XpwPDk)5rqzojMOby0wgW=LI~b*beVa^Izc@2BH}0$^J@pYq)dzxSQ1xA()8vPh*T zj{u|B?Lm_=_<}yhG(U z2mUfMJ>7l-E2pNW?y+7tGYFy5=Z$uDpz=MHo(Qsh=4E`1cyyxed5q z(KwX?-)MT;S@6o+T)HN8*@Fip_qvDu0jw4)J&usM8wFT za#e4}vZjwqaGM%XR-lmu;PN^#HPY=4?CnbzKu^jfBQQ*aI@h{jg2?_Y=8v2JVNYK# zM88dp48Z8O$i~zuY#^ zd;@qW@|k-W4Lwuutax{a#85Jkb~O0w`h$-#+v>^Vm!^GYD|AjzvmZUrpb(IC`=5aZ zi@6I@Z0HO?jyeH9%hV9VP9o}-b!y}b?Wr}*=bL(eBq|NZuf1$A6HPQEc8Nn%se zo!^Yl$hh0Dn-IP`?&Vvy?ah@4Ha0dkaN8!jM(aA+9tm`v%?4~6aG%9FIsX@XZyA(j z8?_5#q9`DOG@`ULC|!zlH%cSj(hVX~D$>#*-QC??(%s#SG<)Imyz}lo^S(d!H{a}; z{mpmJ^8H5uP5BDxpI+}?Vl*K1gL3_0B&3`zG*vQ-V$k6 zopwG>NWu38Z|IAx;wKler4&@l7To? zZF8U_{q@j^Uv!XV(2?fN5|8?UP_6`zW@9OxB&IP}wU)B|WlnSVkYORhXKM$oPj%QD z*jhh$45_G!qUrD8{!yxtM8c7su(J|u>K=c*?4n$NRoj_rpwks{4S;@oakA`R-7&az zBeVS2Rd1QrA!lKpM@%%ddW$MlTMS7&`033NMa9bE6?M0x_7DHn>?PW&FOKmpCuJL!yu;}Q9xVSi#Vz$$)2UcHy{|&Kdb|y;7wfqj+vj)P; zkC!LQ4=lH8t}czT%kI{OF=#z?Ii5v)YWMp5rt0N!3y%wANOkAKkdJawmX`bb04@e( zB_{!kB9KYOR63s>f&X$-QLX>r*b)*I&B)Hi%tv7{o5IJ#<1kVnME6>y9vB)rf@(u7 zobgUAX{d_Deiw`DUK=@hm|va7y@wA600lE7KXq~Wavv&+7nGDTrnqZcO*a5Ar#-Z{ zu&}VPIRf0=_N&1FH*E7s!f@@Nw^m8Q@6U5`yF9PIqfiX$eoLq)$~}K>U%mFLz1Qeb zFoGg+J7IHN8inhw~Z`8wzONUO!^AmrTox8dI*z_(t z^E@E^6L))mFQzO)@Z{-FmCk$iMC}v8d6WkOUVRrGJ>nL>Za<)Gd(Pyyhkv)f@xblD z2cycQbhMwzuJ%1qRpVH0!CR6qo>~c(I3c~IL4Rv#f6ItHiL8>P^4U)ji*~T?jm`7Y#GYL2K$%x=?eJRVrfaV5!qR+v?5t@>H3X0VN&S2l@A^9a{Lqw z7dPkXqQBH<4c98lsHjvr{@H>W1{3T0RZ&(J&2F7O_9o2QcA*uGgQEh_2h{f2P<9Mv z?B&%#%v7m%VneHPy}C@WoJS>KU)bIzL`R3Zg3<-=+?$A)IDuQk6Yo)PqHqwTE(}6K zb*Q;a#+h}KWH8Sze7=7d1Bdllxx6@=_)=lJ{TQvpRL96jly7%;*EmrL7Z>-XZf9$I zyT!+k`jh3>A3xG_nBus|QRdgT>8jmn+Wy&Wywn_IA>%EiB*Xs9!F}47$%SQz(`o;U z_tRyr`DBJMgD~{ouJ7YmF&E-|C}W#)+IZ*tL`NoV6?k-W-lL!{QUg) z@81wyEYRcQLMNoe*VEoI$MbteqUL?rM(DV@c$h!&6D%Z zu%-u#-M^WHD4wLnaI2UkGLYxtKo0xKXXy^Scbii`i~KV!oR36ZY}#*8ZQs0lVy+yH zLr9%W{WwQ3FFknSor~kcxLXFta-5lzXV_fIQU(|Ihyr`F4sw-zIVmr~`Yxz`B*{?@ z5+lt~jC#bAQYd|XOijrZnn`PL8cGZqy(K;?9AGpXZEiEY!=6?GmBqa38aKPJ}gp@R6ORsKn{Y!X6 z9ThTt!P{`@hYy!nV#=vi@{LFHgUBV>+1Z<0TKupX>W7Aa4GN9D&GYl}w5HH_gmbQK zF{3AeROs`4%#dpGc*SisFYbq0mn6D8B=PZqhHFw{z0cPcH(Lv9d|IU|R0YM?#etHB0s#pa%WQXzE1u?j)iF{>bOPNLt8Jni%9hysIy@tKXWEqU77+Io9?-4V6W`mb(3dGchcSu-gqX~HX0 ziJRxUZdZi7Ho9~cmZX^2!NCEB51%g{i)mlteOqc0C+1xYfWQBO|0{|Y*4?h zjD8-wdzE4rjQUCMEQl|0%rw_)9(Tel!0YAN(v?MsdW{E zQ(^axad~-pRa8_)%)%1l<2kvwfJJEQ$tW-y&VGV{LEpd%xUD;uhwl0F*_9Q@@qAiZ zTDqw8%F5&U`PciuC%L3?cSAgqxvRU|^!KkfohZ>e>ID!Le*cz2M)vLN>(gxTta3j4 zIexm(hJM7#z!2a)lCy!`>4FKXZ2ScWN%~Nc@V?L9Q!>RrTa!JpJg&>#1bBFnkt}9+ z5fS%a&a@D{c+OVRb(;vuTdfE4&MORDG-=VnB~32dk5}IfR|O8@7Ig?IxXu{G44gr539bwT7Fh2hd0h&+WN)0ISGXZIh7=aB*Ip8Ssk)J(e4y&o9i2d& zy(K=rGOY9((jh@~?)&{lSr?|OZ+VNjHVw^^$7Tf0Tb$`jr$=6j^3!vd|GH)CeZ!3O zj=)#JrU~R1A%-y#bwf9~SBal*@Ga#~xs;N!1+Uc^WOI6x{ULgi>|Y!8C0c02=M`B% zGYO@4nvnn8#^VUtvWVJCzS2ePEkoj+5QsEUoc4X=PPHbx8X zqmu~<3ls3TIL*|$`S|!0=yuJKT~{@o?>r%RaXTCU#URi*Af*8O0T9vfnV{fcK0dSQ zYSnV97ifnoz3!0$e4UNHEq;VAQC~7Lq7bk*evi~2OqU0;(wl;g&d>7hd06Mb_tQ07 z(Kc}^>KBA4TJeS>@2Y2Oa<*Ia$W|!~)+r2(?hnK+)=<+>k;dQ6=OuFZseUOL{x$Qr zko?vAx{eakZFZxQ&}TkBB8Frh2X@YQAL0Jw)6O*f^+G@De93$yNVM~PI(`BGl~YjA#YzFH_h)FRq=*RPg2u2LGd+E7NePeL&J2V* zhRz$_LT}!*WLysa<+4IW(U&lKTbba~U2e((htI$I=+e{)OKvyJxa8$% zsF~jyM6rAnrr1~}i<*8hRzngA@uW}NnkOrBN7#b+1Z%lEXo5@7us%DX&2d(QFnNdK zBkjA*$Xn{V;MIU%I#+J}EGsJu4}UKtbgw{uHpOtfI19M;(9mH>Tam8}0{#7S0Tk5N z^Mad!jVQl=&v1(yipkB*O&S^+XD6qzLIYVD8Sp+L2>F%mm?~pqV-V|s;4}mC$aAhm z?Hm{g=6K6WNom;Vjh3Tc6T@bi?CUEoCG~r>K+pa2=hK7L`I(v8h4Yi;SP%dj8XDfe zf1eMqTF;hio&Hqi$v~Q{V&=Qva%&^Fi4@6LT^$`CJ|aRwLQ`C{@UXB~#v}BUln~Ba$L;XUGuGK#@FjAKxe~!%X7d4g2luP;Y z2~NicX63XJX8j#>o?9-@-g-U^r`P;kRpmSw6IoeVSyOWbwCBR&BHVLqSQx88ABm!( zqS|bc4H6O(loNS*d87F{9V@*FAt51p-BGKXn-}LNmJss6oEjS&J(2OsOH1ib)YQ~O ze^T4;%+%#+g^(}Ty9TDEtpc3*LC9mOt2^}T%`JKP!7&~l>)}d!%lGd`yMRpyqn{nj zPz35oBb3;U?s-fAiaJ&SrCTm~kpo}+1CsLB<6` zcM4@8liT_9J1$duLxVeq@)H+&$rw)I#gQ`0WiV#QCKneMK0@N+CIHQJbaY~3Vmil= zpp|lYc?qkI`jqq9{Fb^RTYT|aD#*}i)T^BU6cYtdFfd3fDLFv@EtF0j6Un3U6)9=b z#n~UY3HBE+(o$1fYiny;T2h3A$ZWT#oX?NVQzW7#qS27|-?MaJVgq-1qzUyAQEv78VxP*E=LXOOo%>ABL-WV)CdwSbDHP(z52b zCuU@2-LL!VLfD8K!1zVwt=>D2ZPG9Eak&RTm+vaE{Wy&xsgmdFvf<4eV_yOdBE}!2 zZaAbBPTd-aOP-c=KezFvY2t4A5K%4C2gGBPC$xxXdPdQL{mPweo^G(@k~K3tiPk$( zS(4$rkGW|5sMq6bFVaMcQM3$q-xt<4&WRK)*9fBSJ89*^9jT`ZmT=fD;Z4gxne2NO z!-$JhPqAb*H3c*uNw0d{Ix65JoF9-AQSOlF|=Q-#sSCvw&Z zDq)#v32O+5pv1~r!2zc%6>Eu}=@^|ptnMg{U(T$#ppcPXjDIWsfc>K&6-J}N!5Y)D ztVPHTQA%e@F4e))-cSnfBof3xndk6y;TVPu6q7ZTHvW!o1D+u*qWP;o)D8zJYywei zUx^&`itr=8pKM<@`g)>w8%_pBV0wUzO!MN!>U0fH%?*ULTbH#<+h{L8sEaHTSJ2B? z&!2=#@1|GTYgVU|yZEF>>dSo_^^P0Mt}d0QL6q~QFC9eR!nhT}eV+H27qM?rdRIz} z;4sj*{az-9^s1~&Z5EYqn*W*?>st+prJOYJ_a`LL$?KFwn8|Vxa`6Y6-6#pkEQr_l z(U_c?x&oCEgt*=h>I*2>{#k z%gxjH{ebegl0s@{zMMaU3<7PD%%zEAUaOlDS`k|)79kisg zAQ3{?lX+~B-Avu=FGJ^hZnw;+Q1L0+k{7rkxGL=n$A6EZNgWX3yJ^YD$}2;8z??0S z!862vB<+y*1K=M;V2lLqbZZc45^uzQhoDKKogB}d8KYSjRml)?3=%f~DASYIcc;p+ z%c4lJOCL}?>TTfG##crQ9wcQ#HFYera^3wg)5@*H5X7q?VL@2jX1De>{=s4ic@nST z)4^%ArEWuR-U*|8L_WDd_W%@x+K|A&dej>TpRo0fi~zDl5Z?K8njC{cfFw)N=EjF5 zB;xV#hZNi$o@g0XdkMDGKE*bt;&?cVu3sOahE&e+xD}Oo0c*b6ogUgj}*B% z-M-;qJ)=Ns>vi4O4#hj3}BQctPkua}u%F ztNd+Isga}wlwpBUh7x>DH?H>xVaC#VKi>VfTi;0@yXI+7#ARY%q}-{$2;p3onQBKd zN)B%-y+_2|z}oLTJ@F)7`F?%qv4*GRIes$zuVMct{r7}uB=7v&34Kogc%XAI(j4W_ zpaqFj@KcU*Sa@kluHCe}-*C+rPqjaOA#9nrKE4|P;Zx7ysWVrejOZ@dBgKy{6?aC#X^wZD z9C~lev^3MOV>C+Fdp#a(`L%+;^U&&i#`O+_N`y~@lFlPlH)oVTD3IuAd&uGc^)!T9 z^3x?Fb_6HIFDQv@H6Ld07NLF%d@TKDf;`jv{@=wzkcSIhnXGY>Sj}wHwA-yU`2F+u z+LYP@q+>I!lG+*J!v#9Kf8QQ^k00^atfNYZKP`kPoa04ZeDkKzKcD#3O<#5Ma$JV< z810`w9E;HR{bNlKsc!QBjacx19zDPy_~#7>uc@W1{{0al?{)8g`DWwr`#Y2N2PDyi zH;+BPe7)&%Zzl2)CDIP+GX#WMTi%>-GMvSO1cXD;1kZL~T+00fxUy6% zM3sNP!TZivlz)GGhDpKx?~k9}!2Os9#o6_F3DEQBt zFUSAic)0(qmH7YPd~HO>$pXFvIdqI=7KiMRe6L?FtbOMQ2*DY1 z-z}@yO_+8YXz@F{V$O9pIjd!&Ix+eC{+)|A;7v865)#?+qUbKcLRIEkE-PpLQRfsd zsn*A)uRglRdHK<*mz_2rc1%3``xz(HYa81JHi)y-jD_cvprD{2n$v)HU4f>o&N3ii z!V3Z61F~(_e`o>VLpvAOCcTFI9w+?%e6s~{4&zHY^|JJ5Ikm{w|I7eb@689oH(wvd zn>AtM7Ui4jg@%VT`7SSGjo5Cb!vi{GIWe^I@Y<|?6Z`OC{wWE$GwMYvfeH&K<~> z4Lv{qtQa1CN`$`DGk{YNHuU-PXMa`K@&iJR$?opd5PLzv6iqeatBEQW7M7B^uYVu> znFRJK0>Yq?mccBS?!c*UWaC@qc6v*{>Z&6P4YPL ze{&0%x2*{u9`n6{@Rxce#!Ay|)x<0Xlvf@%DlW%}X=qF|O^2ZT0LUEcSNZX1;>27_ z@Ju46vFGx&sHkP>a;~^?@e2xy@AzA7x5dBvdaq1Y*k*6Jqd(pJSw2PDihTv z%5JYUo2hxga^OPkP?dB06~1B;^xc^gVCS$|>%9mKN|7LBv-z+x<2FI2U|_JijmM1E z8zE0M^7R%P6U!@=st@7gzv7H;x;q>ld(hwy^mcrINCbrELJS245>00pW#HfYdENQf ztSPCfE77cju;ipt3n>z^e{@fbzSQf9=CSNnVJhQLV#={<^fNWpTaD2Ez{my5_~IKfU4I~OoQjnOK)!>Rn=%hB4}We z#s?3ygfu(}B;+QF$Lz{T`|wEm8)lcRj4UCi-A)=mBA!u(L3NN~)_wdrhDz}2k{j7o z4puojU;jxv-nVSvBzZqe!kKpb(u*Y}Yt~zDm6W~`5(Nf@5XXN$zvOz@Y6#*?3ZovI}z0KM7EMl7*5zirw0< zJ@^HD@wulGw6^p?Aptx&0qe(^5GqAX>UUBK3eA$IjPL?m0cFNq6Y$x70V4?C?|j4L zaoKBh>`V>scaE*GW6+zr>2enhEh#Z^?=9cel=w3uu5P3NP6vl_J}WwgJd0A54|C2$ zjP&#~EKW$I{7r7Aw}>QSSG1=YNSO{b^eK4$$+eC1$`}OM>NV9a7pG0%up-04cE$~p z;^H)+@-{Wynu8hL=I^kK&@|c!s_s1dvkk>G&>Z%=J3Ai*1qIa}&G4*P*)_&B2r5Nj zOJcLwjQH1Wj*UgJ6WAQLGPpeL^-YbeeDeq>3kd3u07TavGWoGL}CHPlSQz2Bi88Db_#XtfKjgE%10jY8Tq3&8O63qAtj|Th;o}78?5j7_z+R>v0v#+0eJ&YTmxL{+}sB; z;9Rz5X8ePLUzv=(($iZ8sf;zy_Q2qW^pFuz($XG5707D-L0TFO4U`pGDrNbKIch-7 zM>Cr!DJkKi!H->ab#7;CU^vlHQT6rpBll`cpuN^H>aq_jG@PkK3ny7Tf1YPC`WW`? zwHwS6N$)^6=@_qrvr*6 z+fy;3y>R;KWO)*A;GNRn%WgtbwP3m1a-Jo@Z1StmqQKX0-z1|r`T2^1>HjY4%=#&2 zg(6Vt21Z8cy@EAgGw<|2&#|#TPX~qxh$}XuA!-7GXkfjdY4HjqS|Hj!=OiKmL+u+H z;s$jQaQICP z+XC1_kl_LeyS25|>7$sf5)d2=I>BW%p_EL9oVd1zd zW^^LAG9f!FYmr57sdLmaMJzJU><{gWw69IXlXpvFIPJ^drgSTqP~X1!#_4=ActDPg ztqiijy^!FM!t`=BjuSC_LhQn7Wk2=tcS`!H88vn%jHe1>=H|PtvoRN^3Rf(lOvWpZ zAl1UL0jnD$!oQyB50v(1uF58u3goC%DTvAz$Y=bdY;QNSn4YM#UzgWS4i8Tgja5Gh z{ksJ zZ~$8!1_2~0myT@y_Jkh7b>&VsP3GteJ+Q?rrWI6uFhTDM!Hqf5{aH<_;HLNhQh zC@U|&d*@DG%FANoQH!&qP3Xfx&_k0J6YB*1Yq8lh?PDMB)}9{V!eN3w01S8&x>0s^ ztjbobppb9*L2&0YZs^>tV@?kb4|#H?M}HF?(p295TG2X$ft{n)^DNgIZ%8bHY7?dQ z>tD>ZMoY81B~v8uk(Fw8_d+rNm&pf*I38|rPdPqR&P{D<+?_Hp$+W#ZQ8eDzTv29d zN5-|v-)1##eO7@|d_F+w`OqRXIC!K=Z`$KqDEQggpUt;?JhqlD5kE1XJaGo30Yv5t zq}z8r?-C2zA>%B79d*?FWsVTMTWnRW-c{I`XlQ5{7`#A3#-`T*YV`a&E_ezfm%RY6 ztI#8$jL29SD_RHr5?B?<Fu#1Bj|5H zUuu7*?$+D44Ity;&b`bFmF{w zX|`QK%l?pneW0!`4jyE9xCFXn*3;*_6c`qQ&iyUAHbACa6U3aHDkP6#XW3X;Tie>q z(IInr3-R-N;K@l#1Cfn~(a`t%)%N>j#Ki8ZUq5?; zN;Ld&vn0<&cCwsvxaS!;l34w^Q4 zH#Y+dKb)(#{_UI2aIU*n3+0O!S?}^b-;aolOi4)*6&7Y%)F4-9 zWoL)+29*jM8Zxrv>xTL8-^v65A(i~Hh2IM#F*k1AZER`T$D<4i2-rP3f`4G5)cK4V z%|Krt7I_1d?Cm{0bkx+G5P=svLQj^Rh~lJR?;MvpaUemZ6Tbi^8+!7vmkw(KX#)cT zkm?X`--a({G?E_*sH{AP;0x*BWn+Zl8lN&UF@aLa5N5(a=4WMf0E!xrYKLpPy`Gtw z$+h3tH8C;K(wY~+`i~n$y}r@A$hZ)=sVFJ;@X}XC@)Dr=0d_4aA_7fYELxRg*e1xj zpwUz-w=#gxe~!*gP*7P9-H%Q)7|erm2e2AMC3^>lyLa!}toAka^!UXdFnD@;CJ6YB z~Rj7J%DJHzfgzy#T6WVG5FJ}!p?=!`Vc|I2ZtrjR^M=I+;T zRKI~%jR@|A2f|+Xb`TpLo9tY)b#)E?CBXmM-DSgN3o*ejOmc}R{r+TR%6~};DM?L9 zIO7;1CpdmWLINbbs%v!l@}C&}n#(P|!Iqqz-C?ya2?DQdiUg#!1(sV*c_2u2`3Gcw za-US%eV{3h_$dc8X8(L}M??JIyZql}V*bCyKe$jNH2)aJ3Rfv}h@SpuX{MuI@j%($ zBqJlsVSC|0c%jkz+1`C(^0;^V_1b*Pg)81jU9s~_M94Yw-wzyHK@Ib%6arI`p+UXh z<1`l2PE=>Yz#u{$T^-f4GeT4PgPq<*D#htimvFql@&8l#H7C%>FDkk}Q$2aUV%yo> zZL^nnKTEl2;cgGVfCb@SyM8_C{Edk~tso5=;Nalt;j#NNy&uN$5(NGB z5|~P@R{KEQ0o^`E?N)yPh%Wo&?X9gJ!T-;X8ER%9kdTv)kB@_13c}(}#Q$1u-27xF ztRSFUUz&#!y)oLF(b?Idm~8?75+b~2(7mfxpcG&R=p7Y>udY4~Q4Cj9ylC#ST&5d2 zK4WLD);{@~BH8chh_bFR9up+tx;f=YNj=e5@6`Is4N`#ZR%0xy{aR;ufiiQ}w)S*D z_WCjL?0LmZj z&t%O4#`SYa9qzUpa#B+CFHN#CCuXKA?$>eH#Grf|DRETnPaZSIMT3f9^VG8BD!vKA zP!}?CzFN(Ylp;A%&B=qKEske$G7#0}S?Hs)-p#8LTU?Ln^NN$I_iij^b~j zXTsVNr z8&b;Q`fy8AQ(JpGNcn!?u}HuGO_>}(erQI6)(f&g1hWad>m?{WrIwIDpu&fNjh&j7 z#->sG3FiN>v9TXX!*l?^N;*Obojn(;dwLJ@OMse9*uZBcY+$ggU9g3w0TjATTKCdM}TUkDvG=C( z`a25`n-AAtMZS7|tq4i#Py}Z*TKoR~%w~IzOugEHhV3M7dqMb`HWSoJO5z%?*#1;q zJr&@7Hge{Ab?JPN6;{kV^o0CxX+NMm9luhGPDp5GYTE7R(g~6=;5tCW0@eVP=gpfp zL45e|;X}`dI3IL%nPDCVHi(~}-`@TNRJM{)ti2;6tn~EsJUp&2j05N-n#l+gO-EN( zB8>hG#H5}c$!CwQp)e>1rlzJqGY(o~2##b#P%(klAioESH)a^CfmfPr3QTeVU62Dc zacOC(UQdh|$Oh|S2lculk`fYv{Qc=6+QIbApVfY^s+&;p1r!$_0eg8DnUb)E0233C z$0R61OqFbGiobqshv@?F;%luK3=RQwNJ~pYlLjyj+7!^>0NxIdh*;a+t^s3$X}XV+ zh{qC~|3_IreqP@AxhQtPMGsD$6A}}(e~%4{feso>S66JG%bNXMV4%yLzDoaKOL^5EF@sUwziEOVa*i-^xm-Zh)afS~}S*v2Ih_U(Pih7*x~nb(OI_1PU@e$t^ZI+IwZ&mD0qbEhH=~ z`0~80x;iG@z(_5~w1> zN=l1Fz_WN@I&^h)Eyk!Co0@tu%pioqHjuhk z7eJQ#$jArww<4|?+T7VcukYOPIC+3M%3*{2Q0eNx0GIABw*94cX46jRK%L~MbW5&%8;8orbPI*Y+P$s*Tp~++5X;MdbaQzKI12^DKPf#3JzFl zJv1@7rW!z~^NlY)HPn0f=Nzxt-p}4 z$+@SWrbO@X@cQp+f*N0M@338z%m|x?RsG@Td&VQ(ki2>9DD*Fye;wjgu(EfCZ5ion z)Jp!X8&kcirF*X>X&_}b9WUPeav%NJL_IP-{sVA_Ae!4|c;f?tsn0pu>9v&Va2SM2=jG8Eym`;3|m{2)7zUFeK zt95=lBBZA5?LRojqWu{h9Q^Yq%DenZ=&hym3lOz;T}drQL90zyKV?Dw=G&%;>+yVVWAhzm>d88GR2jm(v9cAL!VDHxmzM1@tE-!ZY;@&x%`p%mAtMveYrJ-H z;=C%P`wegrXqwJ2hWXRObzlS_T~6ogJdo92fuG*IsRLm$Na5j>4nKUhy^YbA*DO4! zZR>#J2dC&(<#O`|(f}&y<*rBouUC)~zIb|G!hsmTFmEK=#=fDz0D1_-r_H0IWotqf zTwGO!fDyk0L7=N>RZ4RKj=^LtGBUF1&DUHO?3{DIXNhUV zzmtE*<1lWWu`w}`h(_UXTEOP>KWPg@@tv0qmdq)ev@ z4|7&^53+#zG%=x(wtTCGE~=&`p`>&wZc1x577UG_F(oA&oE(W5r1|EWsByCkpOv=$ zl=HjSX7kBGXoKGiP@xwDJck2)7}V}(1rpgi6-3^EP?@@HE;&Ir3lk4=GBQZ_?qLH} z0~#|+3yZMoDo;-VDJdyo;Wn7D09BvG>45>+6woKvOgj`musrgi!OFQBZ-B-Dh_SV} zXbsTqg={iliX98?kb;7jXcvI{&hN&9avbF;ryW=&pxP;54q)CzsU*8_?XolcC7pUT zr^Q06e1^j4_&8w5@Npz5ze>AZi{fb~XgV-u{Dgb}9mGtPVm@JM^UHdEXn#0PLXM5( z?x4GB;PZjilQ+6)Htl1Un0#cEvqxi`!Svq|@rIjzkWdFR(`=-rdq*vo%go^k!TlZu zOmn)b$&MB1ouPVK5Hkro9#PMAj>iAlE~_IJ^g|D5&247?OC`MKBDxkL3M3dNOE%b2 zaB(@;e!2lwPMG8_L3>wMlRvrwTcnB)YvX>0 z7c3X&6+#JtRUooX_`KrgPijlN8Hc?EgZsk58O)eB-JWq@nu-{vM@3B>(cp266z7y4 zkL*H6a=M6kB>OEtJ;cJ=Ux(nXCe$>q1_sqDop79~U=!>XKK8tSnVe@}i~iW*XluB+ zZw~5guQT6YB?(nAv!Ymrp#>5N~B2%H%{I*UJL~ zC1R!`ykWXw3vmH4W0jie2@l@5vTy@*WZ#nQDY6MsF$tFuDfz>hOD>0Urf!_Sq-H7| zx9bmt^PGWdj=QygR#?aM{zD6pkei#kmUx%QAw1v>ACymORW?bJ4sCm7)f!^X+Qj|A!vaFt$ zSCU}XM8Tr}yRCXY_qqE9`^cVb1~y}>s*KEsKQYc&v}z!^-<~c(9be$Emmxp2S6-^P@Vsu ztk>ETz@aWH1=qqJ_0i$e<$ttGYaC)Z|6B;+zZDz(-$HTmMi4%7hm;J>Z+cqV>|eiL zzkQnkBTMiK3?xjm1=I}KAA7vImM1M$09!rDIqS zsPR)L)D(eE16a(=%naqat+h3m%?38l+fMja7+7icyXk}uO^5NTd#i&fv1uOGMh~c# z)g5S5^U_O8k5~I&IR^-T=ySfje^>`Pno4r9IYFM4{_PTonfnR&R}I5ze^OBVSl7=* zbFOB22#RXjtP9tBCQpfiZrt($eF321Ogct`>0Y<#omF;r*3GF3Kf()z(pZ+Q$Rqiw z*I=ffau$`X=Iw(ppsWQVq%0sEaug~nhu*vlGMRtsa z?>h&fJPZ#&DS2Jtmz0!5MBt(&rKD6;RCsxKzyUSaGoXM$-@cuPedp6QGn3?lsT)wt zXliOgZ`}3tAPt(gZf0!4kTB?5OUubE&{q5|v($5YO%LjCVE=_-uDG=| zH9Z|>4q-^eEsfxjw6=C)P!PJKi1@V@0h$;~ng2bp5@bJ9djncFP#pr32EgSb99{w$ zp6B8K9c{AI9LN!znv0`x7+Z#h1RPNU$h#2czn5qzX=tK(T&txhR0{P2fEj^48xYS} zgoND%jJ>%q3sXSW)X+coNf@J>U{G6Ja z`WPn!Dgoo(cz$q}?dh5;I6~=qu9mr}v2g+{{qp<-N@NHWVmCl)5a`YO_ATgL6kxzA z?k(bj2M=s*ZGmh0`fX?fE(w)H0MMZ~j7Dhuu!>BMmRF+Wb z$jHi~BYD8k5>bHuboJhB1t8atA3p+s&4h_3U*9fpT9{vyjAm~td>jDGJD3m5?Ff+s zhK7a$pBEgA0rA)kCeUHa#3?Y?+1OTBR)8~cu(N|?Ip-g+ySB26UL8cfTdld|01w~F zFs~E=OWp=S z;u!bO61TXlj*gcW@kbUHyL;I;T{(vOEH5o~#c)jbC0CgnJ?KG8Amp*HkEs_DDop{o zZFh4PO}X{eVdItj`JIiGnd^|+ zX%1+)c!nUl;<7J3>HRp$5s;<2{f73NDom3{aQhQ?k#){=y-)}ZOf*A|HgM3atv<37 zJY^WQEq@zx`w$q(*ki>y-uYfvXA>i zn@7BZ7 zt{wRE=)3R0MStr>vk&h3S7i6YZl+=}QT`&x2tgu1n3*!9`T#gv~`1daR*JU+X z1u||snXT2wG0aMLgLDTxF?{gOwF)yiE9hCB%=_`c(J|NUtxummLHpfB;0X{@;2VGT z_O6dwfL52yCgs&2By9!I1x8~$!$5*L5^!5dK42$+{GgE~J0^j-T1{ORr(h`xP~)JY zqUt?`ns;hsq!iA22q|bs#$)b;(i#phf%e)it;hLbK@@6R6-BSy=pheRYVT^Q+;Pkq`5&K|y#tF6Yn- z`1bAFNf&~8TZqvxxxxZ+^UQebH0D8n6LTBfKCV6J_f@LcwZ>> z9x7LEiTd>&&Bm2QZo0gy!O+;;EYDp2PJaPH|C7LO5#q*C+1}^K-gqU3g3% zj@z`nN{m&^v`mtwN*OHc7^cwSWS8c0ri`QQ6Il_FKFec@spaX`R1fGp0gKt$P_Rsd zm!1x`QOik9L*rYHV`4P^!`|-VbULM>K9oky>ea#P&~6k^m*&{SePMEY0}9d!#L}&) zBCYCaVzl_jy^(neWB6=$*8~M5~o>=uf@RcR&KON95o2~rlsY|D9QAt*yaen zxayfwZQ&2GF-PD*KdAK&M7sCY%KHn_*LxIXM3^6JbF&FDDvUG{DQ)PmNAk+cZ9c?# ze|TO@H2Lu4()^H7rM}U5aQe?Yp=FO{Ot_s%HZIR0AM08XWX#?d_FTRJ5I{w0CiF z`H&YDsTc!b4H8^z>@@UV8tUtz+5p4~X)7o&FcA?;h~zOkIyw079Jihj$4!QM;M7DL*WbK_@5ty9H+H)4WYE^%o*x_&djis-D(vs^NqV& zQ>t3_@~Rbuh7!uMvX-aY{bUm1YpcCZx~=$*9OKzHE{$87v$H45?>-917b?`)ifZ0^ z>UGK8m*>pE>^2oUHShx6(P~|U4|8crNhyNs^XWqzPN`E~Z5{2fx)0aw%g+x)L$h}D zr;ImNr1=JZxsA?$`Ld{)!G2<`p+u+pgT2%&)T4~e@_1oYR`h}8lAvNqcAj!SnOKzk zs;JZ;&jQdrgGR%CPoLn=O#67_zM`+NVlzA(JAD2!rNH?;^e`OC%W1nM9RCn#kbQ^f zy?5%nlJpG|pW7l>e7sO61C$2sPvSc7vyP0Dl5pNvttK)al_7hhre-?yohOXZ+|N{X zICHZ01kZJMPAB%#-3tY$G3p7L$tbP_=Tv^uw=gx=%S+|y8}5P^jP(PJjYC7a*Pc40 zz$Yj5&hB7j*JpmJDi$a9!1P>h1GRmik>rMEApNNQT7kfi`SlB&b zWaMR*8GN$3y7pKann;B&g1$dQ_R$B$eq2X`N>udNaWPrELvr%wcu|?%s>P1CW~b~E z49rUgYovYDiIR|>&G9@?_cSDXOK1<>7r{0xiw-A6cK%Jgn67Ra&YJsX zhdV+OvT=vf8c;}c=~?tlJ#pCC$NFSBu}jQaK=WqjC|^A$DnCq{b=q$_o@{MtTk^E( zRHYK*31h~@MRCYtMcocxVmc+WnTE|D(W`7 z*Q-XOoQno2k6bbq2Kl^O$Jzt4SRVz{sJ8^AbbrU?l5nW6Z%JMAa^hfSrlZR_zdzC_ ze>@(%G@N%)*Wmi{E#A?_`1aadW|nF;tK;FAwQUJmA1P|i&zL@~v-RN&axM%BQPGz# zUW9XXc6F_De9ZMz?1*zm%&$wOQk;x~=f!`t*`u)V z5E_k%|3Tba0A;;?ZKEh#Q4|mr5fD&PNf7~Qk%yA*5|Eab?odQZK%}Ilq`Mnwq??D9 z?(Y27gZux!-*@JnIcLtyne)t^*#^ij?t9&9UF*88HPk=5n6J;yzCQj6we+SBYy9}c zp#wO*eb{EZ1w7zvUajl7Cnrwch}sos<+zOC?+bne=Lf= z#dtAV?HU_Rs|p4JKy-(C8W%UVvp7G$+-{Ss7lD9=95g}-oU3P41t7fl=ra(bsM!E; z$ifu)GD8CcpbJ>&ty?}#D%iI})XUAnLDS#gdK%f&B}E+%-HfP}DDYSIvmh3cvu%o zN%zU5qvwiX(>C3X&w3MbrWJ1K0Jk{RW4lN|fJjVDZSiJKE3+{m!RA!3z{-dv?dTD+{!p2T(B401K0^w*3*?#Bw6Vah z?A7nM-5pbTjN~H#@A5WGUd-K{oxF4M7u5U+NKRI!L(&H+szjWkzCI)tla%DOJ22a$ zP#fd&S}>8hjaz8492psAJGTOZhMW$(JcXDSw=hwwDVBnk)@bd-!-T`i!pd}NW{K5| z56MAJD%XyO3mCvN{o*H-(xu#Ki4%Xw0);u0<>f=XzRCVxdVyL^?x~xLc;Mv?8i#iS z8R0Q8>Offq!Z$Rohf47PR|KNIJy7`pBeBW`au2Y^AScLG0wxW(+L;1HM32r5f*Dl2 z0Gj}~VDj$W_vq+TST?{OfG>4*JqHIQ@fa@lhYw%!@%;gt8Q`!(KJV}E58S5!Z|~fq zA{Pj4Cx_cf_~I$*Kso*N>JKn;!92TlejAvSUd@Apw(z@b^-97QIVzz*hjnkXZJ?bg9H4_kMfKZLilJR#S((G@*QI~B+7?K1!96h@O8kyI-zTXC zD_q!MSPareED|Q;WB=xfpQkO;n;f=VvOtS@mXYtWO0%dQk6FG49ni&hMjE9Ks}_AB zp)vG!TY7? z)Z5bo^tqkgU2y$D;t@d8xn7Hj`4eA6Ow2goJ^*xwhlM2rI~knF0Fj+LzC{wi201z` za#&~_@ah5106GQawTQ&bOkzU9GK<;Y0KDD;I#Qso?+sjFc2@#04%i%!#8p&Op#D5K zhO zzk_{vxkDo(RRM4ZKoF8^AUh>xWHi8%i8u8qw z|D=B8wj%yKWn3$CY30^WpFO6Qh*6N0WnoE$4Hz9w82!S2IGf+`=Mzq9>ZRZP(!c6j zkM4ls+U{Ea_ORc=@}Qa3+RS`kvw3?N)~gRW5t+~L1AH@RhR`Un^A6uPRj7^uW?Eyr zDl;=PQMuD_nX^J@=&QJm`c&Dr`0KH-e6dvvso2?Pv+0TW!!qx4y7a`ImLsoNg=-#u zf!6L=DbZlInHg(sPGPQsoE(?=mRu*vI%b4omU`>&4jV(cqG3vR0*P40K(9})$i9Vy z6y_It0~t-R)7Ej*i9%ewUAg!C#o2m`YOxs+5s?U+xq7@q5vv09ZLdql$jNr5HD~i5 zKdKYl@*4cz6q%2~jLTwU?LAZk-NLV@u7B!VWbs_@%I6m6vt-E5cN)l2ON0*(^?N)) zV`s78I$IY(cXnP>CdzQ@h`xH0WN*Di_VS0Wx&(saaIdPR@<40$rQbUf$$6GGiOESo z*U2Ye85fwDNhI&r=%xm{Ri7$*Up4F5p-or6n^=%crRMbl$^nEb9Tn(iPIB%h#gg!( zC}gULUH>6-;e3;Z$M(7p@KNBzSSGB4t1}d@fG=6t65a%QhR2OkenERKb<|9TeTL&1 zdgpv%0)iGEz4z*s04bY{Sny7w(2(+S#lm?HZ}02+(ZYCmA<&V?Ljf(WXNSphj^QBU z0AU_T^GwlkagoEr3>s&qitGlkHlq|N$Y8JhWgO%OzCOO}WNoR}xiUCAJ38f6%JDkXLX zL=yw>t&qe6yAx|+MG^s}odcK<)qTcJOPhiq1Kl$Flag*kUx5g!VyisHy3ellU1Y2b zz700CwWZPUOG5?ry8eFq@e_ekdwV~%iLpL=hvyTymSGHk3pTopthWtTU*Pt zGln@^+tUW1W;o8XOx||=WZAdPfNF`6+_O_7M+rP3e|4;xzpC8{e^iy})YeY){+aj^ z;SG;kXm49x-@w22563W2VXo{GKUGp!A8$%e`dD$&s+c`aQMEdljGs(Co$Y0!g_jHV zW>7<=%IX7~$@n*pVZv|qk3kQ`m6h$GZ0U80je#t)>sJ-@i_B~9$mb3$PR`a*sr zw(loQDJdJOD%}A+Smk~9E>@innm;WqPX@CzNb$HnrW(EAWa;VaQYxS*@H3-D($Gw5 zY>qXjX;hELRR@5CKw9ybxq&6E*`1p{lG| zwC5;ra)Uc{GrkVz2@}&Mq_kkktU7YCoc5xeXtG?}SjX< EGgdafG!cup}uY%nyeBy>`!?7-a- z@Z9KVJ#)n7M7y!=&{EIH&~R-Wm&x{5yhf9MXKQP3U)OtEqgn=?8c2hVkLguzt1SK` z`jUNYszdjk*>Q=qcjWlW<0mvlCd=hci&IR~RL{gA(cmt#Cg#+%5Ha5beLWQJpK%Cw z4$NP@EPfd%Y_)XIjapQo!;}nvq4_JmVKd+kNcE}3?>C*H&qrO&-^|>hcnB-$fMk<| z*EuQkFkB<@63OQk|CDrrY?D+>SP|H@^_*9>>=0lR^8ae3;STl3|4E zb|^Z=&T-#m3@1mUL6f1|B<6cFn`sK!2hyv<`D{9CC(F{hv}DjKuffUwW>)iqu=@P$ z7_vuTTZ5})rwKaRL8oR)-+3i8)}zb!t*{nO^1)X6emjsQH}d(q|MX_4D&{kbqWZH~ zm*8LdBMuhprl`XcmM=Q5X%UJDP_w^gNu>i!wVGs=a#QVP8{!1B@i)Z|Nnk)*jFQkz z3VmWBMytZk0KW*-r{)9LBmMnIk^h&`iyPs8yR7tG`!B-955fQTVPQe}eEj{S;QkjK zO zpb&YvuhXoqlyI>%wiziY2PUso%tgGTzDV(@E6~ZnVjrcrxS^CEiHQY3$Ncf*DJL5v zcaVlCKQ!Xr2UXpN8``M+{kuh6yi-OYIJ>lr4)qN+0Y07cEv>(sTYuk@mWY{|jij(< z!PBJ_FdYvA6BD#5QDtN)fijXXjVx|*IZXTF%3Nq(V*;h4HnHy}4W(}PU}ORTFK8RkB8qum-!5?2m0UP&kbZC5oz6hym)!5kV)Kp}S zW*yj`r=_I4?=h@}^a88`%*HFiLqaI;`GRu*pwG}4EwM-2(0~`}br-Kh`r;Z62!rp= zY*SvDQ0@kDq?njqXG~^#dTS#j%P7J+=s2Jw6(~%>J^lxhbpS2$a&zG-zDYfH+ME)w zvMPw5D(|P$1Fy;H>E0A+a@O-8xd||x+(u0wC@v;tw@3^PRj{zwns7bm26t2_ABRUq zEb}i-Mz*$wdEK2Y{m*p(W5%=!k&#hvazHonPOw0jVrejY0zmipgaqV|tgJO)g^G)b zdA$P-sxA@%@JhF8#W$4kBem? zFUMGY0+Xz&-$%gn5l6s-1ws7-B4{PiGce3;mnMgO{n`a$F924Uv>UVp-it8+kQaD=4+h~aX7dRTJuJV?iAZNhB8loygfAXr;Wp-Ol_B!IYM zXqW~x?48ux-ENoAp>nS08ZRNQH)~BUeOhLT`oe4laKtT_M8K^zq#-4+5GH_q+vl!mRH34M;)KOqt z0PBkvmK+edK@+d__HB(0jDbo_PKNEE0?Zya=d+8Ofq1K!FW?Dr-hw}biG>AjgeyOU zDgnR+DBivUE(VVjl*VA&8Ln#k;bl$VLx5<9C`p1tLZA}t;DX^bTtJW&6T7K;7y6)$ zu#JFD)%4&s#ci4iH5Dl5Anz}cCL_}tuzg4d0$I4)`Po?}eT%Ib6e}9oVn99uQZN_= z93LIs4g^ZJm6a9DO#;DrxW3)ag0!7oNd?#3zph#}k{^!c&(8xu4Fzd_HSTf z4g+PN$2u7SlAv?IWn6q-&zskwRM1}cW+=Kh(v)eV|1;8cK| z1pWl-6%g|j7qgA1^f!CFPEAh-%8CyWB^hW!D1hEU2E+-Vc<38qfwBl#x|-??(5LbO zDPOA%YGefuAbUXD3+5)k%!Oc} zLox62i->rmcql-18j*Hb{Vd6G=kL#VTOV`ft<-{9VkqdKJ*!pGkF zeEj%r1lR{e1qOBlgAXDyNr0l998dtIvMlYR)*iIo^a3`W64XZip>A_=1;_`x`jQ#q?nqD3g#n8A5opalYmg| z9S}fG*0B}>2nRl<2Ne|+bmQ3B?SVJu9!XlI+V1D!|9b-m2B=d98vn4(UL!#DQV3kM z{~SD=w*DgDpBvoP|L*=jBRMwIt+3lb)X)3)G4wpmq2URfEHwy75a&P`3w0}?Et@-w zvWxoDlUDNutR}-&;PL(E&mVZWK=``r+W?Tsn|wVi*~GVp2M4Gi279vS*a*UpB9QeV zV1kql+97Puo-M&5RwhL|D8lCAG~Ym8H!Z+iU9v06o^J8GP!iPOPjb5)y;jX1J-Whz zQV{@;3m8RFB}GLxKp0}VLyK0059KRtxzWdcZlC6}tqXsLzRUbP^2ZeEQ9Ak#FIYFY zqX^mPcP4bkv(-6tJ;(-OTv(JhQ*@DF^yLhS7&I1Ecc@&N&`Lzd1$PF7pkNFjMI0Ov zW9hZy<0P|J(Nfq+HOwEzXVgA0O)->pjjeKA=P?a_JlBX9w?TBOKD#iGU;LqJ{A1~( zHqDjjaxen{NG`bZ;tmdeRxNsJgDzi=0By4A;jL?*afshAHG4ZTiIhXbUPnlqX&Ka$TrS*cTfs^IR~GCsmKvi`)J| zJAlLd8!Iu#;XzSnXQ#fqkUvR&j`IX8ZZ6-Ge_#*4jFOq;6%8`o|S zVca0{w7+pL*P!W~8%duN=1i_Q-?&yM9aLZ11y z0@-UZr{noANP5-6T%(22ilojTapeBQ=R>pXs8=va?Fq^C#`LmgkGis8ASz^K)Q)-` zppP!#qf~j^(*ZT=r=cF1glrCXae-#|sVy2>Orw-FvEs+4o#9Dx9Cj~V(a}$bIBml+ zl?WW?CF%#nSKeLm&%Hx+ZnEwNj1DY6|IU=|A+*g}l?ja)+tqQRq4f2=jrN~ZRAR57P1eyo_GtTF z!LG?zo`|k+z!n26JJ;7E;hz8>n#fbtflnEz1i9M_5_+ z1lApg2#}E(F1*eD`I7_8=s+HO)oP6*x)BA;x%v~6vN_02@Kk;m?yOlmyEI09zIPnR ze|&Iap*;W~F8pW56%&({wG)92{!o^4j1Ri9I~SyXi6vSl`&X@=yb8;{saD}89$Ecv zb3l9<+CbmyzJDL-jN#S5EgMR(XQsN%rFB2@ChCr)xKZ@;g9pGXh6*+KjM>o?nd!K( z5eK^0n4{wzfZNwbT;D_I+`(aX?}6cXTXgD+r%tMeDe0-iyyh}ANo{e}=L+|{9j@Bw zlao;<@l-nUKpz`Qdl~P3_Oo@!o1Ch#SD7b*0E^6d8sJk#77Z;%bXD_*Wb!QXWE`%4 zWMGdeUuZdNntlm`m*OuqNpH3Hj?sBvZWqIB@;ppS9_{bwxYs>u?Jf00gsiL!kWKJ9 z^M9V>!t3;!)KF84D!*zK`kDd)wH@2+hevlonY7F$A^a6P4>+SbdJ3`3+qFHlAHAkP zvTQi>m^k})AN7uU?I9GMZg&@Ozz`U&sXAShh8Fw`$U2KVgN?avOK0jBgt=*QuME zTiRLVX0k-$Qsej#kViz>$pg{~3C}>5$}f|L-(r4%7dmDCE5vi%DZ2o@H6m7%aCqv6 zH^O$-N6Ix~)zAOT{Xo5^4PsPX^+Rw4S$u9f$_>zkfM{50Ig31<1`CX22?P=4%*S0i^)@($BXc#3W zRM=1bBQKmFq%I9W2jSpooPw$&x;Q5!V85(i6J$AnL{3w1*&PTUJq3y7nfXUR8hiLc zVR3(=mIRSflDqBNI1G8v+f8z(_aPbjFYml+~>n~DoNtDH4l zXD-w`Ctp!<^5Dqj-14WC;0xUzyE+bQL2T07RVGc)|4Y2n5nH{nAuEJ zzJlkA{Mg)(qmQ-Lyn(9_OK89y7BNCaa0?w zV-r2|>YQI6&R-urysCexN1rt=KtgD^=(d7l3CYdz%s_ld9p3tP_`fi&AQCl2W z<2%l;!2zgJwDI)W^Si&VL6dKPjkhaZAIFpgwP0TA(wrAyLM!OLKKE0uvl{m=zl%S8 zRnRcz8pdX?Je9^2kT>wm`A&d{j~|~xQEv7vXj%xZB852%J*hw=F)r`{Qa>_#$)x9 zzI?eESzaE?ZL7IIe){Z{=IZd(YVnvMmYUeei*#CwV0=0`yMU!(^eLKCJh)((tmYBl ziJPO~a?MOnYV>pAg}aKhcL*TbHkugc8@=#DaXUxP4(j=0v}}1?aJuq&X0?DXdBTYBCXH6`sL)l&i}QPsTuql714p^%mBdHBxg`)poh~p&;N{y9T0%MqZ`rDaE>k&?7=;%2P0wc zzW@zHNZX88+syPX>YFDq8sr{eKX}nq%?hU93cDBZw}?BT zNNjr1_ipS`FD=@n=k6vR2H9_#wm+XQF2DtWr!Oz}#fcu}7`wqv(m-wOJ+wKgS%Dzy z?vg6b&t2-xFBeWkAk-YOprpY*+-6fHqLs+jXgaq!|C2DO>8@g5_%L31`<_~fm4|`M z*Ra9fesf!+m5Dg|*v`yry!LxeLyXfee(CzoeZNm+{*m;_riskNFY>z34z@Je$PtC{ zhE~O*PwPqqWo}K=<|7w(#wlkxO-S$xy*NXf#d@@Ek!;H zfYxeMaFk5dh2Qp%*Q2-<@Uzj2rr>>&T4+-iAA+rwDEOn;RnWM4uoe{0ZrbA~WaR|{ zP7DMChoW~>fx?NmOF_kxC?w`2C1GlseW|V(vGSJu27lehCJAtyq>ATp7mTXD%i_AZ z)1$ZOJH}R#swO`!b{KO9-p2w$j|7 zpSaTH9UrP(#?FRGS}0bA9dkM-16R>63w?>X<-E)~lH2(MHy64?oK_S$>ysTHoZ)JR zs8H|qK;)YDV+IC)qN{F_IslSj{W{0^S#`@od$#J+v{+(7uADQ?H`Mc4ZhK$eZWJ$8(zlUwBzE5%}z{tVOT#oq2FOLwPdViY&ES1R*v}m_@8rn zN$+`PJs4tpcQARzURp}4kR8jxt<%0G5Y>VUU3Axuh_HxI9*c#S;#hu>Ou2Ei1Ar|Z|Hk>R&LLF+!FoA@J<12?Fo+I! zae48KRdeUtY`SDL`+9eVfoD-Ba>Q8h2{8*jK?4nQ&OH%*(t#i>WHbH>0VKL@(I^@8FYx|>7n!)+CL-_KdBlI zzn#$k;jG|}6jj93`Sc2ja#f=ZkrC!)&x_EOtJnS}>zE|c9sWj53YQBbr8O<;E z{tVf#a(B%hDd=zfU0XZ)#bkEVj$}<7HsA7KRl7&4^pc_B9Au9U)d`6y&ErF=5o{oN zS1L43(6_YJ)s;R(kdf65UkzcPNPWn-K8rlbHVOPN#$l<)1O(GW9I(pl?O{$NN8LZ| zy>wwAV7NHfA4G$b7a1X|As5jFFou`!sS-iBqJ6PbucJJITzZz!pK zCN^J9!vFG?Z5WkyyT#rK-M#Dq4RWm*I;j^MyF0wRwYxe zEmvf@r3&rt(=#SqfCbHo(iBuw%IpqljA(rcda1zdCkvUQT*k6zij?_f7W8fE&TX+J z!Vs1_xKNYMF0*-e##Fy0mj-R>V_L-r@{g#gMG@aVUY^Tw;l2YLDg118;05Qn78q4V zqFwA;=J?ip9p~GatQf?(AN<{42)UvqIHjDid`u(B8 z{4^z}jg4+URq~k`9W0|k?3ID=5tPah%|)T2Nm9eWD3t!_3R)~RG;l$cOXNX#%XvPo zQkUDb;F;qc|0#vRi2rZ_OscBqU5>O(`LF!VOA4RAt2H_3*d=&gTdiGgQ^hlSk!K#X z=;-P72$_WwoO5lG^IEvx5`;D*PHX2-Br@w_@t~dEQ4+qW>)|r~k1P;IazLI|XwYt9 zdQk~Z68*oXue6f6$C}cnOtszO z@*oJ{Ua-nYNe#t`cE#q;i|TemAUw8Rmwod_43%?k>@I^IPl4mZ=JLUW(`gwox63#7 zC>FEss4Jqa$rW{6-aE0*80T|T&IR?wB9N5Ca5;9Eq)blD((()XKLIJz-z44X+D}Ea zn$A|S!nJGZKSZRrc@4x6Cg{$O zX;OP-7Y{lO)mGmKdM2A$-eAcm>P{6z{Mmejr+&DHOu;a*Zg)X7tHbYrOI>V5jn$5A zEhe*&(s5y`Z=<&1F_5(d!Ky}9pLo?|c4juoy}v680i7sZF%b<}GiV8X+|BanWh;?(RHGCGHoTUhj^{QPS;2Onb4bhMx-FDLJL zwZ-byJNA1g0)l#>esbM$ah3D|o#pqfL;OJ29K+>2kT1Y2K{*u!)#x7KQzy}SY}UM| z&*|(|DCS0wZW5ZG$@HBxw4yugEf2B0TiW@mm^~3}9r`UY48KT^|Lw#t$P7LI3E(zA zq8qV-BRi||>aFe;=J`g62tmXu2gcEn^|6s7MbP_QhaIo(I~@P)tZ=_C+4&OS5vPgE zX*==7oA{Z9n5SEe`95imIO=I`1YICa?_mQboa|dY-_s%|_N&}0RDp8HA@;#BfvE7X zk}@F0o}1SZJFHI@XVV7!t7UX*I2 z&r4QjecSEYceF8@?cxP44>5+Ova8bF55+-g|XEP9_C3WR28iMz*e1VYdw{DOrsmSj>qg7~bZFvHWu4|AiS8?Y_^LvhSmqT(` zwDWEt&LrI=&~b=?sd!y1`uRYz?hQv(BaeU>fs2^Q`-M?OxM%b!b&hU)v`A6eYiU9M zjbD}?;^zwp-jgA`Zki+t4KDVLR9}IgN^%uW*)f3JmJblU5U)_X>_+(&x+7@TB1{oMn- z{iP1vWkny(qRY+Ch)2xJ{^wNFBS^LqPSl8!7pPon-Gy;?z1I@TU#Poe6cxAEyFy{) zLQt7*0)23ZKx5BFCdm+x5`}PjU6}itk2ud^5V?M=3Jn79cw{X~-kDbx)8Vo)`?zgxd>KV^;+)1i` zuAF)o?I1?y|B|V`M6eFrTW0e>X;#Xd=Ld25!`~)+-cvLi1=&ULw+O1rAL#B))Al87 zu+uXj{l;eyN=;7(_mpf_3_sHLyZwK^m6OD?N%(!J75k*n)aAB zIZ0nw$P45^igXHr{$34QC^_LbY=z*+FjW{@uhsrJWSNx-SMNPS#i0zcZ}6cve4T^} zbv2Un%!>#*-Ilo-9(nOP-sPczP@z=f9dF=O}9A-~*%#IjEc{&q@ zkS=kVan3zLcbZ6C#@0xhf}2waMY6Mp#b?dVi>???n0!K}#GM9epEuTz<9P>vp;fK@ zk>q*oujUxb<>)fihrHK5Rsym=6PYbYrdCWci$ATuw>E@osfJZoKdih5wiUWF_u@5N zZ+SUrX(f>pgoh&%>28Z)&;mpG1oR?0;HxKW} zJRw}1XAroIdQ9ZZ3mb&@U)r70o7RLt_fnl^JOv6Qqp9XuE z#c7iZI10g0?f`#1g>Fcinp5&=+;P6!oCw0oWY?OEup;Md7vncv<+y{GO?({kcU@JQeMn@a2h4+R+hg< zJHTPG_8ixXW}TSWo(0qjwGn&zURbPXSmqzS_VE$x8t#b_s*u(1Kq@J3(Ukug_}{Am z7XqH|BPYrbk?|QdbWL=btf#(r-${lVAbjl4H!rRAP?Oa|7+k>fC{Ei^0gYb@bLd6T| z=#!Y#)amXMuCw)TAyp4Q+*o2HIeYx4@YMpzsgLBD(LDa{j^%Ni$=5*gmBAx%$?W=? z@VUsYRs!l%gQIMnDEwNf?ByW``%hcrB2v~ z#IO3YZ2AX14hV`TGYkdniKpqNB;Ik3H??9P6Bx{&6K=c`s(icj*;e-FmCGtG=y)h9 zIzF*bEzx*vU*#nk+&!GJ4*BA7)y<4C{i(kFih}9RjUgrF7%oeO6i0kkFdWr3(zb^4 z`|Bm=-&?=8jn}FyRt0H&uMQU$l$elyJJ?%=ei9OuB%xSA{ttWuB$Wz{FU5AATi1V` zWC|iI2YLa=Q+6DZ22>545UvW|zG>Exg+~1rW>dd;(Cd0CKIA9VW!U>->|v$Ji!LjO zt#phXU){N`Rb2CyU}5>jKOeb|vF(d@CbthG2$x`tP&5ZOLP4P@*Ea~p^^6p^Kr;~H z_A((VTy9t%wZ*%KmQ3negxDUtk5qD)^P3=#!|`on9ur3p_g0x>aw<(8p?B{E4Yy5) zVC)RDRGFkipD!e7#UP|)YH4ZaW<^S3t-PD-c$~+JhD8?h5CwZ*O-W-1IhL+S-r+T5 z-*Gr9J*!ro#Sg~A)jQQ~=Ca!o)I7g}m3&nh^%C&$wqL(a>A55Ijd2aR)ehU&vBLnj z+kM{WN%*t$CaxhXIqI|i@?UM75(a8scz3$fbxJo}jr^96-W)-9UG;X$V?F#iiv;;w zEfqwW8=J-%^dRCN>53a|`zVODn*F9+(?s_Xaq!%D!Da-ODi`-?DHf^b;JADF9*GVP z#_sa$%tDT)<$+fmI*8}InsX#pP1QK)u~hR77ccAT;^JPhUjMeSgG@|i#>BjlK~GQR zcbcU2OWeRMxjdI-o@JxA+{YQe69m}1F$ z%2XV88DL%VjE^PVIGcvu6;sjnkqYW2D)#0dIg2v1Nqyyman>-y3=`G<5Fwjn8v{ZO zp9md^B(9F-3LND)zD!=b1ld1NEU)3gq%_`7i+6)PM~>?@dtk)=({;V(tP(v*X8g~a zpOUTjctCOLiO?}JF;La)7b7FQ!}Wy-mDRY#w!xE-$=9*!ryPBZi~FP{?AkxUF>0od z+zX5e&@-L(a;84tGCR3YBagu zNYS@V#n6M2l7dn7o5I;A+N2CAF@%BgtOWdcK{^^O9NO~d5@={uxX?z>EB`x<^FZ?b z`d40=Hf?Fy<=0^i`juDPHb##+xr{P5 z{1IKAovS9Ic;ixjT_z;$^3xaBEioF>eSChJF*zK_#Gwug+FZ;0L<@otk=A>+1Iu1_ ztES%m9AVKNrg5(|45wOhWy>c)8gP~{6mJwUHoH1}Z@6#6l zZ5QkJ7Nv)ied%vcwNd-{;KAadyJTiUjPn==c*RBWFmlUCSH3c34X@ z!kC910u^kj7D)SbK@LPis+EN(2NAi1SWw~9w#D8h@x!b)o7s0Oh*C2U&lMw);rc@Bm9jv&rohB+H)^- z_g@}xii(~d6)w;@gGQucqN9m%8+av8R7gvCT@&lr<`%!&JW}u&`zj;T3@^I0AQ*v3 zI==KDz^NsMD6ds$py%rOVdKvK9IG-$k!Vw(0#Y)mWW`_v7=xL$; z;ykP>5?Y9VKO4>{(!$@*|AGJfZ?yZ(F*=ItXd9{ja{~~q3Juj-tc!3arz?LN2JOK& zDqR2eY&Gyvcn8k%G%YqFSpIt*XawL>6NaLYxOH|H4!VJ8=qs-)U>Z};PdUztk8wz^ z;1KowPQQW+EW7n_+eyG2Ca5T(Q!$X0IngngoSM#z>V}w&6@i#f6;OVy+@XvrkzzLq zs&no2s_6)hYF@Wk3W`UX9+kS@%~$tpGE34+_6^hf(@e%3RSON%2QuYHRrX1)#h2v1 z7@~Rj`yP@!V`jgpU$kT@bX{_D+vQMbjlHwdyV&K>LNaEai*=yQ`dNP7Ik(e_!iFoO zx{g=FRD=yHh&xgho7|lfg7iDqkN2C^C&Y~tW!i+~{k}Y4N^~5QNDJH#i`a8INHJel zWGv3oY-yLbI-OgMcEmPT%Kr#mMoZMg*f2ri2vus>&qi_?+><9%&iE|Jlz?J<7Um93 z#QMaUrd)H5VHIPY^mT^w8d~?`{oJCoz@SJX5?nxd5eQ5Vt&VtIP-K&T#)er*&M`4( z8qLnY+Kmc{`o>}3$mNZw)Zfoyp=-Z^Ia}<09$9RM%;7_KIJDAbJd1(6PcVW17V2 znTni!QKcO7p&^ zv5wrxuNb0CEy&0+)Y7T8kGiLa<`)@h=1|M(#}U6IfKB&u@jRQ`zEeITf-908?2T@k zSF6Tr6AXT>`*JdbHBj6 zx%$t!t?kOE)G-Gf!lUWVCW#n(Yi^ZNz0+}5oC(KUd%Y#z@K-)xT$+EPR?Fn_M`)+Z zS;A^j0@Xdtz7Ie?OaDT`CZzCr%_8xpM=Tcr<@?gJ+_u(#dPV<=w%_#CeKF zlV$%_gFD6!GI!qXJZa0oHttVg`he-q;(+~lM(Th9%g}|~!$}Q-lAB>iQ=_VCN@?OB zou6x6V?W2feGc+oxC0R;k-~5+4>@*>1DE=}8E8|Hjx6^uJyv!ukrAFwzi%4e3;Nj^ z{@hujX7=G;x7x#7ZLusYjEt`JlGCo|)7f1c*Y<+Hw9(Ovi{}d03o2bbI%0hG44#E@ zwY}<~Iy#cKt>B7Uctknuzz+v?%Ab!2hBO^(?_5sRabXSpcGI;%`-eb-CZsRJfx z)hK3-KdvUj#RZ`m36G0Keb zYwI}huv|sD=D3V;@MG-e=N1``qzM!=5bqIl)y8Z+eD1WjBeFVDv}a`-l9HZpj#?83 zWj_KbU`;I7+ORyeu$snacxL(glMqubwM4XPq0Mx)XFz8(6SA-VyBA$s`#|Q=^xP^Z0M4--MtswscatUV zGv2<=t|*lxN7LWOb0B0J8#5Nc>VOo5jtcUJMPM z>~ENtR=@~XF$Bx1@sPp=(|TjKRty6zWzIr$%k!$3PurJA@tr7!B1yntT4|W;Bpz9r z&2}hoE))3a*I+bPUU7c(LF;$=Wra<<3V%;76bG*2nF_371K%&(nd2uVhfk*S5# zu`y<+l$4yDD5~q|++SEUPgvIiOL2|f(9^m$&bLm3rTniAReA-nZtl>&QIO^5-<47o zrDdj7WqE~w-ZCOFAt95nue-a$UQwg}W9?;+SGlI!tg$Zq;k=@XS&!n|GQuncZ(^xu zZK2+lTlO%9tJ+nxjegA~Y)+Nz_kD%OU+^#lM-eJ3X`TL+bH5?={(IL`{h;Z(9R0@XpCQ=-aCntysb0NPdzdBOOs zj_FO8`>ZKh$>oMonJg8<`WNDWD%0=K1E2Wk=UNVf@!&kloCe&i=^e|_J^gvE-B29c z-U1I`3zkF~Q<(1uzxsZ7g@vvS$euPU><__3`Xe90<-A$jk1H;SKQi&Cf5?Bfp7p9I>=CrTXiUF$EnNv@bVy^SqSk z$jEHgK1)5eN|9$?6R8MK^O(0Em26kv!es?5{Mq3 z1rYSgPb1kk2V;fAW0=+lpD;UDE$bL)N-HVZZSO_r<1_d_V3I3Tdu5<(V5f7ackgo5 zk0N(&$L81KqP{*Z^(2Hu1WQZ5Vfr>~+-GKUcT?q_>AanYEM8w3vYhnPbpOtTL)v7# zJJz2jz+C#K%6u6c_|bFXMEQzuy%4p0rw(Qlh2ZtY!7)TlL1{L;wA`N2SRf;)E=>dxQsoNba|poIs}&iLt_uri?n1p9I-m{$41_+0t#zzl zdG`pk!9n_M+BiuvEpeb9>&~;vtL$Os8`R84~$eS>BmivqKZE@Jb1T6L8(B7!fK*NPh(Z+Zp)bXO^bDFiw z-4toO%7J1j{s50)Q1zJJO{*E(5Q^ytaSA^#OEAZ`L6CZP_{>tNPe05jUVc`RDIjY) zPt_WYHN&B#8qFUYDe6qcc<#Z`F{P9IzyfMoUso>=D(;t$O#3rl3eFYzD zU!@{y#V>kkPWBg6Ttllfr(*@wl1Dqixlq2osfrx5;J^42Qvc42hBE3mPT26?|9)PE z95lz*LGQKPdb#nh&;$OWVk_`(ixhtCR*d@5e?MvU^AnX*AjlzNH7)_y90P;Ypde5t zCV-31cR9esK!ybpqfp?t%h7~S20xL7IdT?jqowE=*c22LVBW#WSq>u1!8G~wllXuC z(T&2xHUUpi(tIK21RrN}@CzdgT!487C|MxrOu#$b>m8_`K;{P4&V2&|k#T*y72vx_%YPr>ILbw&;MCA}tU_r8O~`+XcJrCO=K#`#=wUh$e#IlOtk#TZ86}n1UgfF!B$k zXi!lGwZJG{7O)6{$u3ziyR&H;CWz&p(18AS?cJz{wmE)DH`{{g^s4rB`@gy$>Vq}` z3`xn(JJb@WWRaE*CToJCx1+-U%NOwe1<|3Dq9P-&kcSf88fd*>g3Y^kk5P4>w+oK4 zB*H&0Vzl0fET2S3ukl|w_J+N)Q+FKHcVKY568G}qdm9_D5N`rG9*C`&-%q~O+xLNq zcc5K*3dCrwPp>pV3#&v2PA<$$Ox=Bb6!9>(6Xb>NBY0aNBm>iJ z3y{Hq$2bTUjldxCi~0NaLoi?yWQ^bWKfFXa-N4cXLME8O8i4xJ3MRas_t0uGSiBJoG^A>4;U%V z5{SOKEzw)Ja7-_TTDzKm^gTa-LU|-D5Yqqla2^qsEk1=TWyY{peTncI@rt>y7Urtu z(KzwexzT#+a);BoqxO;FEDg$#*Nu`9Ym0LnPR(fjm*5OvW;5e0bH%V6vTeqRAS5JG z$d)>l+;~W*HN0{~-+xUXo3yEZb<}b4Pr~>3crs^aZiv5{?ng$3Rc{1@5!4c~BNZm| zS+1-LziFQHYMs%i3JUt)2cCK|+t{JTd+#Nn9ydSD-QIl-~>M#14XrNZ*Tu@^@I8+ z928WPy#9W@-2+p-(*77+$UxmNYrJ z9h?oHl)n6Erulwv(v{mhiX(>#l-Q+<%=(q9n8q~X)ch{HT@C(H-lS)dUUIcBP(!SS z?N}Z@yvN~i%R@`u#ieJT@9pZVDrN&gcnww;F&m)TwT^3Hq`do?*m2FhN+FSV`m2br z!2O_*@Qan8^VhF;^RR3tibuYRC~!6H+B*`nr?PrvXJq7j$QQ#nousr;POJ1VhvxeJZ)c3K;CHha&>i7pes&q zb*u4`2e9bAtOHU6WI|1#Lky;~^UKTa_rUnh!`&SRra`>}q0}%4fjtCvTn9@LG{D^> zt$Vd1^H|}iDyw%?`s+ffpO=T%NcBy}_AZ#+1D5}%Hiht0LrupbdI^&kR(s1YCnM&v z;@rP=Pq^}zSq*$vx=GE>`EzTa^bGO`MrQt`y}ei&I$R&(=Jlr!2|~Ko?ZoQO;z;HMp7QHf4E7Y-C5VG`fllN}(XW-w@eJcY0xE^s z6rm6wemH+`5n~NluZhuW?mX9wgDn%d4aS6p$$|A?wK%kPkenY+xp__>=zO!5$WcYQrEf7%b6X(R50w#5 z=J1~bsEE>Zr>jICbN7E%y7+aq$zH_8$vLWpDiM_&`DxGcKIMClG#CzcXYZ|%m|t9d z7?B+`=_4WmSkjSr^V!j+((izdBtggN*4#IxbI9i+LJsFn5Ti`$$MN{69_8qyd>gTw zrl)T7{rZ4oNw419aj+_6=75~ndVZ9qO+k%UtHsB4>x$b{y;8{k?C$AhxbPLADkdt; zlJ6h8Eec{^aC-L_2v8wokZsHl6h-!SRwJQ?Jar^sIam?+-1}<_I6T^_x?SHdZrsS~ z)rvbjKiTKIQ+q({xxI{f_|#;o%8D^cCQ$6#T>Z|K z8tXA~O)Y<=)zqwoSkqh_ukGp0a+{&q)v!bdw-aHGzk8F^=ke+KwQUEeJAfON3&=&m zQiDtZXmuOZyK~j{-i90V2_+V%RX;B!TX2{l%3FqqQ9St?S!HEW=-ifyTkSh4MLdeq zGV*Y{DC*@tw>3*hI0Qq^fME9%PeP}I*0fLepUFHcnyK?zpC^_dKm^r=(CYXH9_@2G zU9z$`IFTU?g6v=lJ8vO2JE*mX97c385v9drJM%zzFB&)!P!_m&aS_fr%P7a>Kv3G_dOnz+ z_OE^$Q(eQ$VjyTY{@Flz;G;rv`LBZ)D~*?$CI$l)u?i#2XP%f_dvxjR>q+oZ?;M|J zyj_${*e@ zpm3v}q@%gT;MI{GSSq{Iwxa_~1qmo4V+(a{hMJybewtg^TqMM5C)+`ao_3>lc$urG ztxa&St<>`S&k;zvnz|{R(n}$D?Gff*jSAImwwFLTdaayP+w*!@PqR1pANJx}3l;aH)DF^!CPgzZO zJ%A-0JKIVtVQ)#V=FpwlPD(OR{JJ7XIrPus!UDFEgM%fgG%nf*_}mlHG*Ez}FYq?D zK)2c{&EG4~MuJtprfF$MhubQbL>1p@!wf3Db*cfH$lfJ6B4PKgB9+4FDj460|8VL# z-IcQ*_o2VPk0xm33)_9_BKk1$$L}B8FK4?Z#;hZ>LcgFsfs^Es38mw*V&39U3hzVc z>W$~rud;>I@Tas9q72d&x#$YPi3yh)pub`y2njatYR86iLOj@5ndT>i4YB)jznRVD z>D%1JUc9Cflb5XxgI0$8)^@^Y&8uG6g0T3Y|Z$sRs+*p_zv4+f2WHL(f^WQx-St?L zdsPsA9ooMVF8FA`9ACD#ZjvP_5z#Fqy}gsdQeAzgjn;yeJu`<^X}S;bD)fS(A&+0K zPUe=ALbKa*^W6_%_aqrgd{)j$g<=F<#|yOc6F4pHPm^XkhStpFk~If9Q=NKmUeT*<}@oi+x+yiftsr&An3zf9TSpOwbl0o-P09WUgRN3s48op zZuiXElu-$Zpx8sRySizdcBd)hRQ*PA#AoqO9^5;ab zU+WSH0r%2sXtGmyJG9p|xoD~`BP(xhdD|iKIR?mOhcv!}9dT6G;*&pB<-AiDuT4U7 z8~-T$IYtIfj&hD}nYF16@|i*FJD7qbtDmrj&wAKIH^E(4O?Izjy_c)&7}3iEV|7GF zMf_80>X%t({hl-|ltEyOsWnErW~&Wc^+)ffNw|t_($Qtv*N{7yTbkEdd)WYBlAo2dqmT^GJ(et~}0UnQ1(X$rlza-{X^ zY%&toEAz~*`VR?ysA&gXFREw!pURikMu$t-et8)NjLup0ET&3`dGsQRBMg@?HY%)V zo=CtQeXU1U?Pje5u!#w%97agTB^(NJvv_v|>|CpYfFuZJGja-_&m;C#Lp_C~p-!I{ zt!pbQ>?2QQWxP+2BxEw!AJAnu2DwO>n3!Wl#kXVzXJ=Q%?Qwd;$EQbMBVBIv?6^>z zaNXeG{Mp;d%Im#qeN>n{`pPg(H%)Q-gjE0;WP`CI3T0a{D5>Sp<%CjtE7DC&mgdbZ z8a$rKqvw1M)QCj%VzQooIM8RP&vsOx3>s(>QL!m)7{Dr$Rp`xT3ubtH5g60akd;fq zl|7OzT7QsOdBJVV$s=_wzFY*P2ITO2ciuv`&8f<1A@^gU_3&WGx^H$+IJezId~$L# zf$m-OyVI(=uOcTW>yG})16?&lY@TKOHJwC=na^d`?%koamJn(}Eg&MWPbLel21zOOiX z^71?->FwD_E2L0qcpQFvC`50EUYwO|~?}6r__%Qo- zmoHy|_e`VIdq>`#c{7$j|VO69+q|Dr0nn66V!ohj(Mm z%9L398)Fv~GgCOuA=TA6R~bx7ec`R|?ukl(^gX0;g#afE9*IM6gin1nR-ENhkigA& za6|p9q9FX9@WIFoX|2!50|9{-Q<*;6Tt`MiA=U9Y(CzC~FC^x02#AO<1RyIrJE-we zF!b@!=#Ns+24#`o8hyZVpGTwoHB7-;*qUiG#9mdKiGyxEL_}<*$T#Tfh5D67KW>=8 zZWP}W1$|;33*w`l6-!CbBRTJxZs&oye!Nt2ne!ULUhfYB4z?~i7Fb5PbkOGt|IJjWihWF*EuDUwG3z9%a@tYT-7pKq&ZIOibY&+q$O+f)j zOmVQYzfa-6A0eH=N3>Z9jzZ$LZukl5 z0J69;(=(Q0Y0hi|R{GOqHYkEH52xydsU9h5(4ToPr$SUO z(RdEUkAa}i@cXH=@MK)!v<#gNPyTT9O1^H5{aIms z=an`S>xWJ!6R1zrYNhK?Q+o5}etQcXH*OX!x|&O8FvYS=mLGk6|M;x5)Um9*3<_Pj zc($JQe{{r@hw81`d^&j127U+b6OcCRM}?H~54P7OJT@ zE2v0L3^T(ECB;3O-#9bBPEwYKldk|a0_BU2plfo2XT;x@EbB=5jjvMR7tO_8Xd-;$ zczyGY@UBzEk|dKO=VsIUWtu*%VrVtpGpR7vL#ix)HTN-MTlD*cE_>wbrYISm^U-xT0(WyC%|NQ{RbzkakAmkPt74c#z**+EGx&8(S2q{P$*O^f3TwGPM z2d1DW9*jGDE-G63y~u8@=p!c=R{0smI=G?#lz6FcVPRP4o|Dq5uxr_Guh=-9D@x7p zws`)Ac|wgwIcNUoN3;mcSwgI;A=e|nWS#1e5eOL3DF(-#y);mCz~hT~y#}7Of47A~ zWBIxNq6C(b<@lb3BLNIZ$`c7|GvLufF9-!aR(f#e<0%R>iSL-n8DrkQ;U`mqrWF_e z2fLVmq`b7c&2yn%`T7bMMcnMay$F2(gxA-gZx*SX^Wo2`yfUzqzyon(^qXIi!5!+? zn_qWY)$hSt#spaZ%A9$UrpkziMqc!xg4gb;7fW9_xk3{6i{D8r@arM@Ro>mRQ(1Gb z2|x8Vhi|qe6@IlA-l79sNB3jUZ+GLe;B+{~a&~@n#3&K+^vBiu=pH3!U0MEMTFgZ- z)y;eBR_r;^R>PeOyO8VWPwe-?MJzG+BZ~qX0MWMYmYmd7`?dE|P|t%XuY==Da_GmY z;2KjKO{3^7U$m2VS58|5Lwm zB?S^{L)Ip!HxoFGZEemH9L;12(1zf8%IZmITn%pl0)cAK1)Jv=X<8ssQ~~%+jq?_A zJ%``@_<)sV$`ci3jqMSa2*w zxR#9P3YZ5?a__dyo(t6jZyz$x(oA{Ha+iUOP7R&%?bYFoPw_cF1XSMjHOi_#_ROH- z0mF8!u`w7WGr`p1I!ZX7(4;2$S-Dj3>#AaFd~GUop>HlLmL-9PAY{}~Pr%jQ)sc!C zYK1;wj1=JO{6h2s`QK5PeLvsVN=x`h4{3H;k?GL`H&`5wELlY|dV-KasKLVTEBTDY z%mT0C;^#Jib0B;}mHreGg;(E~nMP~@FKf9AB59F6WS#ndf=Yww^||J%WUEIGSaXv$F}V?$5pJxd1HB5@hzFS1ecA?=*Xrml)LOKmk+X* zAxx`{4Cs|}n8LMp2ve%;pB|2xH&PIQ5K%2K3ypQo`nJExwJht1#f@lIP-V-v&Uu z8dM2ON{d|}ccvhj&M@|nmr)V#XduYVf!d|Cq(pUBLgM7)Hb1|1E;dv_ko7_p1T_WR z_@1ZerZk}A4=T^=X;9Cf{eco2US6-@L6)}bu`WI`K}zphU%?)LkWJL-qa95GDk+<- z1;5&tgXGJtY);!;56hnB=1kV@HYV%p)5a36beJ%@Q3EVrkiUL!NZLjIeP-qx_=}Kg zcMY0c=I7*!!jQ4|*SYA%YjnfcP6z)`1LBbbn{$w}VXcr|iyz44sH*Dbr?EHw@={Kr z7P#-){f1c_`7n`tW#laF_obhPYUyumB?v^7w!rftwaVM&#Kx|!tqz#12VeQ=j9p;0 z74}5$;}e8H_nK}!Ew9wrQaeF}l8uAQ@M^ikNww!X#3H;xg^2!3Cqm~#Beyjn&#BV? zl(6j|4oWdFGlgB_;App4HFWYPs)i;9Kf_S1r_feVnm@PgfwQagqn{(jZ<2*vMS&tR z)UvWt8UP{2d?1%udCN@f)lilcPnz^AaL5X7Uygo8=x#U= z?d*L)ShOnj0Z<-X@*i7WZoxcD*%vmZcGg$-NHu`_Rl4yr(()x6z_e5Om&K9yVJi4pOD2PjRX zsSmV9Z#Dcmr!&0z)}9}V5i?tEc;^1U@an@!bJO>&dZXB0wERpliLb)^yIk@+e^n63 zRfiPG!9@XXfHs=-lev;^FQl$tq%YLq)HMKS@+d`sZ!&g^;4`mYgX)><_nSJtTfAdd zk#{`IQ2pmG`(9C)1N-yu^MB+Knh-)1y`V+@k*_9&^v^;c`@9Ag#@|Qr|CbC!aqcgw z2N@Rs?)LVtH@QS+|84$q>pC=-J423GTy;bDg-Xs&>H}ewUES{$4zxU5S4&? z^zZocG3QY3G8P2|1sK1RD1p7|+ZOitE|47^AJ?YE$uUDj5E}m_l4 zMt`=+XSeXbQX9Ua5QgRPZt*sG!DrHdyV6Ta%8~Fa&(tDg7wDGiv&8l$v5Ow?r!=ur z+Mo3R;KBn*Ec4}DuN9ANo+N~8o)@RIL+!}K|Am&I8g)rMH}ZocmN~)L)~uuZdPTkx z=4j)SXDx6sum%V7ZkBI(k^>3%Ci||3CcG${PH0Fg=dr zvPl=Aq@-4G9bqBM%cYR`x{wELKGN&X?dTW%wMS*7#TY|hupg`Kz91lwQ#vTp!EcuN#%il6aJE6 z=6YyRe#)eOu6+A;AoQW?z0Ir)+5W=?*aIE-20y<`fCm$JY`Q*5O8~KMkARiw!2>N$ zSKv;m%GLikpNU;sT4L4VjE%R2=6==7w_9(xm>|CZT-eS$wRdT!*Whk@&yV7=FGP<_ zMD!F~H|c_xyD1X&uAAwZJ^KGdCJH!C8&NwryXaP!v(%qVpWeQObPMT%do!!?a+(PH zz+Ulcy56fH?-;OHs4D2Dk4YW5Xd-`rW#b<+xI}-Pkh*4mG0y#wgd0OfXwQe z-z=Fq%f|VicmxI%818?$j%abki zwGq9B)h!shew3r3*Z#vs=$ESpWGHH}AGEDfXJV87IA$|)rbX5iqk>a5VCX{0bR zG5?z6uz$SLm7mYW6tjLXHCbg?@AmdeT2@BAo_>y*A`!@W6)RiO5}dA!QGo0acE!tY z)l^#a4lJ>pHn)tugghW=_s^7!YO~%@ZzZTf zzg9;_$I8lT$PlOuAP>90y$u$*N@3s}4Kj;g^7A1`)v4vF=RTn32Z3x!Nu;G~doK`U z2A`#BT^2kvXJ_Y)jSV2jsP@pfmn%qs#T77rKo%M3Ft|84a1`lqo`R_Cm?2sqHE>)& zmiqqvto(dgaq(vOO=DwP)DhXb>lvV;2$p}x$H#DAWhm#sP6TS&{QQ2}lUqV53KFQO zsC|8XU0y008a&+GAQ5l2$$^beNC@6ARr&e(AfL@;IhbuPgpIwhv;<1>QNeZf^M7 zgQWCj^a+ype+6n9R#$SzD=c@;Pu{|oyT|KP<~1>#%wIO7szsx&tIKXREH|bCV1UC-`Ux8z>IZysx;9Vy|WfzTAEM8m*ri<2?b}o3tPj~&do%8E>T@anLaA}#SRR)Maa?w!CZ%g$za@aLhY z&xF-q*YE`93n1DcS(B6wdS5bHTEu(lWo4>z1?Mra+c-41xtQ(B$jQjOmU_s5=C`y5 zkrF(N!Kn)#92}ekPK({sW*;RbC3W?f#ztWsmcIUeqf!tu1%+*3HA&DCyoKuk%);OS zFV{Tvg1b;tL`cxac7pgg2M0%pG;|7x&jDPls^SHUwxNiv&)_EjzG?7jsbQL(Fht_^ z?c3l22O`@R{hvd^!q9;UN&W0uCn#pZ*-+PZ0MA=I7&gE%W3^P#HgXXxo;*mHu-8+SWwjv$7@Oa zOMku@jf4e!UgZ#4&WBAkZ%kiFM1>S%tGxV$g>w9Y^*BXntJ3{s3uZtj_nClp@CIYO zjhuwI{@h|$@y9*Gv3K5Lj+f_q&znCjbxWw#v(&{r$P%;FXi}0Q9|?nY~W;Eu^KT!DRqg zQaWYk-|ljAaJ+r@&hzrTS}g5(!_o^ukHdGtv^Y;eepf~&H1Np@-U0*+D5P6pW<-`2 zcze9OaWH!C?#|E4n+?A=x&s0bs9AHcuz(3AH1xtACxgd;&q4=&hBBBfh%e5{hWSJK zu>gz{sJuY=pM=Zud)+fpQBiyQZMgSY3>qdgo)I2s%pl_QfhPnwFv4zWeuHi`nEh>T z2l!O*L$Ce)ftuBf;XwiU0%+a+-Ar9NU_bzbF+q_026iEPysU;sY%p9u9|he$L`A{= zQWHj<13n=*J2D{T%EJuHPv58i(y^hAds9pbxh@j33A4{mzZ|As^d#1`Og@Hsy?de6KTXLqbN6CC`i zE_Mq*o-22CDJg;bJh8zJd%GqjyA*G7ckiINtWN_U3mCL@rY~gV(9r>qxE{d-GEH+- z{9fHe8Rt)*lTYE_EN1fxG60<@AW3ueTCemts|O8pMGeBd%zqEI&I5k%wtemPT}`iL z8>IB%Y)42B7U~JOU~+SDalyq9FY5xNsu#T<>FDV}kR3N7EsaX$!>gUy+XDU~IjV5r zcV7ugNwxj+&p)twBX2R_U)Bjef-f9BwT6ZU=%Sh34R3?D^`UbC3|ecxRx6-YYS!0`UP{1Xc$hTyZNiMuX~kS!yaJGxG+}31y30Vef(A zrLeHDkkItE-wVw|G(fwJM}p~?bIj~vG9ir?zm}yvcc(Sa?e^j?!3-74B1PTWM&{CV z%ykKOmvtJ%LW4)iBey;mvXDa`CfbT;b}r>nqEy{)FKH>A#Nd+BQuO`KCB;9`9q2{B zQB80_`}^6;UCUh7(^? zq;6b1eOWxSxp8!O;AV3DqPB$KE?IgZgjpweDZi zZ4wC+JG)+0&JU4H7I}-mfA6?M*+PEp!vfY3Nl$Ox@cTMF{gKg|JaaLUobVr>t^&wv>D zq@{&~WHN=e$npQc>rGIh(SE6a%g>fE$Lfa>Gv$ICryDLWo*DEYkYsov123&%x%L|FmiVS#+ zXI)y_+T6C2aTg_dKnGf}O&zxvjgF7kvbJ6aX5moSmHF z@Co2GAR!@L-$(K4ch(Q$Ed%}h{8m@*BBk_>3=Vcdyy;n#=U&`9iSD@#prf%F8nhK0 z9j}e8fWDPn00ikq_R^a90|?PSe<~i>oyv=)ed#wsQ~}p#JlOVKRzQ|U#w3SxOD!Ov zbAXqb=3ij5Fi?t^D+WPn{EOb?vea1p7Nx=0%JK>z8uS2s=DnIEL2WTyhV43ORpY!e zzeK_7+E)S;kq#4nEv+%YUULPs8f-z0vPZtWTUHL*V{qa(g`EZmriQ>QT%ZuFRe7@w zwl-=H(E`P!kk0}>&&%m}0l~%Sly|Ub&d}~f?XRPSW~3t?b~b7Gr$c>xhxSZGL7`95 zAKlu0*~kjL~dW{T{O| zhrWQ!U)RXGAi2Ur0xNTKuu|35(Q$0(x>nxTewKS^s@fvU0&1S%C~6cV7?+SR-RL9y z_;Iq$+E+ZXI13CjGc&lFAlH=bqq??o2Sr8jI6uxhlRTxvG`KA4k}6TE&P%>hU3v2t>F zlVf9JUHu<+BN2soJ6VFNFFN9-1p?bTkkoM^!oxB5 zWMQ5FlUz_!S9cP`gn_GX=37(a4wZ(RAo)P85`CoeN`GK5T=?MN3l$2CC$#Hs_h&o< zgNoJF)#wJYW>{#Oqp#NSIaygFIVyCRM6CLCydH-S>&Mad<)C~3>l5sana0MlvVFN) zjn?nq+0ZHDF|P=^vigUHHh|%M&9Ml=AcNZt@(nWrbu1{>w|3bj0vB0K#P;F#{KGPEM07KDISNSvffn z1y)yA2alFFZ;(pk#GE&f9LXFV_aMi4vV8t#vn~GEk$-mc5;&Q-sir6fB^XC1d9FM+M>Y5{`N2# zF0#(f&TIBP?EJV6l;**~sCY|kA|m)o?U$yJA3lH=*L44!D0f$VseYayt6^+2K=y>=+b;rJVl3&}m5Ews8k1 zFxbW}bT`hvUZr)S!%gy*fEo5SL}sx+k7|)*k&X55g#~9AIf7{OES3c|P%J|F8Z`lV zVw@1@=26_cm(PE^0S-$G4sKvX1%oIxHT>ai#<`f_cKIXR z6tD3pcyfy|Jvs`!C8(9aRW3!y>lD&%=w3i`CPLZ-N?I$c&V3yHZE;>@u#uc&|v4;eeHWSaCe@xK!hSvt! zNPPSgDJgjEK!AFhp$y}0FJ3J1*!<1`CniHfKd*mhjvC17MvrNY{bd?rk&f5F01sH! zO#k-8y)FRZRpVju%XQ>A?^_z@B)b0ozesmJo{_T~ea!GKG^l1eVI)rtWz#VmA0K!4 z!=8ff9~q!8S2Qqx2S-Ve9MkGQe+!#||Lavd80`gT!?+SoNI>G>HT7Lx*0G~Sy}Ai9 z4?vtzkd}TmV4HCL$KaPS!!J_I%#c(tl;`5rp8U z5EN}L$V-HZKKqh-`L}lw{mZQoVqFL5V`%tH<6baBC2h(d0UZQi1^;X8gJSNb>|{?p zGPzJF=o$BqjO@XX2X}U3W+syBWE=2GCs%9FzV;MMem|>*X`7Wj!W6*}R)(mx)eha{ zdmz|t4E;i~qiKSxoh4{LsnJ01I+4TcgXO&cT~fXZNSXlYT%u=`@rl@3n~(1#=zhc_ zu5$e@e2Xxz2eLLC{#-hO7sI=l3AmyXITpQH-CDm^=Xnj!%^_OEMV(V}>QXB$y+89Q zai3ZQ+Yndtk?}06`^D1W&IoPrk1;Xyu9L|BnNB%gA@roc38@h;NC1{LpKh_G9`wl{ zPw6qe|AUIN;)P;tDJo|_Y^N+H2q_N+Ws3nAZ-$StX83~xOJ`q|CJ{v5A~&`&~dDq_@a zkUeb6LM@~-O0(ol^a%-LCsC_MGS&9}QZ#;b2BtTY0_(R9FBDakc3O#Kcu~u3=dR`M zpv0sh!Zw!?69!Nao{4eW4{W6?GUB7%4%cwgNrGYAd&17#n?Ha)s0=l?@C92}?i)Jn zliRmG9^F}lQ!b zg@gkjSi{^gx9!+R(CT>g++aq}!_`&~%r`pkGB7+`7j~LIek5FBaiZUQ2wD^$Q&JkO z`*brOuKnM(?Sq#A5C`BM%;|qPnH1=_1A;FlCns{fD}usFD!mUJgu;284`0JLRQw(R zZbV+`T*(v15C*D87BC$Q;-_K}U)%;-h2IlV1EIa0m6DB;ZMpKL@WsJVYjAdu|LM`@ z#-3iw(I46pqsEC{mttJTJHfQN5;5#531T;8w+p+LjF!+ZG^SdpG8wN0h!7e~{wMVc z8g1#}qB$i^hME2FB3=FO-Ppij9^SFn;dE{N5Lmjfn=X8*-I+-)^qvopl1bu7%+0ZB z*atw9?@6kxGTqBO^WiwNjNp<(#g9TJN zX{Y1Lt{S%okYk0yHCFJWK0j0e%1($mWWrZ%(_U|+l$-(hbFDDb;jYJ0ek$hfE3*8A zQba6*@wIRIb40|9Y~SaiqQZ*b(b73Ho?>#LQr3@fiakZ4tKYIM8Dl>>dt_J|A3*(@ zdCBXz*s%v{3Q?oQ^?KJ5yP2`-`-liK&pN%&-MWusrF00wM{B$^EVRZx1n!L#>JGE; zulg$pH6}({dCB%9l#}{s9Zh__d}-i)`J>ZVlAetBd|~8V{vRpaqYMMq8@|=0W+2_M z`-yK0QN+!y<((D<8j;zzI=(HrM28)R4%cTs73<21nw+lFOKDW16g}Qqz>1FH6+@v4 zz&h>xC5#3~MuQk6oyghvx2jNTOUEAf0~C zmIyuR8$f)nqdr?I^tgH?eCj2FFa4%%>5QAl4$m`8a{lpxXKjcug;`szUE+`QT}vOl zpiO$(?&R*flY$bcEd5>{YxwWb6w>qcarDGyP}({(?9C(xY3-`0B=*_rghzLVkeZ`H zijYouZX($AW(Ed6A?2~#8k!?UP;6h|cv069?Z)|1f#05i>+vT&r?vES90Yr3=S5}o znxv!}lRi&j3On0Usga&DA7LY6@t4c(J1%_%)uju34(sy~#`l>MBd3XGYL_@%EGJOs z+E^}KES%P2I=%G=1b?Ooh`%3{JRPr!l@OyssAKb7uHK8~wh2oSG_1=&KwxCbZK6m1V)KjwolNlSL}^aOJ3|oSKtnK!Xm@bmsXfBJu_d3<6lVL%_8pNF(U%FVW#N#qAdSPM~+&vM@0-mFe>c zj(MM&!y0dhr{7D|)+gjxr-aAcrgEf9!IT1x@E#_3rS9&B_z91^{8eUyTkfExIqNqw z=ejjf&a)HvTRaFvURiJaYSA3T5!LzK;YrU9V>bH_u9!A2(o4z2yB?=V}o72ZT;|`!7x5Hn<0)n{_E!-Ronb%qGe874nx<-N}0WncB8G}ulxJo(2Cidj(r6i zC23OEb_ID&4@#Tn!4;J4k8a=K!j+~|UNeeTMny0+UEnV47jSjF4)ZY|(}q@w-t?_F zP1U&EK=2UYLYODSJJmd3f0cA^O^~-Vq*lj%&-Vfu^Q?h$b@Yb{THv{N?;F^|m))Kx zfRZm$jCi!>V;a@CIy-%-eBZg?>@ATS)xn-uh!$iOJ35}5?_W`oix$?(-=B&W#=X%o zWPE>3u(R}YS(FFVSQ-5Zx7lGyr~-b@+(^U_(Q2=kWzBy?_*vPQF5_YQ`q$L^L-+{g zjpvYyAr4F5C9&lGnQO#Q-Ksy;>EafPNLTHtHOPwRYTwN_jVty9)HCW z`H!9DF0;LG;iC5_clcf{o9k{7t+fWI=an-CeCTHvC?Ds)fl$GSj}R3bE5JW^R{_Cy zHxw;n_ILPvRHt=~leJy^KTS##;|{F$oFspjqOh2iHiyX!)7x^IZ_H^4&+6we$mF6( zTW5Df55G5}6nRj<64XIG{5dP?cIxx|^e4nlYfS6AFJy1891)ZF!Gioc#hA&=cPk-7 zmInZ}{2OI#C&DiW8B5j9_T}stqhb^U_EOv3P>SR+>z*o??h?1nrWOc+$~m+GXBCp4 z$R1gLDUHOX`fklVQ|FwRM-}kBbzfT0o`LysbIF{z^Xh0}N$&3c*k0@hm6VnKkQDDY z^u&tjnCQl<&9a8#dIGP5fBFo?BR`WfiIHzPqm_Y+&~+26uTz zmN7bs-*Fn}>C;+eEiHT!922$M2$XneL~n@hB0Zz!q+LD@lO=p{-<3zBlOn#W)$;!J z5u)06wXCBdV+dReSq~}dRx^zfPWKZR%}qDrBRY^(BOZ!Hu(C}3z%?+DwW2U(u}@mo ztn*Idy+JG zGt;2Bvh%bnB8z92J`8QHyT)*4E}JGK`k<6#M9I zg`#z576{~T?WK^iZ!0@=bYU(YY~bP&lha28zkMdNHTlC0qG)+gVW%YH#$dygLY}v? zqciGuk=~QnSz@26KPXMyQewoHo1C&WF)KK;=|nCyYd7KkBqihu3$E5^`)Z+u&@vRo zv+j9cu%UkjcR%xl%OWA3wt9XU=&i8crKmCL){clxK%h0+ft$RZ zXKC)RuK)rqVyd2#l|nduidXUHviz>noVK9S8H?FXGrrd?sfb>t>|-%DJA7_#mO2x* z$pQ`bDID?pt;cjTEM5oQl{C%GLhe^kGi{{brYO=ZJ@hf~{!}!aXERiwEwQcMEpnaF zi22Zbh)_!)WlR#g3nJmvFG^zXZ=QhDa4La;+aauTM6 zWcrvbF7J$>vFMF_n^)qpFbk=T3;f>@cK(T*I^{LoX9caJB^6@UC(kaDJ zH?{u3&^dp96;<_2{w~>2^QW7_edfBgANkx)yHb2KXIFPq+iWhW-o|)p6ckkmj^kc` z9h8eO=qMbgoz=b+xWe{X@Xl_%l;bhXmX;^N=34oti=Iy$fMb7`_Txs}S54~DA`2uG zy6;)IFYo&9zjC)>t#?jZWy+S8tP>Cu$)_~IikJ{SAD%Kv4P3D|z3;*7H#F}%CP9Zb zi!JvWnXRGspRC8M&8hwZFR~?2&2AP9|1;3p3 z3Z~a$lO`~U2CMdSWuxP%ZyDCuut6Sb(?_Hx?X@tz`XGn2jOLzW?=U!_|;y8GGI z&@TCT{WwROKXLg8O+k21iT%>u$GgJZOM=c;qJk4Rk`m>C_H-Z3C^%fb!Yy`Qr(OyO z(Q#X%tTNfZO=S;~;&l%A=>y5ffO$C~YZfipvDfsZ);Z^&L`uv@-q?=c9tDy5R^SJV z@tA`+a{9j2disEB#D;H)#Ku&MWj>SA?@tjHkvD*wbU$>4cf9+R8kTaSqy zii!}In?@ZJYW=m9-0Ak$V3FT<1OBmO#`|14g#U|3F)M{i-FJ)QyXI5t!SbadrnJD7 zLF-hP>30Rlnm(N3bj;E>z4+8>{OVbM_n;$`1rDa(&R|0DYhoIF@DKJFLWZK6%-bUW z;?Q!Nj_kx?K0L8yiiO#Q`6mWmFRbzsj>oIEe?Ipn`Lk2fgtPj1$WRav(})6;8L@Cl zxv-y}&=E*J#{1ltv}bKWf9v~&-}{>gcrW_%#RsP`o8GV&rcF{~NYDljvvR0q47SF6 zq5nznb3nKxL#u2~wUzlDf`~VXTvAI-%u~I}^a#Pm)OuBfpQbgSvhUGKev?{ipT#WDr?K`arlCJ3x{hZq`!N8IQ`H%EZTmD@bJ*0Vn*YJ z2L%#>a%D*@&ll55I9HqBPutjj_dY^*ynlp)=aPYbv``tQrW(sA%r8|V}jnM{X z;nM)wdlB2xAIVc;9i3-)<3z@7Th{<@_QNU&J0D`Zh7` zFH@`QAatMM1Ts~B34MHVvnrtPm-qM7z;$Em%_k0Lx0pWoiQGsKbT=1DbVjKYz-=U# zh(xwX{HCe4x1x!Qr{^bd|6A%!gsKD)R|TG8NqPso2*w`=wC+yWOiB^kOO!|K@D>OR zvX~8UM%^MNvX)y6EKbMfPQkH+B*+=J-=k-JQ=6X_6&C340}g4SW@JM@rq#}pUoW`oF|_QimI_>H2ROA zX^Hv>GK`eOJQ?%ar?UH20oYiv_GS~W+`aKh`F117H~jwnn#+x!ceu%J8Ra_NRH4)S z=;J0lC>y5soEvNSyzLD1rbJNKpzD?Ty}wj?LZ)cLxY{+A0o9bae97yKBET=xhNu!n zJLxG0W?u(R1zU27q;^5QhRD}%;i#ly)`J0D;`;1Eu@V3Hy_>`)qGA)9CFzjHvrhKE zf#6#ly1JXADo6e1PW9!p=l6D28Ezp+qTutH4d3lP!%ho8@GU^*Toe7k^9A44Qt~N+ z$RN}6t!G4t=3MieS~6M;(rHqJB?!-RGf&a784HbDIl(g0~_)-WW4{2_o za;f1satWrUQI;BuA*)nMR~1uql;q@~Eqhs!(nq~+x=lpYN8nqCQZ)g3S8?(K#47l- z-CVJ{$fN?#s@2xM?MmY97JZQ->?1wX%3%(kS5&(pS+Dj0F)b<-|E_&AbuL4va!vw{ zXtyl7Bnmoz?W1H}9gwi_MH8mI{Ge1oltB-=~qQx_B5b8Ncz z1T<~NA%e9s9^+;&d z>qrpINAUaZ@GhaV6-8uI_7-*jg*bgGCe^JjdWPC3-9uaoGk-G>6sp1OLAMV^pXl&# zBVLEjN3jLi97~cTh|u0FI+Pt{Yb||DQ*vVL+J|xZ+093}z^`-7Vw~GipPjkuIR|E` z6hT7y?Ln^BRRK5=?_`D))#M#nid*72S);p0^&ExmxFIy*hl(!9OK>Z`j9t_>3sXbq zc}j$6(f=VrKtxh-QV20YuwB7;phBh8&j1xc4E0qReWs_Q!_9TC9McXFFK$b7oR(!Y3pb2tf!C(1-~1mW zNxxOP;mGx4w0kr02S4{GYGOP+;{((0jf4Y+p(18dU6QldPfES-zla^E&FXGtw9KcL zKnS3sCbh?)y7B0citV|c9H=6QIK@sOB4mK2dKR(H5D96cn+V*9~5*M#W6yp5n5MJSY zo3G4dG(qn^xGLgM?N4${0M%%BUM$qNdo(o!>x0T1UC`bndYkF091~S?-V9 z{_oYJUsoq65_~T?b79E;K^F3i;UxzBVZ%F3L>xMc@i(YsO%m@-CYw+Z*ls9RVF^%B zt6_(HsH&t)6AvDb+*y&Bq#+KxQ+z-xhMM+}my_o5(L0@6b7SvcqS1Ei5NwQqN-iyi#E#QKqnql(=l?BLangeu)jeSs?b&1!*|E~!yZ7gX8u%57A8BZ( zc_=qJM0Ty;Bb3tduEPFFQ1Zh2vjpr?{Lr;SLKOH|D@YiZ5<|C$-YBBEqYo|i<>DCS z=eqTn%4NJ8<@IffA0HK3)x|f)UuI(XB9V^}@*#yQQN%#{YItyg>=BY68c`g-^cFF6r71-QJr+z_EwV4$un zsYV#Wf8&Q&VOCj-lC&E82Q!m#nw;AVQV;a~1DUZ_OOqI+Adogmer7No$235XmcAP< zCoY$s{)+2u-IpS9{0@KB?Jd91b8aIJQW6ppkDG#5NEGr*v9^~aZv2}hhcD&jzvE3# z2aX@huDsl6;jewiCT1l1lwf9(4ILrJW@Nl=-}}2bi?)e3`j)*|9GWIk%FhTJ0_4u5$4gMOqHv-sm2T;+6M z*UM>~;)rW>9=#$45?>FFNjWdS!T*qSJ{Nw8>L>ZplYh4XUnEd^-kk5}+6PbB#f{r# z-xr9`5D#u~q^!{{cVxD`xrZ`W;>v9%5s5t(yVlP3D(g~Mg1*n)5Oy)S{O!jL;$1u# z3jSpLxL9Y!ZZ7BixrL#WwZVJ+cYfLZ3!2MqCN}gGl}kQ|dl(Wr;z*4B^jnbdIRsCEs#&0XE8gEsn9Aq; zOUo3ns(sPy6{#HwZl(-`-Wg1x6MI%^_;~OM+Jjr!8KVel-jD~Ga3tSDfBQk_1HQ@i zgga*+#gj{eK2h?YjCvG;mJw_1$)cmqSr3$V?GFm26NHMPN&&~_T|#?#NjwUns*9P~ zxN-|q4pNPX_KsrX7r}6BEt!ux&$XDUI&1ljteF|nVcOc=Uc5pn54G8-e3X9U$^uGE zu;XQ3A2N$p_EwMV-9PsxDIFsYms3o^D)_#`)C*%`BkZs0wuwY!2p<9yT`4kj|4v*9 z?z?-N#2E+ixA<0S6)#Rjb*Y(rudj^=RR!t~G>^7197h8dm4x}&Vm6&po%-#07YMZE zN|L@}yCtk$zy@VKvwVuP(}ThgNo?$ZZmkLs;b~z#GjwuXxo?<0*0C_VVG!Y_E-*2< z?;ES^wxVPBchc-}yn^yH)!pKI1T;pwU-yWWh~H(7Wo7*m|C`k(W`ZB&G~=FN zo!z;T<^Ix9Cxd{VLwvGR5&IY^F*CO|A+XgZ@cif8QQLsr(rw9G7SgZPtkfGdi+@J?)6_8{_W^W8)Dz?UiRa;yT@vXHb;<^6jQXoB7XYaoTZcG75A!L-e93}*G6__%B-tK9}l56zIc zsQOn^U%obYwP$4kN1L4AS~7X4s=5+~d~n)@pmp-gM54->3oq}G9@iC&qhNAD>fZX> zh?Vk_9@ zVgSSIsZ`y->VC07&DnZ?;)>2vdwbSGwg<1noD$SKos532&THG)Li=lDk~?3kaxY!E zo|2cCf^_G5&TSRT4}Y_3ipz1hIE2q(m7CIYJYuPuW_=w zq~o!>9+imJ5J_H*ODXtJf6g=r_u$I=r^wqc7aol=vIYW99ex%*enpIU)`X%`&IXoy zmF`l;lHZjp7&oKBCGWpMR9GR4M$I<*3kCC|>3BH>sgN_fjTpTAyw0x93X;O8-@Bpx zMcg`+OUpA>&?5`AjJh3|HYJ#d=GEU{WX!(Ab!f?DxM&BeLlqZ?js~6;N4v5$wF1@l z>m|@PU}Oz4xOE8;{s*_$wC^9%p$FgL*2T`Pkb=bvCcohL<>AWYeO}c9CeungAAH}} zm(JpF$T?=RHzUushD0)zc2<3*nL6rtR*qfw?Y{rWr>zyrbKdm={y&rI(NMXRXDr`w z;Ml!O4d}AtRXOMOY2h9UwtF7JO+GYVq*T-XW^qQSAl z(2Jd^Huz`%lpaeiU2JO7c>usZ?7`*9FZPK$|)n$DGK zl=d6R9S()YipK81A%bnL@_Tys7mY##^B0GCFwp93mO=L8sXCgQAO2j_;jX*;gcPOQ z&S=Js#xL7e0x<^p|19ZEzrz&$ex^EJ4o#i;xC=n0u6{%v2u zSaG;`RQT^6zb~eTF5T(>qf1BE2Q9SM-k5eqcg#oaZ0rgoxxA`Hhmm$%fJn5^nu_D! z+-0q!=* zWY^I9RUWIcQh)X8*Sop=jX%R-%Gwep*LD&gVj;OH*; z$^O-A*E1&3zQ*JSFW8GYJ?QAqS<|RVYebhh{T`|~Kt@hh0oA1kzik{H%R6(-qy~~+ z23wR4{fposuLscJ(3k#jrG+fIY$fLX69*63f_Vf&CMf7{Ka7z{%5hUl!0xw`j0KAn zeMeEG5_F+P0v0VNYTR2o@!Z^NS_8?+Cu+I{9o$KCi4lV)8rl=zr?iuYR8*AP%*-l& z*5Db$N-si-F;}g;Poc&2vaifbV^a;oG_TxTW`q$(tgBk8y^6W1sk7KJyB7ah#hb1> z^DU3A^SaCp2C!aVnu9)LSA6+bkz{#>n;=b2hBB)kJ6qi`S?QY*3H1Pa!jreqv^hOM zHcQd}e$-(aBKIIdvc3JNXVGcPSlCNEnVE(DHcyR1(lzhzGwaIL;w_^5l7Fv14JkQ~~Ov+`yWHRihqN5+b@WmtHG0Z&IP^kfpa2157ERvwzS`$Xxu%|_YZnRdTu z+^ko3s<%cXi+O>8AR;2gbmd=lGP1IjL}s!tG3j)iy11e}ma#~%zioL%QzIg)rsfBq z!k^BZa|V=nmgJ6vtCq`rF&YYDey>OaH@M_d0TNxJE55- z6;I3HTOGKsrx1%1 zmwty%H3H!&tn>D<)k-I?_QYgYseLvvqe?y_1IuD6#a(KF``oM-!|VK!KjF%iBx$%2 zRM4?Ty_cd@Tz?b;iyIsJ>YR3mnb}yGvHM$a>8M5w z9DM($SD#}J^s^H)AN?viW!K{K*q?lKNpH@ywCCq#ujmaeZu7~IsHlrMY)-rcBe~%& zv-rIJBINu!eaN%Av)9gq+#}EmyX{-^Xz@K|Wd0{CZ0Kb#nK-OV13K$<(syw0RXZ8T z0z$)3;?7p@K-rAe67h}KR8P7LJ&%ykgA){(V6=}IVK0XKWk&Ge(!ZXE{NL4LNH6v% zxA36*;QP&QV>IX#eQCMdAUUbQ)f!BGW>&A7E%50US4u{O-9}AMrvcX^rr+M9n>9k2 z2JK!-3;>#mM7}mN1;lO+V&2%vnzv1E@)XrDY>vrZIq$(6T zpLWm95k&kMa&8jvpVvUu%YsXe^WIUWw1#8!3)=UZv!f+#TS?wIj!Vv#CmH~lN3D#f zE)WrISXdBhyT_QmMtF&^=#FMnTAhiR)Zf$|?~`C#Ojo*|OdMO*qrSKj7;Z*yKt7?0>cZPy z9DeaE=FxU(F24gru2N8M|5dks6eX@f`F0luHp4SsIGR&;e=Lx3IER^@S&`v)7dkp$ zNwyZv&A)>xNb$EZ_Tk>M8z;paq=5ke*uozZ-eG5ssQVo4CgY68MiemUN{Oq{3d_rW z9dmrMoIycBesp!OwJZKGMl$sa9}>r7&U%65X5HRO+_dMuFl*0P1o_|NZZD;Ryu2YY z8}ol%st069FZ`1p(q+O%!Msan`qu(J_Gne?jn?p@ni9p2(f*w*SiPh%;V0S07TO;A z%0qa9;2+a+PCbEl)DX42d7d3ntH_tk@{f3_5#Ucv&s zSvQa6tJc;IW3~2z!XN)8sOLDhJP`jK2JuCfpErcy{(VdMNABJugU(wXSg(e%lu^B5 zUibcd#^0wViKlpYCVBjR{yh!-zdun8R;W7OPS9>evvPU=6eu|$@4xRNSWX`ynJyit zQhxb=pK%hbT52*B{ZKc-1fHAX{a!s67YnPvOuY*4e;?fI**~zs^H}!|vOu>rs3VG1 zLxK-PDS#Nc0URX`)`0)}9<9R_vACMD-vPW$AfJ8Rk{R!RSb(9402B(vX*#SrC!n6| z07&QwQvieD1Q>x4lM+L&#!+w?M4g$LSF*CQ9^Y8BM?ozgFfPD#SXKGocNM|wgZKXe z{DEz1&DJORBU1N6K`TFz&z=D=-!IV-`E@5*AY5Zo3XEKdATkj8yTxws=>_fl$l1M^ z7ioalh7a)gmUp5Lh;a)G3l$oyv#u0^hyQh2@Lg;YX7VQj3y}?tt2_Yy-rJl`)B#{2 zfxj3-gk-7$@DjbeyoeZ8$ON3&SXgios*!?r%e|>mQCV48WMpJj_N$AVn?38PLnefT zgqA?F=K=-4c!^*N_l5Qd(2cG;S;^LXE0cb@)4`hlBIcXi1E7=w(4Xw)O*`+!BcLXN;E#Xv8;gAR(*vz~4=pBQZp*0}5Ran{!9oDfg6PJL5O^de z%F^RtVF8Vd$|py)5QqYLz*D{S_AA^nU@rdEJe(7I{ThU&_6`q&0|T#ko#>OWXtI$8 z0$~;4U2$>Y;dX}`S^y)sb?aBLp{&2yB?R!oIO4i!!;oX8rf~Kd8sY>(UaEpMC4LfJ zN4JWaT58lNDz4@BzdN+Y`b~xYD5-VmR~+s>KQ8LyDM&p5#U98{0MhsQ3|~d7)@8qP zDM2xNXe3W-yhy(zfVJ)?xj8`BsY8qgGvpOAODZZ<@8WL-D~|xxWpWZEZ_ex^^|`@I z!fdptJDy)Qn(e#Zqg?IU6EJZg=L0`3^YJoX9-bFpc>44n0SKLrmexiK9q~+3lJwyl zpXzE?fIorP0#Gx4fggzVe2e>bGl{70^}^1$&m9YbE_;B&8!{=aKR;Oo9xy=sSEJOF zl$CR}s>{Gt#Tx^se{~;*dlJ+){zy!(Wh$lv5Z`rw)N&Uwl@EuAX=XfV&7nb*3<|ffB@Rj(?j|2&1I^~2rwKeu$~u}8ld9f7@V9W zN9a9LD>mo?j|%lt6a9T$P5}Xd3KEmjv7Vm%uV24fBy0lB1L&ITu$N=;z2UC>BH z0ws-~hX>)6oU98J2ZR?s0Vyen_-IdUUY-1$Svv7)j zq{t&+NztCi{8wKz;YcAUR8O@kc^Tk?cU*+(c01KW$IPv3uk1vjKL zWnywtHcsl<^&ap^q%`jn08v?uD;JbhH7l%=zJ0rdC{Z^Dw#G4$JrNO+nx{B0g5@57m_%io z_kJ84`@CnLl)u9|drqCy&^7wKYxFIYZvIZ}voMbSG*O@fdz1SCdm|z$s@!;BQJz8y zQVhDN4tO7#^!cTYr0^Zl{pc=()h@s8`WYTRzPf`kQxuSBu-@ZcnAXC~1EPd4F8Rv( zIt~KJEzZlCJKbSR@>BmdI*9Pe3cExux&Zc5W>7wRh#SSKBjk3(#{GWw`*n;);EDrx z1MxUlMe07mYAxKniU<;5p#fF4a`q}QxKJ8#sB=k4O6G(HH?_58f?7aw-xeXB7*?Sj zF-T$5)YSYr=)hg%RyF7v9p&Zb9x2M~Gb&Nf1zfT6)&K1rO4-n<69=*x$Po#1WdAVY zPyy6N;zt3 zF*4~Lot-J+RTUL*jsb2qx|epou*2G|%|MFwuCA`}aaVYkq&4DoYCsFxWu*25xtMRop8rgHmpw4Ml~Alkq#`K+FYC8epc}y^DzZzio0O zeH+)mT$^w9hWo|YA>uA^0E`g~+*paRZj2(tYLX;5@LCa%msy&bVFMSKjvY*(fXF<1 zrdnopd&B}{@#Qm>0130by=_pe#zg#Q71GhQ?yv+K%{06P@)H;a1$=)6>{*bNKz($9 zB~S;hAD{%_fb37TUmb>hObgzM3fzBEAoNGpdE4I};hP1at&n>Xv@|s2f-XR@!MJ>R zZ*6oS^y&Y$S*K?P4nYC)jg*;N(`=Sg0*I}hojJOVSqxkVZSuJuZ}7051p0_4AB&4(EplVY7H~4~AA!~TWwv`-=Ey0Jv5fBsvbEIQ=pWfu8Z~~G4YX*fiuw73L zr*zl+Wp{K(v)UoIq=WYTEHlf~yah7_krs#KD$b>*^Tt z>@orrMm~P{@Dm+&T@Bv?&_hJ|HkWhpU$tEv(tRtPZp*%&W}bs?Ln zRAxMo26L;1{ePWkp9BgsK2#SlphFW9gkCiuFfsjr^yTX6iuhG#9tWut7&S@LD!RG3 zfvA?58Pm(e@NkYdO<0bOhY&EqLP@8_sStE{fI`k~F>wnP)C*ch28Ov<1(#ajGws9n z3yFp^F#COR?!boe?AeF?>i_NsB)@oh$Sucj;R$^9AmgDuH8mxf3S6U?_X!r@v9xr! zG9*PCmZ_A5OU{>)lA`Kx6$i)O(Ge37^I|whtr!I05Hks+4?>>#h$LlaXUE0eL1@-E z^))u$6A;j3BCf8g5*HVzrK8gb^8R0XDQM2qKf9UIXLKC{edJyNkoPijax@EGy`}k4 zWCp?wTJzlMb=g3Xh7av`qJHMlcCTtq|1Amg*cLV%Q! z#bnj~WfJoLTl(ktW_$wnF12-Y6uBy<@o#SZxz#{KtgNhbsXYg;Fw(%5|5vmea>+jd zoe0b6I&%(E91PJv0Qg)CFJfkOsBFT^%0Uw;eE`(W^$iVo55@i$X%b>FT2_+j7{M}z zit4Q^Xas;%jamG9e=2rI5qMOMtnPyv5@bFgdjXbeFC-;T7NT^nV|a@seSpLKRH{&N zUxnwzImo7hVO7fWFqkfAaCRks_(lxUAs|GfHFS69LB@g-{I9JDjUrz?gQW_dv7JV& zB;jZ91{D=s$;FtmI%gX_+_;nq&UT_WLa zk`uZw|DAM(t>7%y>pA^Rsv|1h^0x$aVw0nZ)R6eGhMvoP;qqRYMt_JXvTNWt%Hx@q-`{f{6owMt z!cTI#4{5Dl5mqt^pOl}Jwvx~en~lDxu^nXi2cGS%pVAq$d-iPXqIr%6n1igJoX)$h z=I;(%Ft^Hni4{EbM!)I`=hBfAy>mkZ+iI=j(N&+7lcNc4)BJVSzV+QQmJm&!)U}K= z#r!D4%@10OZ|0ruA9fyz79SjH5GJ|cPMr7>NH;WZup<_mKSZ6iWcWb8lpY!J-Nl=YO+Nf@$5By zS;nJPPniqzo?OxL(n>Co%=8~;`=3K5V@noB(2N2j#w}^rYwaIs*uK;qtn7%#Jl-QE z=XusNh}x=G@vt=>tFnDh-+c0@RCTm-I6D!9k%b;2UVU5KADJuHTd&UT(x+c#ur*oj ze`B^wby3oS^Ebgbp*vN?eojn8l;aRNG$&|$9^K5WcXq@@)4%wsV4%;V%OLFfVN z**0CrqAa6I*YS*QHfsLVYAQV`1j@qaEdiDjCA=JuRvMiXcji2!juTnG@F1DBtxl@h z4eNxXNKnb$@%6oyGx#2RSC7pHA|uVmC)Xuo*3Honhkc3?L9z zJA=q4jR}^cRa%L4JsTgUn>!+-qE`1^wDFT#*#vFAl=tfnXTIlCq#;qWwI4tJHpnY) zS@nxYy}gApHo|FXxv8KpyPDO7@y*(H&2A$h9T8HB`HFyA?6~NG^s_44l6uF(!{jNl zweeG{?ii|5TFv~Qi&2*{nsyx3>&9AmH9J3etdx13-Xk2_T18}a`I6vu9?|Lt!pDj% zXDr1wk7A`h3JKT2L?9M?KT-}1pJoZ@;5d62ba120-HEl;&+T^@SX?Ed4mE$Il!UI{ zJHzbsk3G^XuA?1xtF2kw6B0a}Okb+UE5(bZ;PsF^l9HEs?PnwN{5?+nf2$Mcgi)Li zb{nK!1du|&u^70pi5_34@yHK$_DameOHGhVtGW>vif-=iT;@|;ZolMKXDs8&j*d^% zCC;_aPFn)W&J>;-XV%7(lk~0FVd7GpY^*lhV_&eb%J$5PCb|tgNzXpvptuJ-0TF|{XmnU{wi8J?!zv6#py3wE@qq2pdaRFSi8Bh z(w}A@p8D$C5S!m|<<@w5)Q}98;Ip8-1~Jp6M+mRz`&o`W>^cH?kZ zaj7GTj`oe!QO@q{IQznw*pYozrZ-{;d?fzwY!g0{i@{9=j~K%JH2aw5i2)tuI2;XE z&&^D$CF;hw{q<_siOw)=W=0A1pYMwfSeUsdf8D$L?tsPqoOz2$cG{`(sJ({E67OKW zt7m9HY~$qAt2DAJ$-^DAHa_+UZ8Ww6}8E7Y70Z`Q^- zoMdp;BmWB>$)}3<$aBbrtykVZ)E%)z zbU(3f-mZ3N-KQL6sA{ymCmzq|-eU9lNUQo3k96#teYJ(4>*j~){qL=bYol>n^RkS5 z4(mepEv^Ww<*ktT>O-66W*Qpyskos$#d4KC@|IdIDv;U=nBIJ`vO1ADpF3WzIMB}= zQnJTLLz9}Dtgc3FQ0&~sJ#D`_TK#m@!P{5RbJ?ovlWADn&8ecU!g)I1V6w^NmztY( z=v)?KW}_X{G@QB6caH2)z3{%U?296#t2fW&j_ZoA+UGesrINaTpXcXzhiOlOd*rh> z{T{CT{2K?=6)AcvpAN@LHYZ9Y@?{r2Rg{&l9CkB<3B-h{Wr^9Og^mbyN0APbc7Lv+ zrNv-Ftj@@#h9T3DDCUb%n_pV42R0uU7J5B$TXR{9w8TwkoU zCNe>(10koaJ(X*?>63C6dCy8xQVQ}APxXUZ)%$a)Ob2U|+-A!&Wqsy1ZJb+i*Xd+q z3r?cOPN`*3-IKZMWw*|LU_k}QLaX}It@DZeRjw@)Cpd#lC7#NU<7$oBukjr=21_rF zjdz@oWMx$Fd{f?o@5jt3d|vVf8Z{bReV#qb=mRdBZfz&B5t#-BFEZR4R;liBPyMpz zI9!9Nru^pVnTiNyPo8G$Tf&8##BY}BHxF)PhpO{dq1fL?VS>1@9T}oQd66SW&CKSx zxVT!H@;YVlnZdX6{&{&mTpSaNrI&Kbowa3QW0x92CdMd#46ofU%S;`S%<6#M=I_== zF&ajOv_jexMMW(|2Cg=}***!Zm-cjAJa?~lZQk44-oDLYchom+x*^k(!2f463lP%5 z9~9Wy>eIE9iK)_`=fex8P4D?~b`*A{c-obYugd<(lO%QX@p>Iis8{VaG`wu(v|{8r zi;n?9g!HOs#IyU1BdAB``~LjpmXVUFz>j!+%fs&}HSr;G$aWwym+JcyO}+WFF7(88 z9aSYgdhIgQ5;`WH`|eN_h4cg-xe%XyOLcwT2`?Lf#8e~CPR2Luk5{B5B>Wg}-@Yea zJ6QBok6l=}W7~47Gl2~WtVzSC<;FON$1`WA`|cJ^8AU}lrDMbhnRp>nu3~b&l5(=k zh?7H@^QEr8Kg>=Tzzse-ZN4Fbn2A3$I6ZNqTMHU_xoX&RytVsOr#oJd5I)u2bcMeM zha5Hgi#0gy%~08S15LzFKYX_ z9I>%fZw2H>dK}uT8a-1}J6Wi*9->T{$=>Qg-*{o<#3zoDO$vxB3$({-3>Y-~D`V`o(Wsyj<_ zG}G5_?=eN0Y>C(#O*lgt9^!z&b^*yAB|F`Uw5xxvy%=={x$C~k&kv%! z>2zczfNRQ_%W(VA@VBXHEx%)^@j6pVB6?uqo?eSpG@(uPEKwdqz}`x8SU2MH02hWi;nS!>WzQZD+=8%k}bhXJc2+y_e$*~}77$mYI@`|lRtzC}Cl>hI69 zvc8m3P_R67)w1rm#Z=H$pz+Eb)Xbm%M4<>mLn~r^Qc@BotG8RQ_5#<#B0XprS83r? zw-C?knx`|(gLo!YA8Nh7Qq7*0IaHR%!ZNROyLxqs4Ii=GS3B-??hfToAiehKU6Lfa z_FjzoDz1rzagi#j#%6!F(a+v9Elx7^qsfp>dy2pCxe`AXb)IZ~K`%Z+F54Wo$Y_vE zMI1OdjF+3O4HkN*uJx5#j(|aZF31?dxlqz%EYz}YKzX<`wfq4y^8)EZGFR8?&`<@$ z(T1Nsvqrh;Xw_t%pzEKE%GG^#j;46D#(H4U*iv?Tf4{J_l$_l}&&!kDV)|4o!^7Iz z^?=5Ta|BA>&g|7MdngX4@Xs*q9ZV;)jSW|YFDaa|%RRd+diDkQ`^&xHl7cS3(F=f*eI zFSD6KMnCRy(c4w)Q2YGGJ)O_M%u-G?GS9fG{wY*JX zOaSf#a3*od*uKgj&-C>t_smw3l!o1io?~6TdacS~9;5vD1CT$Ust(+}L)!beE)ES- z?pH%@%x+ke>KH68EUnr_e1B3pt?cXTgQ{|f*B|I8&Ri%}Vt|74gz4MIY{%@p20s3`Z>E-~(gwC_YLy~Xmn$f>sJw%k3fMq^&3>sPxK2??s9y2V&u^-x)F7Cq3W0 zhL{nzwR(^`fe7T*zH`xHI*&Fp8MCR8kF+|p_(L|ek~0@>KAhU2Jgk=Mv0L5gtC0oc zL$cd9>I^MKqFCZ9dICt(LsyELqh31w)Us5XP>(OPe=&1c`^lNilcc)Kh~GG+h>AkI zrzZs3Uo@N)MtfO;MOZ?gi29lL9>n>Nv|DzY9JgSjaf*5%9yeg+NO~ds_t!`vtxIOI zRU138R8TQgnNT0}ppCK*3~? z_^3a6CDCoLn#9wI&D0>*@)2bxlz>E4D7Ihlcw-7xgZ#vk9^51I-AHTJdcF8Zw@m7` zt0@aJX1Uwjx&i~%Ypn+&|0G?_%{Jdp-M4-T)z+(`>}6y&y4EyAl6qa9UJW=uo2xrN zIBm0(`BiJUxqE0JC@1Oe?(SeVE9}*%_Xy2vzX`;~QKKklZcBsw@uTt2OX79x>+9bS z7s;(C+yrSteT5fwb#Jxw^CP@ch0lL4wbln(TNSV}=f=O#R#!JLzR&r=^f}v$bx)B< zw0ki6h~8p}!%5deYiU2EV*1uV#={u*lK@G@p|J#=^XRhK04d>8NAtEgxdx37-(QSM zJw*m7@Y~n=-$LN)jeJ5pXX$pTQ|nUa`tp13Is&UGJKj$}5Y6}fX}8oRMC!ARH}la7 zHW8^zx|}bPpOkY}BJkZedB1*HUEt2;X1+937ckZnj@1OLK_L_Nr!3)W3JP!aqIJw% zM>ahH)G~?}mo>oirHSnl2?9rN$K&z>VP1DJYNqF_0?NafOjTbQ* zT33STBCK4HZ_$r{z+Wk?UcHnd=fBo05QcE(!nLuH_Rw=+->yX+83RNfN zt^2(E{L&t_Km2SBJa>?W(8^zYcX&Djgi~_<64_^Ci6s}0%{I07M-mWT6g_r~tgO?X zGp`&Da;F{&R(?%P+yuSQUF>Ts!&6b^ zJU0IfM|?i$NJ}swb2l2w{Ma~xp0nTdcYiboeBU>CuWD;=e7q-7nfsdvbeG)o>EA(mVN8jr1qT~`~?W~o5qo$V@u7; zY}ePSTo#00p1BLx{Ni2ev|3z?VQ0UHuLxID9}mDykMCkS`<0q|FZmg>{`05lT*Ix} zI?v`kDA2H|C?$&zYxwfAdu3iG&3^TkR7{l}BI>+Q(81%3DsSGzOLMPdf96H3(C+h@ zV}qY>L2hhx@Y~o)xQBBPZEj}teLt&=^ty1Bh@qZ0e??&tZp!FO<$>mdKX1UPaIBb> z3J!OoD#MurhEug2cYTg<4@QaVmr(BmpwR>J+#t3`=Y#4?+wW@9faAxY>un=(5D3LM z!6s&PznB%(_VDP;;)Fu*9_N*5G05g8yXre z(8(kSxuBYWU>u`=*~->_qrX}3t`Y8j6{ZKH4A%DY=zRN-X%vgj#&GE@T|YN;O2e{O zKNdVQG^FFL>4N z6g@5NBC?N>nt}Fg{|-x3HS6r-o%kLq3N##0a;IfssWa)S%8Q?DKCZVw_rMuXAlE!I z;@{nTVsVY?xB2$z=jv56^=KE<{rf&YKS(i`CL}0qnJhG#caC!YK3}snF zaC03(rDUimFw9?fi`I``)Oev3skFz(&O7HZG4+z}4TZ(Jqe~5zUvZ}kU-dGHjCsyg zs<1q!vE7}cGDFO33_`8SF)gG{rfu0T!I0^HSb(l-BF^=bqKb6aWJo8IUj?* zlKhypQW1aeCoZ;6KBFZs|JuNWpxOgx|HyZ)?W(uR|RJlj?@eblc$P#!0wlkMp0 zP<;6k8(S?cJ-d;mNoVGhF}k~(u1bFVL;FYdM07qpe7~5rNtvL?eQ_h0BUoDymzL#ZKkQ80BTYFWk*Y^&N z8nSrNsS`P)4QOX>815cw7{Uws`T+Y*6uMf)>YZ6pky4ORkX7|Dc5SFyN6pzefVgXN zazgwxIOT_6r#=HCW4;Z z+yj=W5^=rnoE48?wc|K`weeiV!&2;bI)gz=m}>MNrGMi@l%QMs+I;x=X!Z6U>oK`T zw5##KuRXg&T~kvjqI(S1C2tR_=MG)9DLl2lP%+aEi4N&!wP7_^2hGlY#uD#bUV&!#PVq&9#ei0jwCVZ78YW&+%YzGF8cc2ytqSp>4x>Y+u zZ5NxoH^>bgO;?+`|EkO#Eub1iH!d32iR5&^<;iAel47#Dh#fH_>@6Ww{{kHS;Ni39 zSy6i_8oF5!XhcQsk&&$_jhE>g{?n;Lph~P#8!yzH^ge}Ykg!DYdv2IHQ2c!%qM_&d zOFmR$S3Eh7qeHx*=pUgpc%Vq}fnRcT?NmiYwwBa`lKJmnvAo9r)5Jr3mA||E_iyk| z;3dex|2>RuV*Q`#P4eSjwEzB0dga~!+;(~&{CVfU4=?ezzzY8N;J9`fT=@Pz{{Q*b zN6c;~d-N8&!wCuQfn7PDI+-S`4>T!AwUw3kH?(|x%g&3JSTo)vxMPwD*rjab*xx7P z`BmpF$iKhzdh>Ugd#j9ti6CWBk=YsBGBg$JjXLXPE=&st~DPx*i`D5!_M!@zxtO zi3=1jC}k3Pm!?YTK;zL6b^i~zyw~+ZU14QJ;AB|3?C9u48e#jff0rYdq>#I8t)>(|(Q^t>~H zUq@X0(pQOz4Jt3j$iNq#BJYHMIlkx{lpHrvoMuFVISa@4o&&hm6bo& zgd8yR{3%Nu*lPO9(}92z5VguL6>T?vw{#yl3OXG<*gbPK__&q5mCVu7mJZh<%H?;5 zoA3g)+tYa%bGR|h&H3=P;mA;lu_B3KdL=e-ypRXk)MmX<64u| zE4QM5@m2Ud6;oDGQ9y1^=^L$(3VH0ODWrem%R` z8*$5DCYF1?qTWQpsx!u0wYWrbgiD#3lq;(<>Au~+utDJti(!pSD~1HW8|zCc}ywkB>^tk-ZptcNC>sZN~(Lm9Fd)Q(Ok0(0$;oS*jV+k7cpGB^Q~qKXK^m)mAfQvZhji7jvQRYJKN;vsAegHjnl(Tzo1*GhI$4D zL$8M?jv;Bbi}d2U&G%;T%P}_cxyT38B@6iEtBDEEPgfSVlwnJPm2Bl;vpia>vDePI zwν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 U(2hfm9=@WYsG*Q2_t5jd092aGr~m)} literal 88525 zcmc$FcQ~8h-+w<{s?{M>t5%H|wP~w%2V&IhP-;}|+I!PhRqZ0gRzYd%qI^mpk>To|M;1KuJ5ZH;$2|g9CW^Bcx~Ul>Xc)-HX9Q(5{sDU{&r@){(g3UiKFYsi(e{fOv0T2M9U6!alR{IDB0AENix0-Qk1z znWr+cPh30uC7A~5F)O-Oa@^y9<I+WUe>Sz_k_p19*c;Z9uaip(C7SpzfaEu zdg}UsC|La8`?ObDg3rK);!FYmxbTl!gZa(S zRB*;z1cFoV${qZ7Nnn(yv~QiwJeFHXdai=}sG~2eOGw-c(xPRCBRz;n@w3-Z zl|{$5jc}Cz7O!0Jf4}+q+petTE0;&nFw@bY6@|i-RYm#!-H@Wb_m^-C$qJ8d*FYvDl6!fiE0Ll*S=F7*s4v62+-tYLdFBMElJV=g} zDb=1XKjX@(p;&=Kq8#PglJ9Ot#M-u)&6{`8evOjo^Gi|vA0XnPX-avmGng~+E_+4;)U1X6atx)Q%_r5Wcr3$vo zsEVc@wc{K(vdFH?n~f&8ub%oX7v5iTQ4oTVe(EK(-B}zfd^az~9d)O$HUDzH$%Gp0 zo@SgoMEtFSjH$oFXGz6!a&TH-5f-<-v<^~m^*=Z~6B7Zc8R#ij!d2aK)_~8HPT9y; zowkR?fGI1ZS!Cp{`ezZw-nSkDuK%*qL_(f8j0?9if_esN4Ot%OyS!uClXw>_F0>%( zR)S*lyJ@K{b10?R$|!-iTGKq}jHa)Boyx=)a%ftl=C4Wbd%o}Ytf4^tGW&}IMSNY+ z+TJz;aQE8VW55B_e$oRl^cc&|G-mW%>PQ#u(B_Mhr@j>d_THGYfwLMU?ZRwvx%T78F(bYm?`;8BY zji)r4LBTmslDkxyCp{n=8BZI#js{~Y^M`P7}7<{OPc@=X;R0nd?s1LYjU zaNZd51l3=@scI~aj!}Y%hfm2$6ES(Bc5!A){hkr|#4NI!8b1g@Erkg$IOb|xS&2$E z(kURPH7|RF<@e>XYTOSkKN$-XLW)qf!T>s&30^tmrhB1m{`tZ?d~(X3^zebU0`IWU z@Z=m?lycTQ1Dj<)48a^A@dt8U+1d#wX4~(+wrI$jD}rqql9UIP8@eJFgSM`F+ve5c zf`hA!JLhmnr*BU;+6^o)+J?gl2Au~&Z$>)OJMR^5Dzfeg@G&zoK9`nN-wN|xY}3q) zk3TBAdfaw1(mOgP-b3zAP~J4gD$i)>ZLM2j8)1I=uKarPcog3En&sdc>o_$x{YQjMZ>k%0l;>xvhzdIm)k@VlJMWOz zdD7?5mqUK#HcCXtFcYa~%ItahXpV27CHS`(c^KmkNjYv}C9JhZ^A^pp1NmgxkVNm{ zkIri2;=I^-!l+lk#zo`gXplr`zohzT%jA0;b;{D!10L>a^|{Q`{MbopkEMvk4+D=I z5p!GimBfxrcCT#WTT+tVD@2#6)_hXvl6yJJRF9ZOB_Xt>BTK><>UxjFG8AxxdnwT>Zuqp-Q%SYv=|^*0(XY_7S z4@SxZ;|tz|ORHIUHH_R9p7sh`WS!1SM>{p!9uhlW%lks=jFvHfp>Z5T$WSl+UrhwJ%WvulE! zrND?PZ2RTJwpuS1Y zSf>Qz`DX4&>_eH;C6QC}vc<*cyD>Qp$6^Wn6TIp|Z-4aoz^|uP`g?a`2VIm?oqb8Q zt-EM|%mmkx0lZ$QDi`e|Dt=~K9`2ZNS`;MIS>Yx5`fQEy#l~+qflKK}ldB5C)deO! zR3DudK%uUlIpNUR>&k6%hGy@CEd6*HgG8lI8t zA3Q=Iq)QG`dHLN)I{`!dRaOcU;Um1%^7JvBqOZzWGCYK2f#f9%C4)xSMMK1{Hg>S= zPy&}@3;a(uo^EVkRm}=m*SO+J^zG+OFt31<>vQlgiYGL@I+U`Pb2g2#X^~T=7YL=8 zB~#99B2t7Dj`J(U+>nlx`AIz`eGY*+K+z~GTb?@=BG5*@YriG=Q<_Rl-A}~aqx>sZ z6X;7pq_r*G;k8sY?F_@PAd*0CClr375~+*ESN@gqz&}v}O90@amSaJB&P<#hRg12- z=-^lsBB#&^w2|<=(1Zl;@Jwwvwm_GZtv8f*ZaG(F}2XMS5kZ zMQu1_hBd{w10|as;`CGt^n_QDsJDG@vVX#)$-SrsI1nk2&|H4MvqbyEq0VKmGd{{o zY1iyWaxfy6Dr?8KG?>H8<_deZKN9d&uw z`C6+d5%rz-KU?`C3P^-El|11v|H^_74sn_CD)I9##~a?u-9{0ErcI5v$fLX|;h0PJ zM}vMLEShrfm@{C{jZL=1P5WNr{q9;kv~4k9@J@HSOba+y+~_lL=+OtSmROIL+9xN} zSy1t6)e{_uQUJv;i2BT>gX8gxIG5p-LVYQ9J6DKsh!NXF45$MI{P}E?XI6T%EB^#V zA6z#cL_D~#-L3uEana$?G`u8x&gqOAYHpjJ+yPrMIDKX|(lA3%Q-vmv}-B zwo(x;Hk4$0Upqr|>se>S62h&I+VTnM{j$kGFXpfrv?qB$f%?N5U<{GGeOJ2!QZ2T; z3@!Q?<{V{9%19TaUUH>`bkliRU>#Wsq6SZpVO(M3B83L6TK%=t_o%<^VSpcalzZLf z8Xyz6Y0C)4MbZ?R4~7!&#Q}`&@wd}EA^=kXz9wR!qp9O-|_7qvRKndDoY#{ zAx2xzVNw|2_$*sU9JF)I%cC=k{m_;cxw@EDNUZ!=2A`gW>;VbWhnjOZRe;Pbgiiy= z^7D#UYRr=w1MoxKj}NxDhR733NJ(5+MBR&Jt?>!IYJekKr06fS;+O)6aaezkj|6r2 z!NlfAL!y?n8Rg{WOhZ7cRP)X|iRr*gJNQ+4SC$ohm&DNFSDZjabcW4{IpWDtm{#WQ zCxP5se1TR{K{>poJaMka_8!x2!^Rdr7l7-HFW_41k_XjNtfhK9!kYBKwW?1k$9i*N z#}b3r#>8C2vd{{jdOCPb3Yv}zhjAKCR<9a0omu1Al(7KnR})S5Z&l0s>(!Xt+m7+! z;@EPAuQex~TLYA4rBk`WqUPeY!g6DDV%SQw;vx)bCL4jv2y&GN4;RPFFx156omcwmX%&(LE;d(!v3hxB}tXt@~a;1am4UNOlhLRMB8v- zE7rfsrutC4T_^6YAL7=gcCQ-5ZH1HS>!K2L<96`Ehc=SRyqy3nJUyKZQSSuFixJhg z@Vz}DPnCDwAH|DDEupi6WKI-gfchQSW%TWyNktSAnqEIB0@R=GCmy(A1I;3S)y)vM zU;B+l#KXYiJ(Ao|Y&4&=*mUsEp!`LyT+j+NWyr&ALmsX2S%)lLxo?<|CsnzrOL5$D z$Y=SBJ*DbTnj^+5+aPflW*thcZA6rr3$l`WttH`~hMrCd7c*3xxX6gQY$kI$tma!} z<#n-!gkk%^(wQqo{6otoE;dTVUj5Fn-}&9T$<^7 zs(M@lio0GT(^!h4=t0R-WOSi-<$d>Aonk_SPqB$j=n^@;1p!&fZC9TP3ghP*yb2n5 zIo$UmLwrWh6y4wAJ79OL6P-ddG(U9nqMTVXZ6=Zrfm zadCh5*)+iCz6<3zm~1Yk?QTxQp!p+$eYEe>0he9_vZbE%`O5y**0 z8fDq6BogAxeDyR2bq~r${-21UN##XEULP*AoqsG{` z*U+-CL`!1ppl_X)>5Su-wt3|>zJbs|I5jA)LY$grQ<-`_mShDje_3u&>59<6t2gJz zX8MEws_uMjpjRl>BJBOydb$02`LKz0}^wrn^ZFCl*$C-PuYoP*j^tT*{4 zO={*1w_$-P`%t&=^N9V*7+~{kLr52|CN-dk_PiCQk?n5w)lKH9weN!7>MCtO)mbOC zn_b$@a?lSe8J|~99@OZyfE<&oS*?aQjsaw6^tKSr^)K|M6yc)MrtxPz0tA8U18h;8 z1B;7VHkYG3ze!!3kca)ue>jl-^3GYdaco=scBBL~Eu@OAH!O3NHuxb~&noUOA3ka% zCD2>%+3~DY?}|i3HE&EqtRDdu}xH;QLS zFC&gTR}+@$4!P4dX}vwaOI6*;MCLGrp`FZ_Xevo*aP_(YFD(w)l3u)YCIrxOs&#&t zqYlQk6SYEolllg|1eeQhdsHCXU)rZ2hAJ+M(S6Gq_H+u+ahVTwiW;y$WL*@BPmP3# zAIe0hlU1r)lATlpCY8?Lwfpj@A>SC6l_PS&G`@|kkVbnEmLgk*h&&7zkuU{Vb5*?n zIR2^KU{p=_9gQ)c3W%&qSzP5AF5qXdc;J)SP_=V>^$%r-X^l?Ml@84of!HNIoNy_ULI~=YF-5q+Rl7O{ zRYWPtq^zCanCNQU^>Pd`DS}tAPC)>BGoXh`9Q&QW?mDo*n?XUy(lJ#D|~n|3`hHK)K&Fjo8?n zGDN&@1oCNXfy>)I9Y-p4V-XCzv<{+XOKaPU>q^%nBxP+6JPl}s@YfFJL5s}h@7<)N zUh>se>}p#%?AIAW_ro<$D>4|bnj?`n)hD5F`8;!qk#_5F??IT zAF*U$rF^yqWKIYYT^Tm9C}bfuheX7NbPoFPed+gWb@`Ho4(#DQGqoZ?Qn5J+GA68D zCOdDDEK}!jYw1n`C$eEsvEAY-3EQqy11i1eYON!Z#0E(n=fZn8)zx`5Jd-{21x}Jj z)+k6$WzkSd?Hmh&EV{kId#SMYMk?)YAp2yC41GJf^xxe2Fz{%9+|Z5L3qXH|I5&z* z-O>lVFiPkK$B^Gc5G3r!q5#rTBT=2ZEmNT-F;jZWFQ(WUD&Zt^+ANZL6o4JX3VDor zMY&lzy-;HLG-KU$o!xHcR9MI>nN&3K@d*-rhv9F@w}d3ZHeU3qAq8t0%cGG$FQ3$waX#HR zND${R%pJ!U;{w_Qq&Nn4JjiMifkJELA#R8@cu?LBJa=0y6mioMv8L>vtbHMI96#FU zY`~#poA~|}YHq7VdCO9?{SkdBsS@R}`DsQ;lV~1VvNIdWmYoOvv^ABceH37#p-(ZFhQ(@)R@+f??+S(a zGB&QUe~uZDSQJ7btH>yY3Du=gx~|<@OblVICgq6@PTHs=0)>p>I<+;ak)1{JwdO}Q zyPvH!1|i6*QkVQMqH}Te&kKv>cDPmDlRaYXsm1i)(Cw;#KId#Amtdu-gv$D-`tY-8 z$1W(x*E2kPrRxa-ky5w7S_$lUzw8JnItKtU!z?Y;fZVh=l;Q>3q>$_|JrMHAq=%zp z2qtduO?qYe*J~Rhvx|lyMz`PXuadCbb&!F~4NP^F<_xD@+7CQup6wq9!t{T;iEEV& z+o%jNR4z3>rQW~uT6u^P*{YsUUlnQ=B;M{ejW<7|VpAquaR+x#DGQk#)Sywobuk;o zo=jj}YUC~c$K66ZP1pkR?!u}?J;?a4_bWfqNP<&(oyb2M6y~Hef&~Q z3_K_`oN2ni{6L0ISW2@dE)Pm5fva2>QF$lysr(J(E6TvE*@%AT))4|Wctb(MF3oC` z5S@iCfr{l~SR0ltr)@6xU%mlpK@@!#_jQQX^gX{7e0U=($g-;0Wafv%=$esl%9)V& zUpP)c{cxM(MDw%i4Yctj1Ej$;P#kEHVsp$bX2O~d6dJfV<3vbkxyZKVJVCPTLjPezz?2XOd zwwU9dct2D)x|=v8L2^c8POJR9*%|8-C5sKy{OYp%KLwu|i!EeDYwAg{S_`bjGa)g*j4tw@J{!+m_;x#;DHwa6O5K1EvBI(hR2!k=fd z_%%O3^dlxxfB3pr9gYfWQ|s~j@$0q6rb&Pp&O{@^$^{vnThR0&j@hHYqkvkm!Q}i^ zf#Un`H_2D;%qSbFEp)_9b4UDY=UlZY){-b9V9PD}sqKhxU^M#_?wffM9UiivaRP^J z^M{73XI8@c#*Q;bVwGi-xK=oF4rDn(#1#?LbCdbT_X^r4Kk{DrH36`)J{a(#V3je% zH_q`fYDJcwyEINP?wQ88NEC6jOib_%q9XWQQlYS$Db`Jf($4(bJ1~~|SAxQ4^f@_! z`2f8;7KQn1LSpf42RU^FNz;4{q6z4SB6+tpe%4rQ4PxoOmU-4kR#<+0%`pMsm}7JRbSCa!S~1g2nsZyXBMogx? z_84R}K4B$nSV%j?vpeBtk>&^}MVwiqq1W9DvWB?&PbRx*d-zl5>xp15hRcb&)w zb+FtFb9Hd-Y7BK^J9jUsVQ^3BQ^0mX_7d&mHz>FLdB+O2kuJ{Kglm z|Fd{?z1M zp3YK6LbmQ3_02Z5{0U8|N}+6<_r8;-HnFp^2|7B?|M7M{qa@4a?P`L+4um`mzoQL* zYL?j1yXxz_^F2LNXQa%qACZ2&*YnS}%=V)~G&e*#7w0v(gEz)Rvr7sRr~mBomOg`W zlxX^5qBa0@3)yRzS`Xq?xR(g>!}g8>t*gjNd&6F*zXlXVU4M+a(2TN&!g>P`x(hLX zwtyWu^En)*0~ntzM8WnO_nwhTUalYcvnM|epU0}^!?p8xg!*?j7! zJ5nNX$+K@5J231*Y^3d82CjfIu$Rsu!-fLllelCV-`UfA*%q!F#ogQY_QL z2ELgCJM$pPYADqCN_^j$c8APlaUYM7WSNmdxZ8rprn5sle>A}dWseO#VW#q@S?IIs zB*YLW*H|f&=dHH%ix0&whNNkMvYHwygzqqmL0NwJ4~wzz2ZmWy*m(X{I;W1qM(m&K z2XeOeWN_`P^nKNd^6kEKU8``h`cl*nbxhl$SP1r0g-S|)5Zxql?M9FUK-#SCY8(%( z=ySZMLF3zrQT!MDFy7zV$XzZ0EVq-FXe3ebm!h?xVpOVMc4asU?$CS`{QOds$!c@m zu6G7si)T}!8=b=%gsyKqoutv2DS-+Iuw}6yX2Li`oW>dM+`ktovSMa&z;Hw1zNH!G zg)2)g<1-iZ{d-=xJq)tGtjAtL1xSZH|9OufewG^2H^%m-VtRw0KRg)Ud&hTj6Kkvj zkp>fh)&3pq=!nXIW7w6LLd5rErw_7=r*%Lmt-^%FzZT%g1_Ie}-hbsH0rh*?#P0`G zIjZf|nkgx&($&6L^T2MS`pM0wnlB^1*{7BG`&dI06Z8LEzatwyl}axrX+@otHd(Y}?0mYGn?4$cd=HvkW3)*Y7qvUB^3 zG4V-+(y}zpV<>|VZ0pz2h$tE>(I+YMln+O1tISC*(aNST9t)R0Eid{tXO0l&KD&>c zZheg6yif*(2np{6z~4b=ACm~dUEHtqq$P773R~~sExoAkPir#kx|8VA^~3TmhxO$| zH;bhAL#v&=+}O-FDc3aU z;mM-J=INI^(RDm}ViFhV{prV_e@a9}wjMNvCZc+h`d&z0UQe=$b9x2Tp9HpBIci(Q zK{*CNkZ(O1!YwJErSS3mJYiFE6d3`WWkDj{1nQkTF*)?taR29*j!wy31B=^VtmL4c zGdC^LGrOP#Pi+by+GJT7$4h?lwVUX(uXYl8~-G_UGZiR~wx zgpmGasxX-=180*Kdpblthe_cvS1;;`W=74cMiJD@Z0JAFXzpeqS|ii^nw#K>uCt;~ z&`hNTOziOPSXE*#qSnPdHLc<#P5sTn(Cg>W>;K`d_7{Cf0fe|H^tzrtXA;+$nHCC; zMdC6=)E*f$Uj7hD<(jfZ`})|4=u`e;%Gh7j!)yI&Kw{?r()MYUULd?~wL!AWMs-uj z?f5umv9Vo*)af#d(~4{L&+4sL+T{Ob}{4C>_cnJzYW!F2t!JVnM(=Rb_?ITKW;v2@Va%Aa0iELqCf&g#^2 zDt5+m@otHbRj%zm5nxcumt8hABBa_X7CCQyZIZeFni{%!ryuVb=XnD()0BD4zEeh_ z;qOW1T^CmJzZk>Csq$0{LPXB5wj4K4g=#NuJFCHo7DWxPKwmyu+IdKS*kxuIGj~-7^!Izk#W!~p zyG2~ZoA|(&JTSarXUz_gN;b*(fXutRKzemS-bHPCyH{{ihA|$?=rV$1JmQ6 zRA@7^t)U2Ek-S_VM8_j`c*>h^ZXjo9Es5<$MFcmQi$VPlp6@Tc_?MUfahXRy`M6fe zsqDb@ONAyRS9A zg`DzJ$D3$@NQ7#G(0+ygurGx;qmTSXY?@&&WnxQXq9a)4+YzG=Y<3MjV%mSBB9kr#wmam{yL`+slLw(gh!>Pn4ErS%g4&Iivk+N~4vrzF&Lb4EwVivjfsk``=KezQ| z71uV;TaA1&Wk^@eX$(RBLt!EKFWs6sq2PC|BfkB(spbU{KgTDL=JhZv!iLZ8p_r$w zKTk^qK}|CH4wOLhWvyC2_NQ0}#6z>o3A!myv}7x=q5RSsJF3;~mBouX@N~K80A<-E zE{OxpOK1Ovllt6R$5`8MXTH}xs~ewht|gX>W*0eU4KoUks^%D8RH=;M*6r|%)x^Xv zQgmJa+KGT^w(4Znbtam83F;ulX1ge#%6}ChS6pmqMO6TEBT_G-_TpO*qI<6Fb2|Sm z^@hp_L3`Q1lK25rsUpVvP4qI}beYQhAjL#->FR|F(E!+gUO0&o1m z{sYVN=Z|~}7}m61*;yB>9Y~?lcQ}Ty@o_`84~a+6zl-7}^e&Tmeo*|PUp@JfXWYsHU8Mio!2AjQECk8&Drq`8DH zb;HC>^(Frl9QPc`z$iv+yOY_%Y)hx7XyZ5eM4mB^(pNA%4;$KL;KTq&U zlq{JQEfcfMO;VvtR@F1kzsR32pT-%rOcxSL zoB1h20->lHEsp6Gq+=^|kB>u`47$Gbr)|V=BB0EcuoN>X_ZP6H8ol@ntiNodeDmv^ zlajv3Trm1-8c{jG*1GD+OSwOlBN*cM-kvjF{Yfj=nNW#}aata{B#Y3%GrD{2wFruG z%Zg)qvEw;a`^8`K5Ud`rU9(r#*6x5iwKMrFp^mTzR&;~LqKRRTmI8yh3!eUk)^Gsy zPXj#aqXU2OzA7i}mRZ}z7*QD#qCBSxzXeS+Uvf&-1dB>hnR-le7arD+&?$8keQGd7aKt**ov#PZPVS<%?kdS>lzd?;(MAs@UTkF zrvOUD6E4L{51nETOzS8R``5HidGQ0xDW{U$rbM{o0on=qgv-`?3h1K}Q%ptaz9SFE zt`B9C=Ld&mlq1(U1s%Yk&i6a{--t4M5uEL?K4;n`rX5MMg7OHw;(_e!*0Qe8p<1Z1 ziDP&V6#4qttDSwu~&^~LF}GX^ax(Hi~aZZ*{4JXZK|^E&EWvEn$)Izqr1j# zdNW-?*mQ|nW}KT=YctF&P!#sL%OV~i%=ZvlLC4_;>1c|Y!xA$Uy9x-kIIr_+pMCmY zsF$SKgGt4ypvB;HwjwO18$L>)$_EfAeUoBhfm~w?l0{gV*q5sDq zwnNPCgfPqh9UmOQ9*|f%>C$p|I_^z29_a_dp8LZ=B6?8 zn^XdH5dXgh{7rCwc~I=ZljXP=bFxY8ZCa~DleR+2K_EYkn~B`ZFfiOfnzHy664#YYwOiKgFza6ld+}=#MM56Iwi4u zy#Dse_>}ltaU`eff$@_xn)Z_>0^dcCUCKo4Jv?){DWe;j8&>NA|j zxizowPo_)K=C3pGQyCGO>L)K4rR|UY@%U>F(RI1&htu01L>4yoe@`ite%;g^QG&rU zZdHQal(gxl&y zXeaU{XO!lH7yorC11QsO@Mt5p6!yq*7m);DwEA>;eZkU-j2UZ6M(_9&l8>z|>{w_I zA|a}vRB=8%Uu;viwysg!>}l~iN4h=5hV?msX$BUrwce&BRk8W_j9~zu3Cey}$w4uT zCD@NYxfMJgCN0ehJSskcnMt*Sh;s;Z-a5C$E=H3!)wpsYw;)F%z0eapl+YC+`~+}l z)c{PaNXO1qfp;2y7)_v(e3!SeH7iW=(MQ5415jE&w99K4_f+A=zo$mPmx(q191A2! z7`{!Sf~+6B0>&!=u)WV;y;(?oT{`EutCWi^?bqzW!L9I4V_& zqvYrGVb|mElq|sK)}?7E_qta!yPWxu;)L?pH!_WO9;kYERCiE`M`UxzXZ((mZRJKL zpRA(iMe2t)I*$r9WYk@2C&`Z-dKo{xK!uF&sy`h;Jm`HqM&Yp_oxnJSTcS!Dg4z7Q zO0DLN$~wN_t1Dyj@cYi+Z$(Mw+C&u`=D5>#$sjtx@Cs>|11TVuf1h3vcii=oBF@ zxu%_X&#COU4Wa{KCzjKn7fOTsTPBS&;X_I}e)^nKotv8XWrCJ=I+h~+*leI|y5hUa zmd4QJpk1{JO)*;w^iO)o#4fqoZlOK`(nFh^8eYwzVZs^CtKTDBU8imfqv@#(42rcd zNeX{OFLbw>qCme@@B4Ab*kdQ-a5L2}-Jxx~cbgGfF-g03VcV;Pp}3QQf%6&6(efDM zyPYo&fuBzTv^yK`;4rUXQFkRtjQ5(?!*`?dWjArE3#y(S#T-uyy*}N;Xj4@+BGar| zzwRR38D*xjwG|B9CCyt(QrR;RN;INfDkj1)a?6(d?ZR8O%(adQ9G=Lg&-p*00?Y?V zD&!M8R=5$>G!pf7L34VRtxhYo;O<-6*DG&#aXRC{pwdK!08YTYk|e5b=-Wu?T3MM& z71-t7(dQ&ZFF<+?O2<39-R#7D_6KI2mIsvLGY(s9vyy1cLp3$;N2H2B542}E<)`%T z3e<%{zN&V36p>FV5CsCF{3{T)a<=bY)9y0@uR!98we%Ri`L`o(qN!PkCZ7(eJZJhp z1P|xuUsq1hWpo?$X*c~aVC?Wl??2;BJ-Y{n?u*`YzLxY=V-u=Y|5esY6!DeHHL#n# zlQPI{7WGA?Hd+uC6zuQ}IFL7$RO4D^8$Vgicw_sBNsyeD8K+vAq`6byO|EU2J7$`D zBGSTaf(?fJFAfa!%2Kp-?m?G!E5p6e`@OQU(p_Z5vlX)*poH9G^r?L5D9NaYE3J-& z)C%R=n9OLK|-{DlA@i=D=a?%p%--V`WTifYXAh-jFWwOs;y z&gIZEKt|<8C|7w;gR{F-p74`WwAACGXFf5_gh_#m3NcklQ5sO!%$DGYs=3|J8PcCS zAz}&5i=we-yJZ&UNysBECu<4@5kgfvWIc%4sx3JV&C?As_y8Q1Wga;gS{v9Yjvowq z-&lOjlU4s@d*av@2aXa+s^p!lDD8(hEV~KxQP59K6^u26JZ7$D9rNlRDjbxDGp#Rj z9N2CF9LTR(xa8Jz6X$D#fkeY>!J9U&ilEF+@2@X{z zszVVom`I!UCP8w_YCC7NqsaNYv}4E2n6c#af58s_`beTacjMO%hs-&FfXpWu;&k2A zwZiuqucPU0Ky+kPJ+Zl6;QQ0-Vy=n-b^4 z3jqf}5RrP~d)(Gd3MoHD_Y+;rf%-(OWQM{re^=VDTcO7k8cbdQHW%!smP|9Qs%&9g zGYf%!JTz13Al`6;P)vmB=uh2rG5(j)&ImvCD&!@Dm0-cJuYDBrPGVAI_STYyvi+8_ zlxg=*F)$HjeZRaFY!v6a?uF2FFI3R{hq&gq1rp*z zXESso5$$S%*i$r{v5hd(UJR=~*bK{fkf~hsNDL=%t(x%y{zBH&w=$jg<~{)~2^(&J zhL^W;RbJFb<>19Z)`rEwIE7?`&?Gsdk0)w{WbmhdDxb3&b(`$WpyYNh=2E)>rH^i5 zUH~%aj_n9Jvaw~0K}%?j0q4~8F5^K1x%9BIXBAlD{)Kk8i)ZdY&#GIqILw&`+|FJp z?q{@{{EUXjJ=k95>P6nkrl%{QqQ>3Pj(H6S4?H%1A7 zV)CHa{M`r*FKPsEpn{445KEx5Wcu%rB)zj-EUiJymlc= z6Pe{41wNY5AfuAdMZ`-t&G(v0S8(i0-vvpZ7>DsaD$O~ULTOFz7a2)N+VPNAx0yDo zj2U6_Z-1y3kRnLw7HCP+M}vx>)08Q59DeC}#xciU#wuQQAmjwoy;7@fp#;{MgpkP3 z=Eg#;qr#<-ubin$ukpAqVw3P#6!N8;dXgKZ8hi`G+Hr)7c~;Jy`x&70;^uC6b7CR1 zQ@tRwF25n5`qLWK7P<{NoV6C+r}?#8$T6UOQr)pliV+gbHHtBsjl4d=h=KW+Xr(Fz=_X|=6y6uB z*rJ%!8nvA!Tz~K%WhRHU&av=1JxQzU|<%&yO>~aOy26fyqlsn-vQhSkJ$f zS_B-xo-C>87f|+HEQm<^8GK0E_j%d2oMX&aTW1PN1IUxg|W?7EY)F>F&74SS++N*dH%nBA_d zQ=?Nl2FFq;6PEy`U*c{PMHYgy8PVVp|LY-P8V6J6dfumNvc#L`@lJ^==5-351i$N& zGMybwI_nZQ-27>`m8$=CeDWNk6e_f6#@zDQ%C(yPyDjuvv)3$mAKX$DJFuGj`%hr8hIk(dIwo&N+_l`CTP* z3q9t@$nR1U&goEQ(yB3xUFCLgW{`R12d!$+MDunKZT%C*$s{?vgxQ!f2#X=JKn^Mn z)zOWsw)jR6*;QE zY!2)17NbTU9kLj@Wczd`hoiI!094caZeJi7Dq+PqQ&^cqpG}We8kpR5$LvINYtv>q zOjHgxYOQt5ZJp+^I(!f6?~zNqhv`%}1U&lu`$v877u|f9QI0u5=@VA)#7&oL0qaI& z`^plA#Fg{Uxo%c6OS(IBe0miD9t$WfxgKZsv@Px@v@>KB#sFEbob+X$|EZH|_O&Yg zsy2GTdio7yZg|I`{WcAC<*n5RlS)2K8=SK>yxt&i%8qWQ6#0Cz{jHvvb(e0o(*4qf z{sY+&ei`Dp!T|cNr0rD39mIoRZzf=N)CcR;cyH>AH#J{7r!X#9v4cHgkd$(#zxOh! zV*5Oh=L|t5qFAjP@Ofg09N72dGRb!yaVUx-Z7P&VM^y(;AC zWRYfjq~h?FPVSQWswPcHG;eo0=bnaF+_VakRs^^P{3x|EARPIT#R?iD6xst=57 znzJwpz8FMrCW*2PTw@q;5;2w8wigsI&O{rMUrppm;+QzgG#h188K3hG6UO#5y5*Xw`cQ*_u3W=7!lYHR42*pPKf%H{@sbG-P%z=A_a5dc_ea-psu z)2wo{S6|$;hG{UNv-)XlL;>w)j@FYUTBbX>tH(64#=I3`#*$v;sR5c~$hS1d=UfsN zXr~oBd~B0O6ipSV{^N+aki1LIL6Ktl`()G)TVpm|U+{X2+x z4r1{^yA`!_Lt1lAm2v*P#zc@R;#tV1@8hbq53@{lGmlEl?eZL-c5JNC=bQ@%6-%9j zpOT!$)^AAuOp>u!vDJXXc`e=!{wxi0B-Z-1QC}~I>Zp9`o$EGrJ#sWx*-)iLqzQ8+ zYI4)cHlyCd`Wh>f9n;BkYh486I{&ZIfV zVf;$wbMqzr;zD5jQJJbR@=8ZLA;g1OjeD~Zsn<>QS}S{3;&f}{%(-2ffYNlp!!zQJ zG+EO+&MC(Z_;k=>3fDm8svwCEQ|()H`zI1NZNKAXL#p-PF6D8Fd)QI+7PgY<7QJk| z{q_1=OquXdRf$&DOP&d!{uS4)s)?yRg_dbmiva}s;pNAJpd4>N)}bTq1@9d`ByDy- z0RZ>9CCp;y(yBpccG_3TN?u5%qN{RcROE8-5U_eUpY985-O&fXGpz94tv^t+Sbf+v z*bMZ8=fy>>p^z>A()o`gPWiCF{wL^`8soa%*Pxc!c4o~&C0QUNSq49t;ZpxBU(kA3xP_No$4SldV|xebk9l$hi?`79KBQY9;J)fB;qLXgG-mR!S2qrHhiYAW z!K_N3H%g(uT+k&eEF|98VfNakXlVZ2&rn4 z*)E8XZb@3{T%4$+H_xe%*DKk~JscgxW@Z>MD43C) zmCzxV5}DO|BBiYVlj5Z6Uzjn5-!b=jWkSEU2ctrWQ#q7aS82Gb;s!28{0!EO(CL@83(Nfr0Xe(P z)~F&}#Bf)Yby6$CKS5fMrA$i^v_Tmdwpp5g!0eDbJL+N z^IejSAs*5CQ_UKSNB@KuOS~^6$_~BRpTxU(AmpsF!M$@YniMxoye^$t(m!QY8Tay^Cyrl4!}=4t&6HU z>s-^Zjlw6r_2|Sc!nT&%+>#Sz(-~dzxFr6AoFxI zftn_yoaN=1+T<%-G)-+>9V&kRB6ayPFj7lCUkEkJv$2AUDa9Rq)#^RP8Yq%0>EBig z&qiD9F5|u{|7GcyAs~*L1Z^Yk@@>ULwVi?a9h

X&oD8_nmcvY=)p3IQuE((Ol`R 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�s3QksXPqZ{!Lx$(0|8Z*RSR}GYPd#ec6}09;e7dC)B-~$@)nC)DN3CxF-+J<2n89Y3s3FHh}jd)vh(SYZZ`R@L>CAYoD15OPEm|~i$ z{EE|qGbGVCGxuD~<`n6MTtfl?qWW<_jD) z!i_dA&~uxEl3LWC`cGAPo)F|Oz%{xXKpZ`fr*KWPkH}VwDc*JQrOIzr|87ub?^f>3 zss>6a)FQcFljkb^2I_Bbe#5AkgPE5;bHHF4>f$rTf7dQle93u^WI|f)cQP=`%#+(O zySC4-ne+3XC&+k8FHl}UZHkVrik@>I=C*VsBR=|q6aR*7!3z1$U=^>;spCtK4^tYC zxheOcR-`gk*Knxv5c1Oo;$mJdfi-TLOCKB29SR_&uYDUqWW^h+cX8v^)}M(DLgFc9 zj-AY%E`5y#nV#v3@a(~-87Q@jN22vnk$0K%*5)9Z{RXTAU63`Nz7pv*7GXlonrkvC z=3X=>2E&_AvNi)tM=*Lzf*Y`wrk(jyLu zkAO#-{-QF7G_XUO`&*hY{Bxozfzx^v#dQ?Yhkx){FjZ!Q{~#*=(EVk&d<^lo4n8`4 z3vvq=Y>)AUv|MEOeQSLv% zil;Ce&)50cz-boxO6g( zt>C)<$#-0m)RAj;r;mJ>`EtrU^Fk}@yF^>t-&dcfcKwrGdF=F)LaWo?S$J$^zYgSf}Po=tiD{r^$3`sGHJ)prcuG;MN+xArZ`fc(IxZ=ZkTn$6WJ)4LD<7n0XE AYXATM From 94b87f8d9a1a38b6e5440fb48e1b27a5c627af21 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 12 Jan 2021 15:59:16 -0500 Subject: [PATCH 07/46] ui: Remove unnecessary call to getDefaultPaneParams() --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index c418a20c6..e303a6bc1 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -113,12 +113,10 @@ class AdvancedMultiSelect extends React.Component { disabled, readonly, multiple, - autofocus, - registry + autofocus } = this.props; const {enumOptions} = options; - getDefaultPaneParams(schema.items.$ref, registry); return (

From 73dd8ddcc97da1156fa09793051ffec6651d8d40 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Wed, 13 Jan 2021 07:35:03 -0500 Subject: [PATCH 08/46] ui: Minor readability and style changes for AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index e303a6bc1..5dca8e86e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -41,6 +41,8 @@ class AdvancedMultiSelect extends React.Component { constructor(props) { super(props) + this.enumOptions = props.options.enumOptions; + this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) @@ -52,10 +54,10 @@ class AdvancedMultiSelect extends React.Component { } onMasterCheckboxClick() { - let newValues = this.props.options.enumOptions.map(({value}) => value); - - if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { - newValues = []; + if (this.state.masterCheckboxState === MasterCheckboxState.ALL) { + var newValues = []; + } else { + newValues = this.enumOptions.map(({value}) => value); } this.props.onChange(newValues); @@ -87,11 +89,11 @@ class AdvancedMultiSelect extends React.Component { } getMasterCheckboxState(selectValues) { - if (selectValues.length == 0) { + if (selectValues.length === 0) { return MasterCheckboxState.NONE; } - if (selectValues.length != this.props.options.enumOptions.length) { + if (selectValues.length != this.enumOptions.length) { return MasterCheckboxState.MIXED; } @@ -107,8 +109,6 @@ class AdvancedMultiSelect extends React.Component { const { schema, id, - options, - value, required, disabled, readonly, @@ -116,19 +116,17 @@ class AdvancedMultiSelect extends React.Component { autofocus } = this.props; - const {enumOptions} = options; - return (
- { - enumOptions.map(({value, label}, i) => { + this.enumOptions.map(({value, label}, i) => { return ( - {title} From 8d024b900248d94cee76ec79f0dd66befeb7efbf Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 14 Jan 2021 08:37:52 -0500 Subject: [PATCH 09/46] ui: separate MasterCheckbox and ChildCheckbox into their own files --- .../ui-components/AdvancedMultiSelect.js | 65 ++----------------- .../components/ui-components/ChildCheckbox.js | 30 +++++++++ .../ui-components/MasterCheckbox.js | 41 ++++++++++++ 3 files changed, 76 insertions(+), 60 deletions(-) create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 5dca8e86e..9d82a1b8d 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,20 +1,13 @@ -import React from "react"; -import {Card, Button, Form} from 'react-bootstrap'; -import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; -import {faMinusSquare} from '@fortawesome/free-solid-svg-icons'; -import {faSquare} from '@fortawesome/free-regular-svg-icons'; +import React from 'react'; +import {Form} from 'react-bootstrap'; + import {cloneDeep} from 'lodash'; import {getComponentHeight} from './utils/HeightCalculator'; import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; - -const MasterCheckboxState = { - NONE: 0, - MIXED: 1, - ALL: 2 -} +import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; +import ChildCheckbox from './ChildCheckbox'; function getFullDefinitionByKey(refString, registry, itemKey) { let fullArray = getFullDefinitionsFromRegistry(refString, registry); @@ -143,52 +136,4 @@ class AdvancedMultiSelect extends React.Component { } } -function MasterCheckbox(props) { - const { - title, - disabled, - onClick, - checkboxState - } = props; - - let newCheckboxIcon = faCheckSquare; - - if (checkboxState === MasterCheckboxState.NONE) { - newCheckboxIcon = faSquare; - } else if (checkboxState === MasterCheckboxState.MIXED) { - newCheckboxIcon = faMinusSquare; - } - - return ( - - - {title} - - ); -} - -function ChildCheckbox(props) { - const { - onPaneClick, - onClick, - value, - disabled, - label, - checkboxState - } = props; - - return ( - onPaneClick(value)}> - - - {label} - - - ); -} - export default AdvancedMultiSelect; diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js new file mode 100644 index 000000000..353da4b22 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -0,0 +1,30 @@ +import React from 'react'; +import {Button, Form} from 'react-bootstrap'; + +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faSquare} from '@fortawesome/free-regular-svg-icons'; + +function ChildCheckbox(props) { + const { + onPaneClick, + onClick, + value, + disabled, + label, + checkboxState + } = props; + + return ( + onPaneClick(value)}> + + + {label} + + + ); +} + +export default ChildCheckbox; diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js new file mode 100644 index 000000000..0485e64eb --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js @@ -0,0 +1,41 @@ +import React from 'react'; +import {Card, Button} from 'react-bootstrap'; + +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faMinusSquare} from '@fortawesome/free-solid-svg-icons'; +import {faSquare} from '@fortawesome/free-regular-svg-icons'; + +const MasterCheckboxState = { + NONE: 0, + MIXED: 1, + ALL: 2 +} + +function MasterCheckbox(props) { + const { + title, + disabled, + onClick, + checkboxState + } = props; + + let newCheckboxIcon = faCheckSquare; + + if (checkboxState === MasterCheckboxState.NONE) { + newCheckboxIcon = faSquare; + } else if (checkboxState === MasterCheckboxState.MIXED) { + newCheckboxIcon = faMinusSquare; + } + + return ( + + + {title} + + ); +} + +export {MasterCheckboxState, MasterCheckbox}; From 11ea5e1a7eb536628bbd6521ddc8cfc336df7d4d Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 14 Jan 2021 08:44:19 -0500 Subject: [PATCH 10/46] ui: separate json schema-related functions into JsonSchemaHelpers.js --- .../ui-components/AdvancedMultiSelect.js | 23 +----------------- .../ui-components/JsonSchemaHelpers.js | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 9d82a1b8d..efd516813 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -4,31 +4,10 @@ import {Form} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; import {getComponentHeight} from './utils/HeightCalculator'; -import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckbox from './ChildCheckbox'; - -function getFullDefinitionByKey(refString, registry, itemKey) { - let fullArray = getFullDefinitionsFromRegistry(refString, registry); - return fullArray.filter(e => (e.enum[0] === itemKey))[0]; -} - -// Definitions passed to components only contains value and label, -// custom fields like "info" or "links" must be pulled from registry object using this function -function getFullDefinitionsFromRegistry(refString, registry) { - return getObjectFromRegistryByRef(refString, registry).anyOf; -} - -function getObjectFromRegistryByRef(refString, registry) { - let refArray = refString.replace('#', '').split('/'); - return resolveObjectPath(refArray, registry); -} - -function getDefaultPaneParams(refString, registry) { - let configSection = getObjectFromRegistryByRef(refString, registry); - return ({title: configSection.title, content: configSection.description}); -} +import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers.js'; class AdvancedMultiSelect extends React.Component { constructor(props) { diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js new file mode 100644 index 000000000..06eed4aed --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js @@ -0,0 +1,24 @@ +import {resolveObjectPath} from './utils/ObjectPathResolver'; + +function getFullDefinitionByKey(refString, registry, itemKey) { + let fullArray = getFullDefinitionsFromRegistry(refString, registry); + return fullArray.filter(e => (e.enum[0] === itemKey))[0]; +} + +// Definitions passed to components only contains value and label, +// custom fields like "info" or "links" must be pulled from registry object using this function +function getFullDefinitionsFromRegistry(refString, registry) { + return getObjectFromRegistryByRef(refString, registry).anyOf; +} + +function getObjectFromRegistryByRef(refString, registry) { + let refArray = refString.replace('#', '').split('/'); + return resolveObjectPath(refArray, registry); +} + +function getDefaultPaneParams(refString, registry) { + let configSection = getObjectFromRegistryByRef(refString, registry); + return ({title: configSection.title, content: configSection.description}); +} + +export {getFullDefinitionByKey, getDefaultPaneParams}; From bf6db078a6d2e5fddbd49805dbd3f8ade9f6a1ff Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 15 Jan 2021 08:16:08 -0500 Subject: [PATCH 11/46] ui: add missing semicolons --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index efd516813..56658cf71 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -11,7 +11,7 @@ import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers. class AdvancedMultiSelect extends React.Component { constructor(props) { - super(props) + super(props); this.enumOptions = props.options.enumOptions; @@ -37,7 +37,7 @@ class AdvancedMultiSelect extends React.Component { } onChildCheckboxClick(value) { - let selectValues = this.getSelectValuesAfterClick(value) + let selectValues = this.getSelectValuesAfterClick(value); this.props.onChange(selectValues); this.setMasterCheckboxState(selectValues); From e04e11e4ac87967f0a0f2cef0839680001dc87d4 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 21 Jan 2021 15:07:19 -0500 Subject: [PATCH 12/46] ui: add "reset to safe defaults" in AdvancedMultiSelect If the user selects an unsafe exploit or post breach action, a yellow warning button appears that allows the user to reset to safe defaults. --- .../ui-components/AdvancedMultiSelect.js | 60 +++++++++++++++++-- .../ui-components/MasterCheckbox.js | 6 +- .../components/AdvancedMultiSelect.scss | 6 +- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 56658cf71..508bafa83 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,5 +1,5 @@ import React from 'react'; -import {Form} from 'react-bootstrap'; +import {Button, Card, Form} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; @@ -7,21 +7,45 @@ import {getComponentHeight} from './utils/HeightCalculator'; import InfoPane from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckbox from './ChildCheckbox'; -import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers.js'; +import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers'; + +function AdvancedMultiSelectHeader(props) { + const { + title, + disabled, + onCheckboxClick, + checkboxState, + hideReset, + onResetClick + } = props; + + return ( + + + + + ); +} class AdvancedMultiSelect extends React.Component { constructor(props) { super(props); this.enumOptions = props.options.enumOptions; + this.defaultValues = props.schema.default; this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), + hideReset: this.getHideResetState(props.value), infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) }; this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); + this.onResetClick = this.onResetClick.bind(this); this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); } @@ -34,6 +58,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(newValues); this.setMasterCheckboxState(newValues); + this.setHideResetState(newValues); } onChildCheckboxClick(value) { @@ -41,6 +66,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(selectValues); this.setMasterCheckboxState(selectValues); + this.setHideResetState(selectValues); } getSelectValuesAfterClick(clickedValue) { @@ -72,11 +98,34 @@ class AdvancedMultiSelect extends React.Component { return MasterCheckboxState.ALL; } + onResetClick() { + this.props.onChange(this.defaultValues); + this.setHideResetState(this.defaultValues); + this.setMasterCheckboxState(this.defaultValues); + this.setPaneInfoToDefault(); + } + + setHideResetState(selectValues) { + this.setState(() => ({ + hideReset: this.getHideResetState(selectValues) + })); + } + + getHideResetState(selectValues) { + return selectValues.every((value) => this.defaultValues.includes(value)); + } + setPaneInfo(refString, registry, itemKey) { let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); } + setPaneInfoToDefault() { + this.setState(() => ({ + infoPaneParams: getDefaultPaneParams(this.props.schema.items.$ref, this.props.registry) + })); + } + render() { const { schema, @@ -90,9 +139,10 @@ class AdvancedMultiSelect extends React.Component { return (
- + +
{title} - +
); } diff --git a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss index 3dc1fe9a5..de3d5d542 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss @@ -18,12 +18,14 @@ padding-bottom: 5px; } -.advanced-multi-select .card-header button { - padding-top: 0; +.advanced-multi-select .card-header .master-checkbox span { + padding-bottom: 0.188rem; } .advanced-multi-select .card-header .header-title { font-size: 1.2em; + display: inline-block; + vertical-align: middle; } .advanced-multi-select .choice-block .form-group { From 917d6f574b538899e3ada28bbf8603acff6aa127 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 26 Jan 2021 15:15:11 -0500 Subject: [PATCH 13/46] ui: use class properties syntax in AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 508bafa83..5c7c11345 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -36,20 +36,17 @@ class AdvancedMultiSelect extends React.Component { this.enumOptions = props.options.enumOptions; this.defaultValues = props.schema.default; + this.infoPaneRefString = props.schema.items.$ref; + this.registry = props.registry; this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), hideReset: this.getHideResetState(props.value), - infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) + infoPaneParams: getDefaultPaneParams(this.infoPaneRefString, this.registry) }; - - this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); - this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); - this.onResetClick = this.onResetClick.bind(this); - this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); } - onMasterCheckboxClick() { + onMasterCheckboxClick = () => { if (this.state.masterCheckboxState === MasterCheckboxState.ALL) { var newValues = []; } else { @@ -61,7 +58,7 @@ class AdvancedMultiSelect extends React.Component { this.setHideResetState(newValues); } - onChildCheckboxClick(value) { + onChildCheckboxClick = (value) => { let selectValues = this.getSelectValuesAfterClick(value); this.props.onChange(selectValues); @@ -98,7 +95,7 @@ class AdvancedMultiSelect extends React.Component { return MasterCheckboxState.ALL; } - onResetClick() { + onResetClick = () => { this.props.onChange(this.defaultValues); this.setHideResetState(this.defaultValues); this.setMasterCheckboxState(this.defaultValues); @@ -115,8 +112,8 @@ class AdvancedMultiSelect extends React.Component { return selectValues.every((value) => this.defaultValues.includes(value)); } - setPaneInfo(refString, registry, itemKey) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + setPaneInfo = (itemKey) => { + let definitionObj = getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey); this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); } From 145a41ffcf4029c7c26e69ebf7875d4c1f06b9fa Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 26 Jan 2021 15:46:57 -0500 Subject: [PATCH 14/46] ui: move getDefaultPaneParams() to InfoPane.js --- .../src/components/ui-components/AdvancedMultiSelect.js | 4 ++-- .../cc/ui/src/components/ui-components/InfoPane.js | 8 +++++++- .../ui/src/components/ui-components/JsonSchemaHelpers.js | 7 +------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 5c7c11345..bab944093 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -4,10 +4,10 @@ import {Button, Card, Form} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; import {getComponentHeight} from './utils/HeightCalculator'; -import InfoPane from './InfoPane'; +import {getDefaultPaneParams, InfoPane} from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckbox from './ChildCheckbox'; -import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers'; +import {getFullDefinitionByKey} from './JsonSchemaHelpers'; function AdvancedMultiSelectHeader(props) { const { diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 5c963d87e..6e50ca66d 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -3,6 +3,12 @@ import React from 'react'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; +import {getObjectFromRegistryByRef} from './JsonSchemaHelpers'; + +function getDefaultPaneParams(refString, registry) { + let configSection = getObjectFromRegistryByRef(refString, registry); + return ({title: configSection.title, content: configSection.description}); +} function InfoPane(props) { return ( @@ -49,4 +55,4 @@ function getBody(props) { ) } -export default InfoPane +export {getDefaultPaneParams, InfoPane} diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js index 06eed4aed..9a3d9c66b 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js @@ -16,9 +16,4 @@ function getObjectFromRegistryByRef(refString, registry) { return resolveObjectPath(refArray, registry); } -function getDefaultPaneParams(refString, registry) { - let configSection = getObjectFromRegistryByRef(refString, registry); - return ({title: configSection.title, content: configSection.description}); -} - -export {getFullDefinitionByKey, getDefaultPaneParams}; +export {getFullDefinitionByKey, getObjectFromRegistryByRef}; From 32cdc034f32fc53c46eed596af426b681cf8b031 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 26 Jan 2021 15:51:42 -0500 Subject: [PATCH 15/46] ui: fix whitespace in ChildCheckbox.js --- .../components/ui-components/ChildCheckbox.js | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 353da4b22..4ce11295e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -6,25 +6,23 @@ import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; function ChildCheckbox(props) { - const { - onPaneClick, - onClick, - value, - disabled, - label, - checkboxState - } = props; + const { + onPaneClick, + onClick, + value, + disabled, + label, + checkboxState + } = props; - return ( - onPaneClick(value)}> - - - {label} - - - ); + return ( + onPaneClick(value)}> + + {label} + + ); } export default ChildCheckbox; From 155da384c275aa6057ad1b661cacd5c58af51ba9 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 08:14:18 -0500 Subject: [PATCH 16/46] ui: replace "(UNSAFE)" text with warning icon --- .../definitions/exploiter_classes.py | 15 ++++++++++++++- .../config_schema/definitions/finger_classes.py | 8 ++++++++ .../definitions/post_breach_actions.py | 11 +++++++++++ .../definitions/system_info_collector_classes.py | 6 ++++++ .../ui-components/AdvancedMultiSelect.js | 7 ++++++- .../src/components/ui-components/ChildCheckbox.js | 13 ++++++++++--- .../cc/ui/src/styles/pages/ConfigurationPage.scss | 7 +++++++ 7 files changed, 62 insertions(+), 5 deletions(-) diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py index 0a5e671a3..25158d73a 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py @@ -12,6 +12,7 @@ EXPLOITER_CLASSES = { "SmbExploiter" ], "title": "SMB Exploiter", + "safe": True, "attack_techniques": ["T1110", "T1075", "T1035"], "info": "Brute forces using credentials provided by user and" " hashes gathered by mimikatz.", @@ -23,6 +24,7 @@ EXPLOITER_CLASSES = { "WmiExploiter" ], "title": "WMI Exploiter", + "safe": True, "attack_techniques": ["T1110", "T1106"], "info": "Brute forces WMI (Windows Management Instrumentation) " "using credentials provided by user and hashes gathered by mimikatz.", @@ -34,6 +36,7 @@ EXPLOITER_CLASSES = { "MSSQLExploiter" ], "title": "MSSQL Exploiter", + "safe": True, "attack_techniques": ["T1110"], "info": "Tries to brute force into MsSQL server and uses insecure " "configuration to execute commands on server.", @@ -44,7 +47,8 @@ EXPLOITER_CLASSES = { "enum": [ "Ms08_067_Exploiter" ], - "title": "MS08-067 Exploiter (UNSAFE)", + "title": "MS08-067 Exploiter", + "safe": False, "info": "Unsafe exploiter, that might cause system crash due to the use of buffer overflow. " "Uses MS08-067 vulnerability.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/ms08-067/" @@ -55,6 +59,7 @@ EXPLOITER_CLASSES = { "SSHExploiter" ], "title": "SSH Exploiter", + "safe": True, "attack_techniques": ["T1110", "T1145", "T1106"], "info": "Brute forces using credentials provided by user and SSH keys gathered from systems.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/sshexec/" @@ -65,6 +70,7 @@ EXPLOITER_CLASSES = { "ShellShockExploiter" ], "title": "ShellShock Exploiter", + "safe": True, "info": "CVE-2014-6271, based on logic from " "https://github.com/nccgroup/shocker/blob/master/shocker.py .", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/shellshock/" @@ -75,6 +81,7 @@ EXPLOITER_CLASSES = { "SambaCryExploiter" ], "title": "SambaCry Exploiter", + "safe": True, "info": "Bruteforces and searches for anonymous shares. Uses Impacket.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/sambacry/" }, @@ -84,6 +91,7 @@ EXPLOITER_CLASSES = { "ElasticGroovyExploiter" ], "title": "ElasticGroovy Exploiter", + "safe": True, "info": "CVE-2015-1427. Logic is based on Metasploit module.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/elasticgroovy/" }, @@ -93,6 +101,7 @@ EXPLOITER_CLASSES = { "Struts2Exploiter" ], "title": "Struts2 Exploiter", + "safe": True, "info": "Exploits struts2 java web framework. CVE-2017-5638. Logic based on " "https://www.exploit-db.com/exploits/41570 .", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/struts2/" @@ -103,6 +112,7 @@ EXPLOITER_CLASSES = { "WebLogicExploiter" ], "title": "WebLogic Exploiter", + "safe": True, "info": "Exploits CVE-2017-10271 and CVE-2019-2725 vulnerabilities on WebLogic server.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/weblogic/" }, @@ -112,6 +122,7 @@ EXPLOITER_CLASSES = { "HadoopExploiter" ], "title": "Hadoop/Yarn Exploiter", + "safe": True, "info": "Remote code execution on HADOOP server with YARN and default settings. " "Logic based on https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/hadoop/" @@ -122,6 +133,7 @@ EXPLOITER_CLASSES = { "VSFTPDExploiter" ], "title": "VSFTPD Exploiter", + "safe": True, "info": "Exploits a malicious backdoor that was added to the VSFTPD download archive. " "Logic based on Metasploit module.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/vsftpd/" @@ -132,6 +144,7 @@ EXPLOITER_CLASSES = { "DrupalExploiter" ], "title": "Drupal Exploiter", + "safe": True, "info": "Exploits a remote command execution vulnerability in a Drupal server," "for which certain modules (such as RESTful Web Services) are enabled.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/drupal/" diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py index 405983dc5..5e3f75f33 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py @@ -10,6 +10,7 @@ FINGER_CLASSES = { "SMBFinger" ], "title": "SMBFinger", + "safe": True, "info": "Figures out if SMB is running and what's the version of it.", "attack_techniques": ["T1210"] }, @@ -19,6 +20,7 @@ FINGER_CLASSES = { "SSHFinger" ], "title": "SSHFinger", + "safe": True, "info": "Figures out if SSH is running.", "attack_techniques": ["T1210"] }, @@ -28,6 +30,7 @@ FINGER_CLASSES = { "PingScanner" ], "title": "PingScanner", + "safe": True, "info": "Tries to identify if host is alive and which OS it's running by ping scan." }, { @@ -36,6 +39,7 @@ FINGER_CLASSES = { "HTTPFinger" ], "title": "HTTPFinger", + "safe": True, "info": "Checks if host has HTTP/HTTPS ports open." }, { @@ -44,6 +48,7 @@ FINGER_CLASSES = { "MySQLFinger" ], "title": "MySQLFinger", + "safe": True, "info": "Checks if MySQL server is running and tries to get it's version.", "attack_techniques": ["T1210"] }, @@ -53,6 +58,7 @@ FINGER_CLASSES = { "MSSQLFinger" ], "title": "MSSQLFinger", + "safe": True, "info": "Checks if Microsoft SQL service is running and tries to gather information about it.", "attack_techniques": ["T1210"] }, @@ -62,6 +68,7 @@ FINGER_CLASSES = { "ElasticFinger" ], "title": "ElasticFinger", + "safe": True, "info": "Checks if ElasticSearch is running and attempts to find it's version.", "attack_techniques": ["T1210"] }, @@ -71,6 +78,7 @@ FINGER_CLASSES = { "WindowsServerFinger" ], "title": "WindowsServerFinger", + "safe": True, "info": "Checks if server is a Windows Server and tests if it is vulnerable to Zerologon.", "attack_techniques": ["T1210"] } diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py index f1fe0f6f2..16dc0735e 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py @@ -10,6 +10,7 @@ POST_BREACH_ACTIONS = { "BackdoorUser" ], "title": "Back door user", + "safe": True, "info": "Attempts to create a new user on the system and delete it afterwards.", "attack_techniques": ["T1136"] }, @@ -19,6 +20,7 @@ POST_BREACH_ACTIONS = { "CommunicateAsNewUser" ], "title": "Communicate as new user", + "safe": True, "info": "Attempts to create a new user, create HTTPS requests as that user and delete the user " "afterwards.", "attack_techniques": ["T1136"] @@ -29,6 +31,7 @@ POST_BREACH_ACTIONS = { "ModifyShellStartupFiles" ], "title": "Modify shell startup files", + "safe": True, "info": "Attempts to modify shell startup files, like ~/.profile, ~/.bashrc, ~/.bash_profile " "in linux, and profile.ps1 in windows. Reverts modifications done afterwards.", "attack_techniques": ["T1156", "T1504"] @@ -39,6 +42,7 @@ POST_BREACH_ACTIONS = { "HiddenFiles" ], "title": "Hidden files and directories", + "safe": True, "info": "Attempts to create a hidden file and remove it afterward.", "attack_techniques": ["T1158"] }, @@ -48,6 +52,7 @@ POST_BREACH_ACTIONS = { "TrapCommand" ], "title": "Trap", + "safe": True, "info": "On Linux systems, attempts to trap an interrupt signal in order to execute a command " "upon receiving that signal. Removes the trap afterwards.", "attack_techniques": ["T1154"] @@ -58,6 +63,7 @@ POST_BREACH_ACTIONS = { "ChangeSetuidSetgid" ], "title": "Setuid and Setgid", + "safe": True, "info": "On Linux systems, attempts to set the setuid and setgid bits of a new file. " "Removes the file afterwards.", "attack_techniques": ["T1166"] @@ -68,6 +74,7 @@ POST_BREACH_ACTIONS = { "ScheduleJobs" ], "title": "Job scheduling", + "safe": True, "info": "Attempts to create a scheduled job on the system and remove it.", "attack_techniques": ["T1168", "T1053"] }, @@ -77,6 +84,7 @@ POST_BREACH_ACTIONS = { "Timestomping" ], "title": "Timestomping", + "safe": True, "info": "Creates a temporary file and attempts to modify its time attributes. Removes the file afterwards.", "attack_techniques": ["T1099"] }, @@ -86,6 +94,7 @@ POST_BREACH_ACTIONS = { "SignedScriptProxyExecution" ], "title": "Signed script proxy execution", + "safe": False, "info": "On Windows systems, attemps to execute an arbitrary file " "with the help of a pre-existing signed script.", "attack_techniques": ["T1216"] @@ -96,6 +105,7 @@ POST_BREACH_ACTIONS = { "AccountDiscovery" ], "title": "Account Discovery", + "safe": True, "info": "Attempts to get a listing of user accounts on the system.", "attack_techniques": ["T1087"] }, @@ -105,6 +115,7 @@ POST_BREACH_ACTIONS = { "ClearCommandHistory" ], "title": "Clear command history", + "safe": False, "info": "Attempts to clear the command history.", "attack_techniques": ["T1146"] } diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py index 5f113f4a7..174133f43 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py @@ -16,6 +16,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { ENVIRONMENT_COLLECTOR ], "title": "Environment collector", + "safe": True, "info": "Collects information about machine's environment (on premise/GCP/AWS).", "attack_techniques": ["T1082"] }, @@ -25,6 +26,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { MIMIKATZ_COLLECTOR ], "title": "Mimikatz collector", + "safe": True, "info": "Collects credentials from Windows credential manager.", "attack_techniques": ["T1003", "T1005"] }, @@ -34,6 +36,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { AWS_COLLECTOR ], "title": "AWS collector", + "safe": True, "info": "If on AWS, collects more information about the AWS instance currently running on.", "attack_techniques": ["T1082"] }, @@ -43,6 +46,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { HOSTNAME_COLLECTOR ], "title": "Hostname collector", + "safe": True, "info": "Collects machine's hostname.", "attack_techniques": ["T1082", "T1016"] }, @@ -52,6 +56,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { PROCESS_LIST_COLLECTOR ], "title": "Process list collector", + "safe": True, "info": "Collects a list of running processes on the machine.", "attack_techniques": ["T1082"] }, @@ -61,6 +66,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { AZURE_CRED_COLLECTOR ], "title": "Azure credential collector", + "safe": True, "info": "Collects password credentials from Azure VMs", "attack_techniques": ["T1003", "T1005"] } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index bab944093..b92ff3f1a 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -123,6 +123,10 @@ class AdvancedMultiSelect extends React.Component { })); } + isSafe(itemKey) { + return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; + } + render() { const { schema, @@ -149,7 +153,8 @@ class AdvancedMultiSelect extends React.Component { return ( + disabled={disabled} label={label} checkboxState={this.props.value.includes(value)} + safe={this.isSafe(value)}/> ); } )} diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 4ce11295e..1cd3caa8c 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -2,7 +2,7 @@ import React from 'react'; import {Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faCheckSquare, faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; function ChildCheckbox(props) { @@ -12,15 +12,22 @@ function ChildCheckbox(props) { value, disabled, label, - checkboxState + checkboxState, + safe } = props; + let displayLabel = [{label}]; + + if (!safe) { + displayLabel.push() + } + return ( onPaneClick(value)}> - {label} + {displayLabel} ); } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index e5c6c08bc..435047845 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -57,3 +57,10 @@ white-space: pre-wrap; } +.unsafe-indicator { + text-transform: uppercase; + color: #ffc107; + font-weight: 900; + margin-left: .75em; + margin-right: .75em; +} From 5942fad434b0136aeffc693033c05228977b6a45 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 08:51:30 -0500 Subject: [PATCH 17/46] ui: extract ChildCheckboxContainer component out of AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 28 +++++--------- .../components/ui-components/ChildCheckbox.js | 37 ++++++++++++++++++- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index b92ff3f1a..90d8cf818 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,12 +1,11 @@ import React from 'react'; -import {Button, Card, Form} from 'react-bootstrap'; +import {Button, Card} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; -import {getComponentHeight} from './utils/HeightCalculator'; import {getDefaultPaneParams, InfoPane} from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; -import ChildCheckbox from './ChildCheckbox'; +import ChildCheckboxContainer from './ChildCheckbox'; import {getFullDefinitionByKey} from './JsonSchemaHelpers'; function AdvancedMultiSelectHeader(props) { @@ -123,7 +122,7 @@ class AdvancedMultiSelect extends React.Component { })); } - isSafe(itemKey) { + isSafe = (itemKey) => { return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; } @@ -144,21 +143,12 @@ class AdvancedMultiSelect extends React.Component { disabled={disabled} onCheckboxClick={this.onMasterCheckboxClick} checkboxState={this.state.masterCheckboxState} hideReset={this.state.hideReset} onResetClick={this.onResetClick}/> - - { - this.enumOptions.map(({value, label}, i) => { - return ( - - ); - } - )} - + + + diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 1cd3caa8c..e740734d5 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -5,6 +5,41 @@ import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCheckSquare, faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; +import {getComponentHeight} from './utils/HeightCalculator'; + +function ChildCheckboxContainer(props) { + const { + enumOptions, + id, + multiple, + required, + disabled, + autofocus, + onPaneClick, + onCheckboxClick, + selectedValues, + isSafe + } = props; + + return( + + { + enumOptions.map(({value, label}, i) => { + return ( + + ); + } + )} + + ); +} + function ChildCheckbox(props) { const { onPaneClick, @@ -32,4 +67,4 @@ function ChildCheckbox(props) { ); } -export default ChildCheckbox; +export default ChildCheckboxContainer; From 5f9470d17c408e3a8087efb6716d9c68b59f985b Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 09:00:55 -0500 Subject: [PATCH 18/46] ui: extract WarningIcon component from ChildCheckbox.js --- .../ui/src/components/ui-components/ChildCheckbox.js | 5 +++-- .../cc/ui/src/components/ui-components/WarningIcon.js | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index e740734d5..57088f0c2 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -2,10 +2,11 @@ import React from 'react'; import {Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCheckSquare, faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; +import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; import {getComponentHeight} from './utils/HeightCalculator'; +import WarningIcon from './WarningIcon'; function ChildCheckboxContainer(props) { const { @@ -54,7 +55,7 @@ function ChildCheckbox(props) { let displayLabel = [{label}]; if (!safe) { - displayLabel.push() + displayLabel.push() } return ( diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js new file mode 100644 index 000000000..2e759ccb6 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js @@ -0,0 +1,11 @@ +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; +import React from 'react'; + +function WarningIcon() { + return ( + + ); +} + +export default WarningIcon; From 5ed102bd0957c96b2ea5f505c44292f4be2896e6 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 10:08:31 -0500 Subject: [PATCH 19/46] config_schema: fix typo in Signed script proxy execution PBA --- .../services/config_schema/definitions/post_breach_actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py index 16dc0735e..857e80da4 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py @@ -95,7 +95,7 @@ POST_BREACH_ACTIONS = { ], "title": "Signed script proxy execution", "safe": False, - "info": "On Windows systems, attemps to execute an arbitrary file " + "info": "On Windows systems, attempts to execute an arbitrary file " "with the help of a pre-existing signed script.", "attack_techniques": ["T1216"] }, From 7ec8f0394c6e64883e5e54c3d6fdb29272e9b28c Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 10:12:28 -0500 Subject: [PATCH 20/46] ui: add warning message to PBA/Exploiters InfoPane --- .../ui-components/AdvancedMultiSelect.js | 14 ++++++++-- .../src/components/ui-components/InfoPane.js | 26 +++++++++++++++++-- .../cc/ui/src/styles/components/InfoPane.scss | 7 +++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 90d8cf818..955aec509 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -113,7 +113,16 @@ class AdvancedMultiSelect extends React.Component { setPaneInfo = (itemKey) => { let definitionObj = getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey); - this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + this.setState( + { + infoPaneParams: { + title: definitionObj.title, + content: definitionObj.info, + link: definitionObj.link, + showWarning: !(this.isSafe(itemKey)) + } + } + ); } setPaneInfoToDefault() { @@ -151,7 +160,8 @@ class AdvancedMultiSelect extends React.Component { + link={this.state.infoPaneParams.link} + showWarning={this.state.infoPaneParams.showWarning}/>
); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 6e50ca66d..f0545a5c6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -4,10 +4,16 @@ import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; import {getObjectFromRegistryByRef} from './JsonSchemaHelpers'; +import WarningIcon from './WarningIcon'; function getDefaultPaneParams(refString, registry) { let configSection = getObjectFromRegistryByRef(refString, registry); - return ({title: configSection.title, content: configSection.description}); + return ( + { + title: configSection.title, + content: configSection.description, + showWarning: false + }); } function InfoPane(props) { @@ -48,11 +54,27 @@ function getSubtitle(props) { } function getBody(props) { + let body = [{props.body}]; + + if (props.showWarning) { + body.push(getWarning()); + } + return ( - {props.body} + {body} ) } +function getWarning() { + return ( +
+ This option may cause a system to become unstable or + change the system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive environments. +
+ ); +} + export {getDefaultPaneParams, InfoPane} diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index 8c61d873f..a177ed7e1 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -27,3 +27,10 @@ margin: 10px 15px; padding: 0; } + +.info-pane-warning { + margin-top: 1em; +} +.info-pane-warning .unsafe-indicator { + margin-left: 0em; +} From 9d9e8168fb2c23367b9947273aa1a041687b3e2e Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 10:18:40 -0500 Subject: [PATCH 21/46] ui: rename unsafe-indicator to warning-icon --- .../cc/ui/src/components/ui-components/ChildCheckbox.js | 2 +- .../cc/ui/src/components/ui-components/WarningIcon.js | 2 +- monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss | 2 +- .../monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 57088f0c2..47a86dab6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -55,7 +55,7 @@ function ChildCheckbox(props) { let displayLabel = [{label}]; if (!safe) { - displayLabel.push() + displayLabel.push() } return ( diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js index 2e759ccb6..e06f00ec9 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js @@ -4,7 +4,7 @@ import React from 'react'; function WarningIcon() { return ( - + ); } diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index a177ed7e1..561e436cf 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -31,6 +31,6 @@ .info-pane-warning { margin-top: 1em; } -.info-pane-warning .unsafe-indicator { +.info-pane-warning .warning-icon { margin-left: 0em; } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index 435047845..98e598c81 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -57,7 +57,7 @@ white-space: pre-wrap; } -.unsafe-indicator { +.warning-icon { text-transform: uppercase; color: #ffc107; font-weight: 900; From ce9a398f28a0e22122035f6be5bc8ab5ee6ef79a Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 10:58:42 -0500 Subject: [PATCH 22/46] swimm: autosync PBA tutorial --- .swm/JFXftJml8DpmuCPBA9rL.swm | 57 ++++++++---- .swm/tbxb2cGgUiJQ8Btma0fp.swm | 169 +++++++++++++++++++++++----------- 2 files changed, 156 insertions(+), 70 deletions(-) diff --git a/.swm/JFXftJml8DpmuCPBA9rL.swm b/.swm/JFXftJml8DpmuCPBA9rL.swm index 7c186126e..3e348a3a6 100644 --- a/.swm/JFXftJml8DpmuCPBA9rL.swm +++ b/.swm/JFXftJml8DpmuCPBA9rL.swm @@ -1,30 +1,51 @@ { "id": "JFXftJml8DpmuCPBA9rL", "name": "Add details about your new PBA", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIweW91ciUyMG5ldyUyMFBCQSdzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbi4=", - "description": "SW4lMjBvcmRlciUyMHRvJTIwbWFrZSUyMHN1cmUlMjB0aGF0JTIwdGhlJTIwbmV3JTIwJTYwU2NoZWR1bGVKb2JzJTYwJTIwUEJBJTIwaXMlMjBzaG93biUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTJDJTIweW91JTIwbmVlZCUyMHRvJTIwYWRkJTIwaXRzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGZpbGUocykuJTIwJTNDYnIlM0UlM0NiciUzRSUwQSUwQVNpbmNlJTIwdGhpcyUyMHBhcnRpY3VsYXIlMjBQQkElMjBpcyUyMHJlbGF0ZWQlMjB0byUyMHRoZSUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMCU1QlQxMTY4JTVEKGh0dHBzJTNBJTJGJTJGYXR0YWNrLm1pdHJlLm9yZyUyRnRlY2huaXF1ZXMlMkZUMTE2OCklMjBhbmQlMjAlNUJUMTA1MyU1RChodHRwcyUzQSUyRiUyRmF0dGFjay5taXRyZS5vcmclMkZ0ZWNobmlxdWVzJTJGVDEwNTMpJTJDJTIwbWFrZSUyMHN1cmUlMjB0byUyMGxpbmslMjB0aGUlMjBQQkElMjB3aXRoJTIwdGhlc2UlMjB0ZWNobmlxdWVzJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwYXMlMjB3ZWxsLiUyMCUzQ2JyJTNFJTNDYnIlM0UlMEElMEFFYWNoJTIwcGFydCUyMG9mJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGhhcyUyMGFuJTIwaW1wb3J0YW50JTIwcm9sZSUyMCUyMCUwQS0lMjAqZW51bSolMjAlRTIlODAlOTQlMjBjb250YWlucyUyMHRoZSUyMHJlbGV2YW50JTIwUEJBJ3MlMjBjbGFzcyUyMG5hbWUocyklMEEtJTIwKnRpdGxlKiUyMCVFMiU4MCU5NCUyMGhvbGRzJTIwdGhlJTIwbmFtZSUyMG9mJTIwdGhlJTIwUEJBJTIwd2hpY2glMjBpcyUyMGRpc3BsYXllZCUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTBBLSUyMCppbmZvKiUyMCVFMiU4MCU5NCUyMGNvbnNpc3RzJTIwb2YlMjBhbiUyMGVsYWJvcmF0aW9uJTIwb24lMjB0aGUlMjBQQkEncyUyMHdvcmtpbmclMjB3aGljaCUyMGlzJTIwZGlzcGxheWVkJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwKmF0dGFja190ZWNobmlxdWVzKiUyMCVFMiU4MCU5NCUyMGhhcyUyMHRoZSUyMElEcyUyMG9mJTIwdGhlJTIwTUlUUkUlMjB0ZWNobmlxdWVzJTIwYXNzb2NpYXRlZCUyMHdpdGglMjB0aGUlMjBQQkElMEElMEElMjMlMjMlMjBNYW51YWwlMjB0ZXN0JTIwJTIwJTBBT25jZSUyMHlvdSUyMHRoaW5rJTIweW91J3JlJTIwZG9uZS4uLiUwQS0lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwWW91JTIwc2hvdWxkJTIwYmUlMjBhYmxlJTIwdG8lMjBzZWUlMjB5b3VyJTIwbmV3JTIwUEJBJTIwdW5kZXIlMjB0aGUlMjAlMjJNb25rZXklMjIlMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjBhbG9uZyUyMHdpdGglMjBpdHMlMjBpbmZvcm1hdGlvbiUyMHdoZW4lMjB5b3UlMjBjbGljayUyMG9uJTIwaXQlMEEtJTIwRnVydGhlciUyQyUyMHdoZW4lMjB5b3UlMjBlbmFibGUlMkZkaXNhYmxlJTIwdGhlJTIwYXNzb2NpYXRlZCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMHVuZGVyJTIwdGhlJTIwQVRUJTI2Q0slMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjB0aGUlMjBQQkElMjBzaG91bGQlMjBhbHNvJTIwYmUlMjBlbmFibGVkJTJGZGlzYWJsZWQlMEElMEElM0NpbWclMjBzcmMlM0QlMjJodHRwcyUzQSUyRiUyRmkuaW1ndXIuY29tJTJGYTVWU2tMNS5naWYlMjIlMjBoZWlnaHQlM0Q0MDAlM0U=", - "summary": "LSUyMFRoZSUyMFBCQSUyMGRldGFpbHMlMjBpbiUyMHRoaXMlMjBmaWxlJTIwYXJlJTIwcmVmbGVjdGVkJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMjBpbiUyMHRoZSUyMFBCQSUyMGNvbmZpZ3VyYXRpb24uJTBBLSUyMFBCQXMlMjBhcmUlMjBhbHNvJTIwbGlua2VkJTIwdG8lMjB0aGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMGluJTIwdGhpcyUyMGZpbGUlMkMlMjB3aG9zZSUyMHJlc3VsdHMlMjBjYW4lMjB0aGVuJTIwYmUlMjBzZWVuJTIwaW4lMjB0aGUlMjBNSVRSRSUyMEFUVCUyNkNLJTIwcmVwb3J0JTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQu", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYxZmUwZjZmLi5jY2UzN2IyNCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTYyJTJDMTUlMjAlMkI2MiUyQzclMjAlNDAlNDAlMjBQT1NUX0JSRUFDSF9BQ1RJT05TJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyUmVtb3ZlcyUyMHRoZSUyMGZpbGUlMjBhZnRlcndhcmRzLiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmF0dGFja190ZWNobmlxdWVzJTIyJTNBJTIwJTVCJTIyVDExNjYlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJTY2hlZHVsZUpvYnMlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIySm9iJTIwc2NoZWR1bGluZyUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJpbmZvJTIyJTNBJTIwJTIyQXR0ZW1wdHMlMjB0byUyMGNyZWF0ZSUyMGElMjBzY2hlZHVsZWQlMjBqb2IlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMHJlbW92ZSUyMGl0LiUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJhdHRhY2tfdGVjaG5pcXVlcyUyMiUzQSUyMCU1QiUyMlQxMTY4JTIyJTJDJTIwJTIyVDEwNTMlMjIlNUQlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEFERCUyMERFVEFJTFMlMjBIRVJFISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add your new PBA's details to the configuration.", + "description": "In order to make sure that the new `ScheduleJobs` PBA is shown in the configuration on the Monkey Island, you need to add its details to the configuration file(s).

\n\nSince this particular PBA is related to the MITRE techniques [T1168](https://attack.mitre.org/techniques/T1168) and [T1053](https://attack.mitre.org/techniques/T1053), make sure to link the PBA with these techniques in the configuration as well.

\n\nEach part of the configuration has an important role \n- *enum* — contains the relevant PBA's class name(s)\n- *title* — holds the name of the PBA which is displayed in the configuration on the Monkey Island\n- *info* — consists of an elaboration on the PBA's working which is displayed in the configuration on the Monkey Island\n- *attack_techniques* — has the IDs of the MITRE techniques associated with the PBA\n\n## Manual test \nOnce you think you're done...\n- Run the Monkey Island\n- You should be able to see your new PBA under the \"Monkey\" tab in the configuration, along with its information when you click on it\n- Further, when you enable/disable the associated MITRE techniques under the ATT&CK tab in the configuration, the PBA should also be enabled/disabled\n\n", + "summary": "- The PBA details in this file are reflected on the Monkey Island in the PBA configuration.\n- PBAs are also linked to the relevant MITRE techniques in this file, whose results can then be seen in the MITRE ATT&CK report on the Monkey Island.", + "diff": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..cce37b24 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n@@ -68,16 +68,7 @@\n \"Removes the file afterwards.\",\n \"attack_techniques\": [\"T1166\"]\n },\n- {\n+ # Swimmer: ADD DETAILS HERE!\n- \"type\": \"string\",\n- \"enum\": [\n- \"ScheduleJobs\"\n- ],\n- \"title\": \"Job scheduling\",\n- \"safe\": True,\n- \"info\": \"Attempts to create a scheduled job on the system and remove it.\",\n- \"attack_techniques\": [\"T1168\", \"T1053\"]\n- },\n {\n \"type\": \"string\",\n \"enum\": [\n", "tests": [], "hints": [ "Have a look at the details of the other techniques." ], - "files": { + "app_version": "0.3.2", + "file_version": "1.0.4", + "swimmPatch": { "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f1fe0f6f..cce37b24", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC02MiUyQzE1JTIwJTJCNjIlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJSZW1vdmVzJTIwdGhlJTIwZmlsZSUyMGFmdGVyd2FyZHMuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjIlMkMlMjJiJTIyJTNBNjIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMTY2JTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjMlMkMlMjJiJTIyJTNBNjMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NCUyQyUyMmIlMjIlM0E2NCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMlNjaGVkdWxlSm9icyU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIySm9iJTIwc2NoZWR1bGluZyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTcwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmluZm8lNUMlMjIlM0ElMjAlNUMlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMHNjaGVkdWxlZCUyMGpvYiUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwcmVtb3ZlJTIwaXQuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyYXR0YWNrX3RlY2huaXF1ZXMlNUMlMjIlM0ElMjAlNUIlNUMlMjJUMTE2OCU1QyUyMiUyQyUyMCU1QyUyMlQxMDUzJTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQUREJTIwREVUQUlMUyUyMEhFUkUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNjUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NCUyQyUyMmIlMjIlM0E2NiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NSUyQyUyMmIlMjIlM0E2NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NiUyQyUyMmIlMjIlM0E2OCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTE1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..cce37b24 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -68,16 +68,7 @@", + " \"Removes the file afterwards.\",", + " \"attack_techniques\": [\"T1166\"]", + " },", + "- {", + "+ # Swimmer: ADD DETAILS HERE!", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"ScheduleJobs\"", + "- ],", + "- \"title\": \"Job scheduling\",", + "- \"safe\": True,", + "- \"info\": \"Attempts to create a scheduled job on the system and remove it.\",", + "- \"attack_techniques\": [\"T1168\", \"T1053\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "hunksOrder": [ + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], + "last_commit_sha_for_swimm_patch": "9d9e8168fb2c23367b9947273aa1a041687b3e2e" } \ No newline at end of file diff --git a/.swm/tbxb2cGgUiJQ8Btma0fp.swm b/.swm/tbxb2cGgUiJQ8Btma0fp.swm index e3be3fb14..e62725beb 100644 --- a/.swm/tbxb2cGgUiJQ8Btma0fp.swm +++ b/.swm/tbxb2cGgUiJQ8Btma0fp.swm @@ -1,75 +1,140 @@ { "id": "tbxb2cGgUiJQ8Btma0fp", "name": "Add a simple Post Breach action", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIwYSUyMG5ldyUyMFBCQSUyMHRvJTIwdGhlJTIwTW9ua2V5JTIwd2hpY2glMjBjcmVhdGVzJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG1hY2hpbmUu", - "description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MCUyMC0lMjBtYWtlJTIwc3VyZSUyMHlvdSUyMHNlZSUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUyMCUwQSUwQU5vdGUlMjB0aGF0JTIwdGhlJTIwUEJBJTIwc2hvdWxkJTIwaW1wYWN0JTIwdGhlJTIwVDExMzYlMjBNSVRSRSUyMHRlY2huaXF1ZSUyMGFzJTIwd2VsbCElMjAlMEElMEElMjMlMjBNYW51YWwlMjB0ZXN0JTIwdG8lMjBjb25maXJtJTBBJTBBMS4lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEyLiUyME1ha2UlMjBzdXJlJTIweW91ciUyMG5ldyUyMFBCQSUyMGlzJTIwZW5hYmxlZCUyMGJ5JTIwZGVmYXVsdCUyMGluJTIwdGhlJTIwY29uZmlnJTIwLSUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEzLiUyMFJ1biUyME1vbmtleSUwQTQuJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBzZWN1cml0eSUyMHJlcG9ydCUwQTUlMkMlMjBTZWUlMjB0aGUlMjBQQkElMjBpbiUyMHRoZSUyME1JVFJFJTIwcmVwb3J0JTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHRlY2huaXF1ZSUwQQ==", - "summary": "VGFrZSUyMGElMjBsb29rJTIwYXQlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb2YlMjB0aGUlMjBpc2xhbmQlMjBhZ2FpbiUyMC0lMjBzZWUlMjB0aGUlMjAlMjJjb21tYW5kJTIwdG8lMjBydW4lMjBhZnRlciUyMGJyZWFjaCUyMiUyMG9wdGlvbiUyMHdlJTIwb2ZmZXIlMjB0aGUlMjB1c2VyJTNGJTIwSXQncyUyMGltcGxlbWVudGVkJTIwZXhhY3RseSUyMGxpa2UlMjB5b3UlMjBkaWQlMjByaWdodCUyMG5vdyUyMGJ1dCUyMGVhY2glMjB1c2VyJTIwY2FuJTIwZG8lMjBpdCUyMGZvciUyMHRoZW1zZWx2ZXMuJTIwJTBBJTBBSG93ZXZlciUyQyUyMHdoYXQlMjBpZiUyMHRoZSUyMFBCQSUyMG5lZWRzJTIwdG8lMjBkbyUyMHN0dWZmJTIwd2hpY2glMjBpcyUyMG1vcmUlMjBjb21wbGV4JTIwdGhhbiUyMGp1c3QlMjBydW5uaW5nJTIwYSUyMGZldyUyMGNvbW1hbmRzJTNGJTIwSW4lMjB0aGF0JTIwY2FzZS4uLiUyMA==", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLjAzMWY5YWQwJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTJCJTIzJTIwU3dpbW1lciUzQSUyMFBVVCUyMFRIRSUyME5FVyUyMENPTlNUJTIwSEVSRSElMEElMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCUyMkZpbGUlMjBleGVjdXRpb24lMjIlMEElMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSUyMiUwQSUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTIyJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEFpbmRleCUyMDU4YmU4OWExLi5kODQ3NmE5NyUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBJTQwJTQwJTIwLTElMkMxNSUyMCUyQjElMkM3JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkucG9zdF9icmVhY2gucGJhJTIwaW1wb3J0JTIwUEJBJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkudXRpbHMudXNlcnMlMjBpbXBvcnQlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIlMEElMjAlMEElMjAlMEElMjBjbGFzcyUyMEJhY2tkb29yVXNlcihQQkEpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kcyUyQyUyMHdpbmRvd3NfY21kcyUyMCUzRCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciglMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24udXNlcl90b19hZGQlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24ucmVtb3RlX3VzZXJfcGFzcyklMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwYXNzJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEltcGwlMjBoZXJlISUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uZGE5OWU4NmMlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMCglMEEtJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyQiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUwQSUyMCUwQSU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwdW5zY2FubmVkX21zZyUyMCUzRCUyMCUyMk1vbmtleSUyMGRpZG4ndCUyMHRyeSUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTIwdXNlZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBjcmVhdGVkJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBLSUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiU1RCUwQSUyQiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYzZTJhOWJmLi4yYzRhYTY2NCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTQlMkMxNSUyMCUyQjQlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pZ2h0JTIwZG8lMjBhZnRlciUyMGJyZWFjaGluZyUyMGElMjBuZXclMjBtYWNoaW5lLiUyMFVzZWQlMjBpbiUyMEFUVCUyNkNLJTIwYW5kJTIwWmVybyUyMHRydXN0JTIwcmVwb3J0cy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIyYW55T2YlMjIlM0ElMjAlNUIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJCYWNrZG9vclVzZXIlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQWRkJTIwbmV3JTIwUEJBJTIwaGVyZSUyMHRvJTIwY29uZmlnISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add a new PBA to the Monkey which creates a new user on the machine.", + "description": "Read [our documentation about adding a new PBA](https://www.guardicore.com/infectionmonkey/docs/development/adding-post-breach-actions/).\n\nAfter that we want you to add the BackdoorUser PBA. The commands that add users for Win and Linux can be retrieved from `get_commands_to_add_user` - make sure you see how to use this function correctly. \n\nNote that the PBA should impact the T1136 MITRE technique as well! \n\n# Manual test to confirm\n\n1. Run the Monkey Island\n2. Make sure your new PBA is enabled by default in the config - for this test, disable network scanning, exploiting, and all other PBAs\n3. Run Monkey\n4. See the PBA in the security report\n5, See the PBA in the MITRE report in the relevant technique\n", + "summary": "Take a look at the configuration of the island again - see the \"command to run after breach\" option we offer the user? It's implemented exactly like you did right now but each user can do it for themselves. \n\nHowever, what if the PBA needs to do stuff which is more complex than just running a few commands? In that case... ", + "diff": "diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py\nindex c3bba995..031f9ad0 100644\n--- a/monkey/common/data/post_breach_consts.py\n+++ b/monkey/common/data/post_breach_consts.py\n@@ -1,5 +1,5 @@\n POST_BREACH_COMMUNICATE_AS_NEW_USER = \"Communicate as new user\"\n-POST_BREACH_BACKDOOR_USER = \"Backdoor user\"\n+# Swimmer: PUT THE NEW CONST HERE!\n POST_BREACH_FILE_EXECUTION = \"File execution\"\n POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = \"Modify shell startup file\"\n POST_BREACH_HIDDEN_FILES = \"Hide files and directories\"\ndiff --git a/monkey/infection_monkey/post_breach/actions/add_user.py b/monkey/infection_monkey/post_breach/actions/add_user.py\nindex 58be89a1..d8476a97 100644\n--- a/monkey/infection_monkey/post_breach/actions/add_user.py\n+++ b/monkey/infection_monkey/post_breach/actions/add_user.py\n@@ -1,15 +1,7 @@\n-from common.data.post_breach_consts import POST_BREACH_BACKDOOR_USER\n-from infection_monkey.config import WormConfiguration\n from infection_monkey.post_breach.pba import PBA\n from infection_monkey.utils.users import get_commands_to_add_user\n \n \n class BackdoorUser(PBA):\n def __init__(self):\n- linux_cmds, windows_cmds = get_commands_to_add_user(\n+ pass # Swimmer: Impl here!\n- WormConfiguration.user_to_add,\n- WormConfiguration.remote_user_pass)\n- super(BackdoorUser, self).__init__(\n- POST_BREACH_BACKDOOR_USER,\n- linux_cmd=' '.join(linux_cmds),\n- windows_cmd=windows_cmds)\ndiff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\nindex 086a1c13..da99e86c 100644\n--- a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n@@ -1,5 +1,5 @@\n from common.data.post_breach_consts import (\n- POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER)\n+ POST_BREACH_COMMUNICATE_AS_NEW_USER)\n from monkey_island.cc.services.attack.technique_reports.pba_technique import \\\n PostBreachTechnique\n \n@@ -11,4 +11,4 @@\n unscanned_msg = \"Monkey didn't try creating a new user on the network's systems.\"\n scanned_msg = \"Monkey tried creating a new user on the network's systems, but failed.\"\n used_msg = \"Monkey created a new user on the network's systems.\"\n- pba_names = [POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER]\n+ pba_names = [POST_BREACH_COMMUNICATE_AS_NEW_USER]\ndiff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f3e2a9bf..2c4aa664 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n@@ -4,16 +4,7 @@\n \"might do after breaching a new machine. Used in ATT&CK and Zero trust reports.\",\n \"type\": \"string\",\n \"anyOf\": [\n- {\n+ # Swimmer: Add new PBA here to config!\n- \"type\": \"string\",\n- \"enum\": [\n- \"BackdoorUser\"\n- ],\n- \"title\": \"Back door user\",\n- \"safe\": True,\n- \"info\": \"Attempts to create a new user on the system and delete it afterwards.\",\n- \"attack_techniques\": [\"T1136\"]\n- },\n {\n \"type\": \"string\",\n \"enum\": [\n", "tests": [], "hints": [ "See `ScheduleJobs` PBA for an example of a PBA which only uses shell commands.", "Make sure to add the PBA to the configuration as well.", "MITRE ATT&CK technique T1136 articulates that adversaries may create an account to maintain access to victim systems, therefore, the BackdoorUser PBA is relevant to it. Make sure to map this PBA to the MITRE ATT&CK configuration and report." ], - "files": { + "app_version": "0.3.2", + "file_version": "1.0.4", + "swimmPatch": { "monkey/common/data/post_breach_consts.py": { - "index": [ - "c3bba995..031f9ad0", - "100644" - ], - "fileA": "monkey/common/data/post_breach_consts.py", - "fileB": "monkey/common/data/post_breach_consts.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTd2ltbWVyJTNBJTIwUFVUJTIwVEhFJTIwTkVXJTIwQ09OU1QlMjBIRVJFISUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCU1QyUyMkZpbGUlMjBleGVjdXRpb24lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTVDJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCU1QyUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E1JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py\nindex c3bba995..031f9ad0 100644\n--- a/monkey/common/data/post_breach_consts.py\n+++ b/monkey/common/data/post_breach_consts.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " POST_BREACH_COMMUNICATE_AS_NEW_USER = \"Communicate as new user\"", + "-POST_BREACH_BACKDOOR_USER = \"Backdoor user\"", + "+# Swimmer: PUT THE NEW CONST HERE!", + " POST_BREACH_FILE_EXECUTION = \"File execution\"", + " POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = \"Modify shell startup file\"", + " POST_BREACH_HIDDEN_FILES = \"Hide files and directories\"" + ] + } ] }, "monkey/infection_monkey/post_breach/actions/add_user.py": { - "index": [ - "58be89a1..d8476a97", - "100644" - ], - "fileA": "monkey/infection_monkey/post_breach/actions/add_user.py", - "fileB": "monkey/infection_monkey/post_breach/actions/add_user.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOCUyQyUyMmIlMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwSW1wbCUyMGhlcmUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/post_breach/actions/add_user.py b/monkey/infection_monkey/post_breach/actions/add_user.py\nindex 58be89a1..d8476a97 100644\n--- a/monkey/infection_monkey/post_breach/actions/add_user.py\n+++ b/monkey/infection_monkey/post_breach/actions/add_user.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,15 +1,7 @@", + "-from common.data.post_breach_consts import POST_BREACH_BACKDOOR_USER", + "-from infection_monkey.config import WormConfiguration", + " from infection_monkey.post_breach.pba import PBA", + " from infection_monkey.utils.users import get_commands_to_add_user", + " ", + " ", + " class BackdoorUser(PBA):", + " def __init__(self):", + "- linux_cmds, windows_cmds = get_commands_to_add_user(", + "+ pass # Swimmer: Impl here!", + "- WormConfiguration.user_to_add,", + "- WormConfiguration.remote_user_pass)", + "- super(BackdoorUser, self).__init__(", + "- POST_BREACH_BACKDOOR_USER,", + "- linux_cmd=' '.join(linux_cmds),", + "- windows_cmd=windows_cmds)" + ] + } ] }, "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py": { - "index": [ - "086a1c13..da99e86c", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "fileB": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "status": "MODIFIED", - "numLineDeletions": 2, - "numLineAdditions": 2, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSUyQyUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTExJTJDJTIybGluZXNDb3VudCUyMiUzQTQlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\nindex 086a1c13..da99e86c 100644\n--- a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " from common.data.post_breach_consts import (", + "- POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER)", + "+ POST_BREACH_COMMUNICATE_AS_NEW_USER)", + " from monkey_island.cc.services.attack.technique_reports.pba_technique import \\", + " PostBreachTechnique", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -11,4 +11,4 @@", + " unscanned_msg = \"Monkey didn't try creating a new user on the network's systems.\"", + " scanned_msg = \"Monkey tried creating a new user on the network's systems, but failed.\"", + " used_msg = \"Monkey created a new user on the network's systems.\"", + "- pba_names = [POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER]", + "+ pba_names = [POST_BREACH_COMMUNICATE_AS_NEW_USER]" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f3e2a9bf..2c4aa664", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00JTJDMTUlMjAlMkI0JTJDNyUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIybWlnaHQlMjBkbyUyMGFmdGVyJTIwYnJlYWNoaW5nJTIwYSUyMG5ldyUyMG1hY2hpbmUuJTIwVXNlZCUyMGluJTIwQVRUJTI2Q0slMjBhbmQlMjBaZXJvJTIwdHJ1c3QlMjByZXBvcnRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjJhbnlPZiU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkJhY2tkb29yVXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFjayUyMGRvb3IlMjB1c2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMkF0dGVtcHRzJTIwdG8lMjBjcmVhdGUlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwZGVsZXRlJTIwaXQlMjBhZnRlcndhcmRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmF0dGFja190ZWNobmlxdWVzJTVDJTIyJTNBJTIwJTVCJTVDJTIyVDExMzYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFN3aW1tZXIlM0ElMjBBZGQlMjBuZXclMjBQQkElMjBoZXJlJTIwdG8lMjBjb25maWchJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2JTJDJTIyYiUyMiUzQTglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTclMkMlMjJiJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCUyQyUyMmIlMjIlM0ExMCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQlMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f3e2a9bf..2c4aa664 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -4,16 +4,7 @@", + " \"might do after breaching a new machine. Used in ATT&CK and Zero trust reports.\",", + " \"type\": \"string\",", + " \"anyOf\": [", + "- {", + "+ # Swimmer: Add new PBA here to config!", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"BackdoorUser\"", + "- ],", + "- \"title\": \"Back door user\",", + "- \"safe\": True,", + "- \"info\": \"Attempts to create a new user on the system and delete it afterwards.\",", + "- \"attack_techniques\": [\"T1136\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "hunksOrder": [ + "monkey/common/data/post_breach_consts.py_0", + "monkey/infection_monkey/post_breach/actions/add_user.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_1", + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], + "last_commit_sha_for_swimm_patch": "9d9e8168fb2c23367b9947273aa1a041687b3e2e" } \ No newline at end of file From 6806e715f78eb55fb75c5d7b83c446613914855e Mon Sep 17 00:00:00 2001 From: Swimm Date: Thu, 28 Jan 2021 19:24:17 +0200 Subject: [PATCH 23/46] =?UTF-8?q?Swimm:=20update=20unit=20Add=20a=20new=20?= =?UTF-8?q?configuration=20setting=20to=20the=20Agent=20=E2=9A=99=20(id:?= =?UTF-8?q?=20AzD8XysWg1BBXCjCDkfq).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .swm/AzD8XysWg1BBXCjCDkfq.swm | 114 ++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 40 deletions(-) diff --git a/.swm/AzD8XysWg1BBXCjCDkfq.swm b/.swm/AzD8XysWg1BBXCjCDkfq.swm index 9594d72d9..83958e466 100644 --- a/.swm/AzD8XysWg1BBXCjCDkfq.swm +++ b/.swm/AzD8XysWg1BBXCjCDkfq.swm @@ -1,58 +1,92 @@ { "id": "AzD8XysWg1BBXCjCDkfq", "name": "Add a new configuration setting to the Agent ⚙", - "dod": "TWFrZSUyMHRoZSUyMG1heCUyMHZpY3RpbSUyMG51bWJlciUyMHRoYXQlMjBNb25rZXklMjB3aWxsJTIwZmluZCUyMGJlZm9yZSUyMHN0b3BwaW5nJTIwY29uZmlndXJhYmxlJTIwYnklMjB0aGUlMjB1c2VyJTIwaW5zdGVhZCUyMG9mJTIwY29uc3RhbnQu", - "description": "JTIzJTIwTWFrZSUyMHNvbWV0aGluZyUyMGNvbmZpZ3VyYWJsZSUwQSUwQUluJTIwdGhpcyUyMHVuaXQlMkMlMjB5b3UlMjB3aWxsJTIwbGVhcm4lMjBob3clMjB0byUyMGFkZCUyMGElMjBjb25maWd1cmF0aW9uJTIwb3B0aW9uJTIwdG8lMjBNb25rZXklMjBhbmQlMjBob3clMjB0byUyMHVzZSUyMGl0JTIwaW4lMjB0aGUlMjBNb25rZXklMjBBZ2VudCUyMGNvZGUuJTIwJTBBJTBBISU1QmNvbXB1dGVyJTIwZmlyZSU1RChodHRwcyUzQSUyRiUyRm1lZGlhLmdpcGh5LmNvbSUyRm1lZGlhJTJGN0o0UDdjVXVyMkRsRXJpanAzJTJGZ2lwaHkuZ2lmJTIwJTIyY29tcHV0ZXIlMjBmaXJlJTIyKSUwQSUwQSUyMyUyMyUyMFdoeSUyMGlzJTIwdGhpcyUyMGltcG9ydGFudCUzRiUwQSUwQUVuYWJsaW5nJTIwdXNlcnMlMjB0byUyMGNvbmZpZ3VyZSUyMHRoZSUyME1vbmtleSdzJTIwYmVoYXZpb3VyJTIwZ2l2ZXMlMjB0aGVtJTIwYSUyMGxvdCUyMG1vcmUlMjBmcmVlZG9tJTIwaW4lMjBob3clMjB0aGV5JTIwd2FudCUyMHRvJTIwdXNlJTIwdGhlJTIwTW9ua2V5JTIwYW5kJTIwZW5hYmxlcyUyMG1vcmUlMjB1c2UlMjBjYXNlcy4lMEElMEElMjMlMjMlMjBXaGF0JTIwaXMlMjAlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBmaW5kJTIyJTNGJTBBJTBBVGhlJTIwTW9ua2V5JTIwaGFzJTIwYSUyMGZ1bmN0aW9uJTIwd2hpY2glMjBmaW5kcyUyMCUyMnZpY3RpbSUyMiUyMG1hY2hpbmVzJTIwb24lMjB0aGUlMjBuZXR3b3JrJTIwZm9yJTIwdGhlJTIwTW9ua2V5JTIwdG8lMjB0cnklMjBhbmQlMjBleHBsb2l0LiUyMEl0J3MlMjBjYWxsZWQlMjAlNjBnZXRfdmljdGltX21hY2hpbmVzJTYwLiUyMFRoaXMlMjBmdW5jdGlvbiUyMGFjY2VwdHMlMjBhbiUyMGFyZ3VtZW50JTIwd2hpY2glMjBsaW1pdHMlMjBob3clMjBtYW55JTIwbWFjaGluZXMlMjB0aGUlMjBNb25rZXklMjBzaG91bGQlMjBmaW5kLiUwQSUwQVdlJTIwd2FudCUyMHRvJTIwbWFrZSUyMHRoYXQlMjB2YWx1ZSUyMGVkaXRhYmxlJTIwYnklMjB0aGUlMjB1c2VyJTIwaW5zdGVhZCUyMG9mJTIwY29uc3RhbnQlMjBpbiUyMHRoZSUyMGNvZGUuJTBBJTBBJTIzJTIzJTIwTWFudWFsJTIwdGVzdGluZyUwQSUwQTEuJTIwQWZ0ZXIlMjB5b3UndmUlMjBwZXJmb3JtZWQlMjB0aGUlMjByZXF1aXJlZCUyMGNoYW5nZXMlMkMlMjByZWxvYWQlMjB0aGUlMjBTZXJ2ZXIlMjBhbmQlMjBjaGVjayUyMHlvdXIlMjB2YWx1ZSUyMGV4aXN0cyUyMGluJTIwdGhlJTIwSW50ZXJuYWwlMjB0YWIlMjBvZiUyMHRoZSUyMGNvbmZpZyUyMChzZWUlMjBpbWFnZSkuJTBBJTBBISU1QiU1RChodHRwcyUzQSUyRiUyRmkuaW1ndXIuY29tJTJGZTBYQXh1Vi5wbmcpJTBBJTBBMi4lMjBTZXQlMjB0aGUlMjBuZXclMjB2YWx1ZSUyMHRvJTIwMSUyQyUyMGFuZCUyMHJ1biUyME1vbmtleSUyMGxvY2FsbHklMjAoZnJvbSUyMHNvdXJjZSkuJTIwU2VlJTIwdGhhdCUyMHRoZSUyME1vbmtleSUyMG9ubHklMjBzY2FucyUyMG9uZSUyMG1hY2hpbmUu", - "summary": "KiUyMFdoZW4lMjBjaGFuZ2luZyUyMGNvbmZpZyUyMHNjaGVtYSUyMGJ5JTIwYWRkaW5nJTIwb3IlMjBkZWxldGluZyUyMGtleXMlMkMlMjB5b3UlMjBuZWVkJTIwdG8lMjB1cGRhdGUlMjB0aGUlMjBCbGFja2JveCUyMFRlc3QlMjBjb25maWd1cmF0aW9ucyUyMGFzJTIwd2VsbCUyMCU1QmhlcmUlNUQoaHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGZ3VhcmRpY29yZSUyRm1vbmtleSUyRnRyZWUlMkZkZXZlbG9wJTJGZW52cyUyRm1vbmtleV96b28lMkZibGFja2JveCUyRmlzbGFuZF9jb25maWdzKS4=", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQWluZGV4JTIwMWZiY2I4NzYuLjY3ZWQxOWRlJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQSU0MCU0MCUyMC0xMzElMkM5JTIwJTJCMTMxJTJDNiUyMCU0MCU0MCUyMGNsYXNzJTIwQ29uZmlndXJhdGlvbihvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZXhwbG9pdGVyX2NsYXNzZXMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjAlMjBzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3NlcyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUwQS0lMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwbG9vayUyMGZvciUyMGluJTIwYSUyMHNpbmdsZSUyMHNjYW4lMjBpdGVyYXRpb24lMEEtJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZmluZCUyMCUzRCUyMDEwMCUwQS0lMEElMjAlMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwZXhwbG9pdCUyMGJlZm9yZSUyMHN0b3BwaW5nJTBBJTIwJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZXhwbG9pdCUyMCUzRCUyMDEwMCUwQSUyMCUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEFpbmRleCUyMDQ0NGJkZTQ1Li5mZjIzZjY3MSUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEElNDAlNDAlMjAtMTU4JTJDNyUyMCUyQjE1OCUyQzclMjAlNDAlNDAlMjBjbGFzcyUyMEluZmVjdGlvbk1vbmtleShvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBub3QlMjBzZWxmLl9rZWVwX3J1bm5pbmclMjBvciUyMG5vdCUyMFdvcm1Db25maWd1cmF0aW9uLmFsaXZlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMjAlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0RXb3JtQ29uZmlndXJhdGlvbi52aWN0aW1zX21heF9maW5kJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0QxMDAlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdG9wX2NhbGxiYWNrJTNEQ29udHJvbENsaWVudC5jaGVja19mb3Jfc3RvcCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpc19lbXB0eSUyMCUzRCUyMFRydWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBtYWNoaW5lJTIwaW4lMjBtYWNoaW5lcyUzQSUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUwQWluZGV4JTIwYmRiYWUyNDYuLmQ2MDQyZDM1JTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTQwJTQwJTIwLTQwJTJDMTIlMjAlMkI0MCUyQzYlMjAlNDAlNDAlMjBJTlRFUk5BTCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyTW9ua2V5JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMm9iamVjdCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnByb3BlcnRpZXMlMjIlM0ElMjAlN0IlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydmljdGltc19tYXhfZmluZCUyMiUzQSUyMCU3QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0aXRsZSUyMiUzQSUyMCUyMk1heCUyMHZpY3RpbXMlMjB0byUyMGZpbmQlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZGVmYXVsdCUyMiUzQSUyMDEwMCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJkZXNjcmlwdGlvbiUyMiUzQSUyMCUyMkRldGVybWluZXMlMjB0aGUlMjBtYXhpbXVtJTIwbnVtYmVyJTIwb2YlMjBtYWNoaW5lcyUyMHRoZSUyMG1vbmtleSUyMGlzJTIwYWxsb3dlZCUyMHRvJTIwc2NhbiUyMiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ2aWN0aW1zX21heF9leHBsb2l0JTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydGl0bGUlMjIlM0ElMjAlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBleHBsb2l0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEE=", + "dod": "Make the max victim number that Monkey will find before stopping configurable by the user instead of constant.", + "description": "# Make something configurable\n\nIn this unit, you will learn how to add a configuration option to Monkey and how to use it in the Monkey Agent code. \n\n![computer fire](https://media.giphy.com/media/7J4P7cUur2DlErijp3/giphy.gif \"computer fire\")\n\n## Why is this important?\n\nEnabling users to configure the Monkey's behaviour gives them a lot more freedom in how they want to use the Monkey and enables more use cases.\n\n## What is \"Max victims to find\"?\n\nThe Monkey has a function which finds \"victim\" machines on the network for the Monkey to try and exploit. It's called `get_victim_machines`. This function accepts an argument which limits how many machines the Monkey should find.\n\nWe want to make that value editable by the user instead of constant in the code.\n\n## Manual testing\n\n1. After you've performed the required changes, reload the Server and check your value exists in the Internal tab of the config (see image).\n\n![](https://i.imgur.com/e0XAxuV.png)\n\n2. Set the new value to 1, and run Monkey locally (from source). See that the Monkey only scans one machine.", + "summary": "* When changing config schema by adding or deleting keys, you need to update the Blackbox Test configurations as well [here](https://github.com/guardicore/monkey/tree/develop/envs/monkey_zoo/blackbox/island_configs).", + "hunksOrder": [ + "monkey/infection_monkey/config.py_0", + "monkey/infection_monkey/monkey.py_0", + "monkey/monkey_island/cc/services/config_schema/internal.py_0" + ], "tests": [], "hints": [ "Look for `victims_max_exploit` - it's rather similar." ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/infection_monkey/config.py": { - "index": [ - "1fbcb876..67ed19de", - "100644" - ], - "fileA": "monkey/infection_monkey/config.py", - "fileB": "monkey/infection_monkey/config.py", - "status": "MODIFIED", - "numLineDeletions": 3, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMzElMkM5JTIwJTJCMTMxJTJDNiUyMCU0MCU0MCUyMGNsYXNzJTIwQ29uZmlndXJhdGlvbihvYmplY3QpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGV4cGxvaXRlcl9jbGFzc2VzJTIwJTNEJTIwJTVCJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMxJTJDJTIyYiUyMiUzQTEzMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHN5c3RlbV9pbmZvX2NvbGxlY3Rvcl9jbGFzc2VzJTIwJTNEJTIwJTVCJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMyJTJDJTIyYiUyMiUzQTEzMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzMyUyQyUyMmIlMjIlM0ExMzMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIzJTIwaG93JTIwbWFueSUyMHZpY3RpbXMlMjB0byUyMGxvb2slMjBmb3IlMjBpbiUyMGElMjBzaW5nbGUlMjBzY2FuJTIwaXRlcmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHZpY3RpbXNfbWF4X2ZpbmQlMjAlM0QlMjAxMDAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMzUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIzJTIwaG93JTIwbWFueSUyMHZpY3RpbXMlMjB0byUyMGV4cGxvaXQlMjBiZWZvcmUlMjBzdG9wcGluZyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzNyUyQyUyMmIlMjIlM0ExMzQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB2aWN0aW1zX21heF9leHBsb2l0JTIwJTNEJTIwMTAwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM4JTJDJTIyYiUyMiUzQTEzNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzOSUyQyUyMmIlMjIlM0ExMzYlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMzElMkMlMjJsaW5lc0NvdW50JTIyJTNBOSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMzElMkMlMjJsaW5lc0NvdW50JTIyJTNBNiU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/config.py b/monkey/infection_monkey/config.py\nindex 1fbcb876..67ed19de 100644\n--- a/monkey/infection_monkey/config.py\n+++ b/monkey/infection_monkey/config.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -131,8 +131,6 @@", + " exploiter_classes = []\r", + " system_info_collector_classes = []\r", + " \r", + "- # how many victims to look for in a single scan iteration\r", + "- victims_max_find = 100\r", + " \r", + " # how many victims to exploit before stopping\r", + " victims_max_exploit = 100\r" + ] + } ] }, "monkey/infection_monkey/monkey.py": { - "index": [ - "444bde45..ff23f671", - "100644" - ], - "fileA": "monkey/infection_monkey/monkey.py", - "fileB": "monkey/infection_monkey/monkey.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xNTglMkM3JTIwJTJCMTU4JTJDNyUyMCU0MCU0MCUyMGNsYXNzJTIwSW5mZWN0aW9uTW9ua2V5KG9iamVjdCklM0ElMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBub3QlMjBzZWxmLl9rZWVwX3J1bm5pbmclMjBvciUyMG5vdCUyMFdvcm1Db25maWd1cmF0aW9uLmFsaXZlJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTU4JTJDJTIyYiUyMiUzQTE1OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJyZWFrJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTU5JTJDJTIyYiUyMiUzQTE1OSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2MCUyQyUyMmIlMjIlM0ExNjAlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0RXb3JtQ29uZmlndXJhdGlvbi52aWN0aW1zX21heF9maW5kJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYxJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0QxMDAlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0ExNjElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdG9wX2NhbGxiYWNrJTNEQ29udHJvbENsaWVudC5jaGVja19mb3Jfc3RvcCklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNjIlMkMlMjJiJTIyJTNBMTYyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaXNfZW1wdHklMjAlM0QlMjBUcnVlJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYzJTJDJTIyYiUyMiUzQTE2MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMG1hY2hpbmUlMjBpbiUyMG1hY2hpbmVzJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTY0JTJDJTIyYiUyMiUzQTE2NCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTE1OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTE1OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/monkey.py b/monkey/infection_monkey/monkey.py\nindex 444bde45..ff23f671 100644\n--- a/monkey/infection_monkey/monkey.py\n+++ b/monkey/infection_monkey/monkey.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -159,8 +159,6 @@", + " if not self._keep_running or not WormConfiguration.alive:\r", + " break\r", + " \r", + "- machines = self._network.get_victim_machines(max_find=WormConfiguration.victims_max_find,\r", + "- stop_callback=ControlClient.check_for_stop)\r", + " is_empty = True\r", + " for machine in machines:\r", + " if ControlClient.check_for_stop():\r" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/internal.py": { - "index": [ - "bdbae246..d6042d35", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/internal.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/internal.py", - "status": "MODIFIED", - "numLineDeletions": 6, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00MCUyQzEyJTIwJTJCNDAlMkM2JTIwJTQwJTQwJTIwSU5URVJOQUwlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydGl0bGUlNUMlMjIlM0ElMjAlNUMlMjJNb25rZXklNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MCUyQyUyMmIlMjIlM0E0MCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJvYmplY3QlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MSUyQyUyMmIlMjIlM0E0MSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnByb3BlcnRpZXMlNUMlMjIlM0ElMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MiUyQyUyMmIlMjIlM0E0MiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ2aWN0aW1zX21heF9maW5kJTVDJTIyJTNBJTIwJTdCJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydGl0bGUlNUMlMjIlM0ElMjAlNUMlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBmaW5kJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMmludGVnZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJkZWZhdWx0JTVDJTIyJTNBJTIwMTAwJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZGVzY3JpcHRpb24lNUMlMjIlM0ElMjAlNUMlMjJEZXRlcm1pbmVzJTIwdGhlJTIwbWF4aW11bSUyMG51bWJlciUyMG9mJTIwbWFjaGluZXMlMjB0aGUlMjBtb25rZXklMjBpcyUyMGFsbG93ZWQlMjB0byUyMHNjYW4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnZpY3RpbXNfbWF4X2V4cGxvaXQlNUMlMjIlM0ElMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OSUyQyUyMmIlMjIlM0E0MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyTWF4JTIwdmljdGltcyUyMHRvJTIwZXhwbG9pdCU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUwJTJDJTIyYiUyMiUzQTQ0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMmludGVnZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1MSUyQyUyMmIlMjIlM0E0NSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQwJTJDJTIybGluZXNDb3VudCUyMiUzQTEyJTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQwJTJDJTIybGluZXNDb3VudCUyMiUzQTYlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/internal.py b/monkey/monkey_island/cc/services/config_schema/internal.py\nindex bdbae246..d6042d35 100644\n--- a/monkey/monkey_island/cc/services/config_schema/internal.py\n+++ b/monkey/monkey_island/cc/services/config_schema/internal.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -40,12 +40,6 @@", + " \"title\": \"Monkey\",\r", + " \"type\": \"object\",\r", + " \"properties\": {\r", + "- \"victims_max_find\": {\r", + "- \"title\": \"Max victims to find\",\r", + "- \"type\": \"integer\",\r", + "- \"default\": 100,\r", + "- \"description\": \"Determines the maximum number of machines the monkey is allowed to scan\"\r", + "- },\r", + " \"victims_max_exploit\": {\r", + " \"title\": \"Max victims to exploit\",\r", + " \"type\": \"integer\",\r" + ] + } ] } }, - "app_version": "0.1.80", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4", + "last_commit_sha_for_swimm_patch": "17ee823b086f0b027612e2d1864930d2c5593c3e" } \ No newline at end of file From 3daedd7a41b97f8395f382cf9f639e779fb451ce Mon Sep 17 00:00:00 2001 From: Swimm Date: Thu, 28 Jan 2021 19:26:08 +0200 Subject: [PATCH 24/46] Swimm: update unit Add details about your new PBA (id: JFXftJml8DpmuCPBA9rL). --- .swm/JFXftJml8DpmuCPBA9rL.swm | 55 +++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/.swm/JFXftJml8DpmuCPBA9rL.swm b/.swm/JFXftJml8DpmuCPBA9rL.swm index 7c186126e..154c473bd 100644 --- a/.swm/JFXftJml8DpmuCPBA9rL.swm +++ b/.swm/JFXftJml8DpmuCPBA9rL.swm @@ -1,30 +1,49 @@ { "id": "JFXftJml8DpmuCPBA9rL", "name": "Add details about your new PBA", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIweW91ciUyMG5ldyUyMFBCQSdzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbi4=", - "description": "SW4lMjBvcmRlciUyMHRvJTIwbWFrZSUyMHN1cmUlMjB0aGF0JTIwdGhlJTIwbmV3JTIwJTYwU2NoZWR1bGVKb2JzJTYwJTIwUEJBJTIwaXMlMjBzaG93biUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTJDJTIweW91JTIwbmVlZCUyMHRvJTIwYWRkJTIwaXRzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGZpbGUocykuJTIwJTNDYnIlM0UlM0NiciUzRSUwQSUwQVNpbmNlJTIwdGhpcyUyMHBhcnRpY3VsYXIlMjBQQkElMjBpcyUyMHJlbGF0ZWQlMjB0byUyMHRoZSUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMCU1QlQxMTY4JTVEKGh0dHBzJTNBJTJGJTJGYXR0YWNrLm1pdHJlLm9yZyUyRnRlY2huaXF1ZXMlMkZUMTE2OCklMjBhbmQlMjAlNUJUMTA1MyU1RChodHRwcyUzQSUyRiUyRmF0dGFjay5taXRyZS5vcmclMkZ0ZWNobmlxdWVzJTJGVDEwNTMpJTJDJTIwbWFrZSUyMHN1cmUlMjB0byUyMGxpbmslMjB0aGUlMjBQQkElMjB3aXRoJTIwdGhlc2UlMjB0ZWNobmlxdWVzJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwYXMlMjB3ZWxsLiUyMCUzQ2JyJTNFJTNDYnIlM0UlMEElMEFFYWNoJTIwcGFydCUyMG9mJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGhhcyUyMGFuJTIwaW1wb3J0YW50JTIwcm9sZSUyMCUyMCUwQS0lMjAqZW51bSolMjAlRTIlODAlOTQlMjBjb250YWlucyUyMHRoZSUyMHJlbGV2YW50JTIwUEJBJ3MlMjBjbGFzcyUyMG5hbWUocyklMEEtJTIwKnRpdGxlKiUyMCVFMiU4MCU5NCUyMGhvbGRzJTIwdGhlJTIwbmFtZSUyMG9mJTIwdGhlJTIwUEJBJTIwd2hpY2glMjBpcyUyMGRpc3BsYXllZCUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTBBLSUyMCppbmZvKiUyMCVFMiU4MCU5NCUyMGNvbnNpc3RzJTIwb2YlMjBhbiUyMGVsYWJvcmF0aW9uJTIwb24lMjB0aGUlMjBQQkEncyUyMHdvcmtpbmclMjB3aGljaCUyMGlzJTIwZGlzcGxheWVkJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwKmF0dGFja190ZWNobmlxdWVzKiUyMCVFMiU4MCU5NCUyMGhhcyUyMHRoZSUyMElEcyUyMG9mJTIwdGhlJTIwTUlUUkUlMjB0ZWNobmlxdWVzJTIwYXNzb2NpYXRlZCUyMHdpdGglMjB0aGUlMjBQQkElMEElMEElMjMlMjMlMjBNYW51YWwlMjB0ZXN0JTIwJTIwJTBBT25jZSUyMHlvdSUyMHRoaW5rJTIweW91J3JlJTIwZG9uZS4uLiUwQS0lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwWW91JTIwc2hvdWxkJTIwYmUlMjBhYmxlJTIwdG8lMjBzZWUlMjB5b3VyJTIwbmV3JTIwUEJBJTIwdW5kZXIlMjB0aGUlMjAlMjJNb25rZXklMjIlMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjBhbG9uZyUyMHdpdGglMjBpdHMlMjBpbmZvcm1hdGlvbiUyMHdoZW4lMjB5b3UlMjBjbGljayUyMG9uJTIwaXQlMEEtJTIwRnVydGhlciUyQyUyMHdoZW4lMjB5b3UlMjBlbmFibGUlMkZkaXNhYmxlJTIwdGhlJTIwYXNzb2NpYXRlZCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMHVuZGVyJTIwdGhlJTIwQVRUJTI2Q0slMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjB0aGUlMjBQQkElMjBzaG91bGQlMjBhbHNvJTIwYmUlMjBlbmFibGVkJTJGZGlzYWJsZWQlMEElMEElM0NpbWclMjBzcmMlM0QlMjJodHRwcyUzQSUyRiUyRmkuaW1ndXIuY29tJTJGYTVWU2tMNS5naWYlMjIlMjBoZWlnaHQlM0Q0MDAlM0U=", - "summary": "LSUyMFRoZSUyMFBCQSUyMGRldGFpbHMlMjBpbiUyMHRoaXMlMjBmaWxlJTIwYXJlJTIwcmVmbGVjdGVkJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMjBpbiUyMHRoZSUyMFBCQSUyMGNvbmZpZ3VyYXRpb24uJTBBLSUyMFBCQXMlMjBhcmUlMjBhbHNvJTIwbGlua2VkJTIwdG8lMjB0aGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMGluJTIwdGhpcyUyMGZpbGUlMkMlMjB3aG9zZSUyMHJlc3VsdHMlMjBjYW4lMjB0aGVuJTIwYmUlMjBzZWVuJTIwaW4lMjB0aGUlMjBNSVRSRSUyMEFUVCUyNkNLJTIwcmVwb3J0JTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQu", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYxZmUwZjZmLi5jY2UzN2IyNCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTYyJTJDMTUlMjAlMkI2MiUyQzclMjAlNDAlNDAlMjBQT1NUX0JSRUFDSF9BQ1RJT05TJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyUmVtb3ZlcyUyMHRoZSUyMGZpbGUlMjBhZnRlcndhcmRzLiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmF0dGFja190ZWNobmlxdWVzJTIyJTNBJTIwJTVCJTIyVDExNjYlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJTY2hlZHVsZUpvYnMlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIySm9iJTIwc2NoZWR1bGluZyUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJpbmZvJTIyJTNBJTIwJTIyQXR0ZW1wdHMlMjB0byUyMGNyZWF0ZSUyMGElMjBzY2hlZHVsZWQlMjBqb2IlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMHJlbW92ZSUyMGl0LiUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJhdHRhY2tfdGVjaG5pcXVlcyUyMiUzQSUyMCU1QiUyMlQxMTY4JTIyJTJDJTIwJTIyVDEwNTMlMjIlNUQlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEFERCUyMERFVEFJTFMlMjBIRVJFISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add your new PBA's details to the configuration.", + "description": "In order to make sure that the new `ScheduleJobs` PBA is shown in the configuration on the Monkey Island, you need to add its details to the configuration file(s).

\n\nSince this particular PBA is related to the MITRE techniques [T1168](https://attack.mitre.org/techniques/T1168) and [T1053](https://attack.mitre.org/techniques/T1053), make sure to link the PBA with these techniques in the configuration as well.

\n\nEach part of the configuration has an important role \n- *enum* — contains the relevant PBA's class name(s)\n- *title* — holds the name of the PBA which is displayed in the configuration on the Monkey Island\n- *info* — consists of an elaboration on the PBA's working which is displayed in the configuration on the Monkey Island\n- *attack_techniques* — has the IDs of the MITRE techniques associated with the PBA\n\n## Manual test \nOnce you think you're done...\n- Run the Monkey Island\n- You should be able to see your new PBA under the \"Monkey\" tab in the configuration, along with its information when you click on it\n- Further, when you enable/disable the associated MITRE techniques under the ATT&CK tab in the configuration, the PBA should also be enabled/disabled\n\n", + "summary": "- The PBA details in this file are reflected on the Monkey Island in the PBA configuration.\n- PBAs are also linked to the relevant MITRE techniques in this file, whose results can then be seen in the MITRE ATT&CK report on the Monkey Island.", + "hunksOrder": [ + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], "tests": [], "hints": [ "Have a look at the details of the other techniques." ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f1fe0f6f..cce37b24", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC02MiUyQzE1JTIwJTJCNjIlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJSZW1vdmVzJTIwdGhlJTIwZmlsZSUyMGFmdGVyd2FyZHMuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjIlMkMlMjJiJTIyJTNBNjIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMTY2JTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjMlMkMlMjJiJTIyJTNBNjMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NCUyQyUyMmIlMjIlM0E2NCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMlNjaGVkdWxlSm9icyU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIySm9iJTIwc2NoZWR1bGluZyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTcwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmluZm8lNUMlMjIlM0ElMjAlNUMlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMHNjaGVkdWxlZCUyMGpvYiUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwcmVtb3ZlJTIwaXQuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyYXR0YWNrX3RlY2huaXF1ZXMlNUMlMjIlM0ElMjAlNUIlNUMlMjJUMTE2OCU1QyUyMiUyQyUyMCU1QyUyMlQxMDUzJTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQUREJTIwREVUQUlMUyUyMEhFUkUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNjUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NCUyQyUyMmIlMjIlM0E2NiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NSUyQyUyMmIlMjIlM0E2NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NiUyQyUyMmIlMjIlM0E2OCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTE1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..b231f96c 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -62,15 +62,7 @@", + " \"Removes the file afterwards.\",", + " \"attack_techniques\": [\"T1166\"]", + " },", + "- {", + "+ # Swimmer: ADD DETAILS HERE!\",", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"ScheduleJobs\"", + "- ],", + "- \"title\": \"Job scheduling\",", + "- \"info\": \"Attempts to create a scheduled job on the system and remove it.\",", + "- \"attack_techniques\": [\"T1168\", \"T1053\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From a76eacf2405d943172d614af9fe25e97893653ad Mon Sep 17 00:00:00 2001 From: Swimm Date: Thu, 28 Jan 2021 19:29:21 +0200 Subject: [PATCH 25/46] Swimm: update unit Add a simple Post Breach action (id: tbxb2cGgUiJQ8Btma0fp). --- .swm/tbxb2cGgUiJQ8Btma0fp.swm | 167 +++++++++++++++++++++++----------- 1 file changed, 115 insertions(+), 52 deletions(-) diff --git a/.swm/tbxb2cGgUiJQ8Btma0fp.swm b/.swm/tbxb2cGgUiJQ8Btma0fp.swm index e3be3fb14..406ded500 100644 --- a/.swm/tbxb2cGgUiJQ8Btma0fp.swm +++ b/.swm/tbxb2cGgUiJQ8Btma0fp.swm @@ -1,75 +1,138 @@ { "id": "tbxb2cGgUiJQ8Btma0fp", "name": "Add a simple Post Breach action", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIwYSUyMG5ldyUyMFBCQSUyMHRvJTIwdGhlJTIwTW9ua2V5JTIwd2hpY2glMjBjcmVhdGVzJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG1hY2hpbmUu", - "description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MCUyMC0lMjBtYWtlJTIwc3VyZSUyMHlvdSUyMHNlZSUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUyMCUwQSUwQU5vdGUlMjB0aGF0JTIwdGhlJTIwUEJBJTIwc2hvdWxkJTIwaW1wYWN0JTIwdGhlJTIwVDExMzYlMjBNSVRSRSUyMHRlY2huaXF1ZSUyMGFzJTIwd2VsbCElMjAlMEElMEElMjMlMjBNYW51YWwlMjB0ZXN0JTIwdG8lMjBjb25maXJtJTBBJTBBMS4lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEyLiUyME1ha2UlMjBzdXJlJTIweW91ciUyMG5ldyUyMFBCQSUyMGlzJTIwZW5hYmxlZCUyMGJ5JTIwZGVmYXVsdCUyMGluJTIwdGhlJTIwY29uZmlnJTIwLSUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEzLiUyMFJ1biUyME1vbmtleSUwQTQuJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBzZWN1cml0eSUyMHJlcG9ydCUwQTUlMkMlMjBTZWUlMjB0aGUlMjBQQkElMjBpbiUyMHRoZSUyME1JVFJFJTIwcmVwb3J0JTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHRlY2huaXF1ZSUwQQ==", - "summary": "VGFrZSUyMGElMjBsb29rJTIwYXQlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb2YlMjB0aGUlMjBpc2xhbmQlMjBhZ2FpbiUyMC0lMjBzZWUlMjB0aGUlMjAlMjJjb21tYW5kJTIwdG8lMjBydW4lMjBhZnRlciUyMGJyZWFjaCUyMiUyMG9wdGlvbiUyMHdlJTIwb2ZmZXIlMjB0aGUlMjB1c2VyJTNGJTIwSXQncyUyMGltcGxlbWVudGVkJTIwZXhhY3RseSUyMGxpa2UlMjB5b3UlMjBkaWQlMjByaWdodCUyMG5vdyUyMGJ1dCUyMGVhY2glMjB1c2VyJTIwY2FuJTIwZG8lMjBpdCUyMGZvciUyMHRoZW1zZWx2ZXMuJTIwJTBBJTBBSG93ZXZlciUyQyUyMHdoYXQlMjBpZiUyMHRoZSUyMFBCQSUyMG5lZWRzJTIwdG8lMjBkbyUyMHN0dWZmJTIwd2hpY2glMjBpcyUyMG1vcmUlMjBjb21wbGV4JTIwdGhhbiUyMGp1c3QlMjBydW5uaW5nJTIwYSUyMGZldyUyMGNvbW1hbmRzJTNGJTIwSW4lMjB0aGF0JTIwY2FzZS4uLiUyMA==", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLjAzMWY5YWQwJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTJCJTIzJTIwU3dpbW1lciUzQSUyMFBVVCUyMFRIRSUyME5FVyUyMENPTlNUJTIwSEVSRSElMEElMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCUyMkZpbGUlMjBleGVjdXRpb24lMjIlMEElMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSUyMiUwQSUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTIyJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEFpbmRleCUyMDU4YmU4OWExLi5kODQ3NmE5NyUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBJTQwJTQwJTIwLTElMkMxNSUyMCUyQjElMkM3JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkucG9zdF9icmVhY2gucGJhJTIwaW1wb3J0JTIwUEJBJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkudXRpbHMudXNlcnMlMjBpbXBvcnQlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIlMEElMjAlMEElMjAlMEElMjBjbGFzcyUyMEJhY2tkb29yVXNlcihQQkEpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kcyUyQyUyMHdpbmRvd3NfY21kcyUyMCUzRCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciglMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24udXNlcl90b19hZGQlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24ucmVtb3RlX3VzZXJfcGFzcyklMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwYXNzJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEltcGwlMjBoZXJlISUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uZGE5OWU4NmMlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMCglMEEtJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyQiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUwQSUyMCUwQSU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwdW5zY2FubmVkX21zZyUyMCUzRCUyMCUyMk1vbmtleSUyMGRpZG4ndCUyMHRyeSUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTIwdXNlZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBjcmVhdGVkJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBLSUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiU1RCUwQSUyQiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYzZTJhOWJmLi4yYzRhYTY2NCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTQlMkMxNSUyMCUyQjQlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pZ2h0JTIwZG8lMjBhZnRlciUyMGJyZWFjaGluZyUyMGElMjBuZXclMjBtYWNoaW5lLiUyMFVzZWQlMjBpbiUyMEFUVCUyNkNLJTIwYW5kJTIwWmVybyUyMHRydXN0JTIwcmVwb3J0cy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIyYW55T2YlMjIlM0ElMjAlNUIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJCYWNrZG9vclVzZXIlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQWRkJTIwbmV3JTIwUEJBJTIwaGVyZSUyMHRvJTIwY29uZmlnISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add a new PBA to the Monkey which creates a new user on the machine.", + "description": "Read [our documentation about adding a new PBA](https://www.guardicore.com/infectionmonkey/docs/development/adding-post-breach-actions/).\n\nAfter that we want you to add the BackdoorUser PBA. The commands that add users for Win and Linux can be retrieved from `get_commands_to_add_user` - make sure you see how to use this function correctly. \n\nNote that the PBA should impact the T1136 MITRE technique as well! \n\n# Manual test to confirm\n\n1. Run the Monkey Island\n2. Make sure your new PBA is enabled by default in the config - for this test, disable network scanning, exploiting, and all other PBAs\n3. Run Monkey\n4. See the PBA in the security report\n5, See the PBA in the MITRE report in the relevant technique\n", + "summary": "Take a look at the configuration of the island again - see the \"command to run after breach\" option we offer the user? It's implemented exactly like you did right now but each user can do it for themselves. \n\nHowever, what if the PBA needs to do stuff which is more complex than just running a few commands? In that case... ", + "hunksOrder": [ + "monkey/common/data/post_breach_consts.py_0", + "monkey/infection_monkey/post_breach/actions/add_user.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_1", + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], "tests": [], "hints": [ "See `ScheduleJobs` PBA for an example of a PBA which only uses shell commands.", "Make sure to add the PBA to the configuration as well.", "MITRE ATT&CK technique T1136 articulates that adversaries may create an account to maintain access to victim systems, therefore, the BackdoorUser PBA is relevant to it. Make sure to map this PBA to the MITRE ATT&CK configuration and report." ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/common/data/post_breach_consts.py": { - "index": [ - "c3bba995..031f9ad0", - "100644" - ], - "fileA": "monkey/common/data/post_breach_consts.py", - "fileB": "monkey/common/data/post_breach_consts.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTd2ltbWVyJTNBJTIwUFVUJTIwVEhFJTIwTkVXJTIwQ09OU1QlMjBIRVJFISUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCU1QyUyMkZpbGUlMjBleGVjdXRpb24lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTVDJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCU1QyUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E1JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py\nindex 25e6679c..05980288 100644\n--- a/monkey/common/data/post_breach_consts.py\n+++ b/monkey/common/data/post_breach_consts.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " POST_BREACH_COMMUNICATE_AS_NEW_USER = \"Communicate as new user\"", + "-POST_BREACH_BACKDOOR_USER = \"Backdoor user\"", + "+# Swimmer: PUT THE NEW CONST HERE!", + " POST_BREACH_FILE_EXECUTION = \"File execution\"", + " POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = \"Modify shell startup file\"", + " POST_BREACH_HIDDEN_FILES = \"Hide files and directories\"" + ] + } ] }, "monkey/infection_monkey/post_breach/actions/add_user.py": { - "index": [ - "58be89a1..d8476a97", - "100644" - ], - "fileA": "monkey/infection_monkey/post_breach/actions/add_user.py", - "fileB": "monkey/infection_monkey/post_breach/actions/add_user.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOCUyQyUyMmIlMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwSW1wbCUyMGhlcmUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/post_breach/actions/add_user.py b/monkey/infection_monkey/post_breach/actions/add_user.py\nindex 58be89a1..d8476a97 100644\n--- a/monkey/infection_monkey/post_breach/actions/add_user.py\n+++ b/monkey/infection_monkey/post_breach/actions/add_user.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,15 +1,7 @@", + "-from common.data.post_breach_consts import POST_BREACH_BACKDOOR_USER", + "-from infection_monkey.config import WormConfiguration", + " from infection_monkey.post_breach.pba import PBA", + " from infection_monkey.utils.users import get_commands_to_add_user", + " ", + " ", + " class BackdoorUser(PBA):", + " def __init__(self):", + "- linux_cmds, windows_cmds = get_commands_to_add_user(", + "+ pass # Swimmer: Impl here!", + "- WormConfiguration.user_to_add,", + "- WormConfiguration.remote_user_pass)", + "- super(BackdoorUser, self).__init__(", + "- POST_BREACH_BACKDOOR_USER,", + "- linux_cmd=' '.join(linux_cmds),", + "- windows_cmd=windows_cmds)" + ] + } ] }, "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py": { - "index": [ - "086a1c13..da99e86c", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "fileB": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "status": "MODIFIED", - "numLineDeletions": 2, - "numLineAdditions": 2, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSUyQyUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTExJTJDJTIybGluZXNDb3VudCUyMiUzQTQlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\nindex 086a1c13..9f23bb8d 100644\n--- a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " from common.data.post_breach_consts import (", + "- POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER)", + "+ POST_BREACH_BACKDOOR_USER)", + " from monkey_island.cc.services.attack.technique_reports.pba_technique import \\", + " PostBreachTechnique", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -11,4 +11,4 @@", + " unscanned_msg = \"Monkey didn't try creating a new user on the network's systems.\"", + " scanned_msg = \"Monkey tried creating a new user on the network's systems, but failed.\"", + " used_msg = \"Monkey created a new user on the network's systems.\"", + "- pba_names = [POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER]", + "+ pba_names = [POST_BREACH_BACKDOOR_USER]" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f3e2a9bf..2c4aa664", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00JTJDMTUlMjAlMkI0JTJDNyUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIybWlnaHQlMjBkbyUyMGFmdGVyJTIwYnJlYWNoaW5nJTIwYSUyMG5ldyUyMG1hY2hpbmUuJTIwVXNlZCUyMGluJTIwQVRUJTI2Q0slMjBhbmQlMjBaZXJvJTIwdHJ1c3QlMjByZXBvcnRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjJhbnlPZiU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkJhY2tkb29yVXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFjayUyMGRvb3IlMjB1c2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMkF0dGVtcHRzJTIwdG8lMjBjcmVhdGUlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwZGVsZXRlJTIwaXQlMjBhZnRlcndhcmRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmF0dGFja190ZWNobmlxdWVzJTVDJTIyJTNBJTIwJTVCJTVDJTIyVDExMzYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFN3aW1tZXIlM0ElMjBBZGQlMjBuZXclMjBQQkElMjBoZXJlJTIwdG8lMjBjb25maWchJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2JTJDJTIyYiUyMiUzQTglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTclMkMlMjJiJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCUyQyUyMmIlMjIlM0ExMCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQlMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..39ebd33a 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -4,15 +4,7 @@", + " \"might do after breaching a new machine. Used in ATT&CK and Zero trust reports.\",", + " \"type\": \"string\",", + " \"anyOf\": [", + "- {", + "+ # Swimmer: Add new PBA here to config!", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"BackdoorUser\"", + "- ],", + "- \"title\": \"Back door user\",", + "- \"info\": \"Attempts to create a new user on the system and delete it afterwards.\",", + "- \"attack_techniques\": [\"T1136\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From 49d37664364f2df4e0ddfce679f9a78952b78788 Mon Sep 17 00:00:00 2001 From: Swimm Date: Thu, 28 Jan 2021 19:30:48 +0200 Subject: [PATCH 26/46] =?UTF-8?q?Swimm:=20update=20unit=20Implement=20a=20?= =?UTF-8?q?new=20PBA=20=E2=80=94=20=20`ScheduleJobs`=20(id:=20VW4rf3AxRslf?= =?UTF-8?q?T7lwaug7).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .swm/VW4rf3AxRslfT7lwaug7.swm | 53 +++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/.swm/VW4rf3AxRslfT7lwaug7.swm b/.swm/VW4rf3AxRslfT7lwaug7.swm index 65090e905..c4e8df928 100644 --- a/.swm/VW4rf3AxRslfT7lwaug7.swm +++ b/.swm/VW4rf3AxRslfT7lwaug7.swm @@ -1,31 +1,48 @@ { "id": "VW4rf3AxRslfT7lwaug7", "name": "Implement a new PBA — `ScheduleJobs`", - "dod": "WW91JTIwc2hvdWxkJTIwaW1wbGVtZW50JTIwYSUyMG5ldyUyMFBCQSUyMGluJTIwTW9ua2V5JTIwd2hpY2glMjBzY2hlZHVsZXMlMjBqb2JzJTIwb24lMjB0aGUlMjBtYWNoaW5lLg==", - "description": "WW91JTIwbmVlZCUyMHRvJTIwaW1wbGVtZW50JTIwdGhlJTIwJTYwU2NoZWR1bGVKb2JzJTYwJTIwUEJBJTIwd2hpY2glMjBjcmVhdGVzJTIwc2NoZWR1bGVkJTIwam9icyUyMG9uJTIwdGhlJTIwbWFjaGluZS4lMjAlM0NiciUzRSUzQ2JyJTNFJTBBJTNDaW1nJTIwc3JjJTNEJTIyaHR0cHMlM0ElMkYlMkZtZWRpYS5naXBoeS5jb20lMkZtZWRpYSUyRmwwSzRtVkU1YjVXWjFzY3RXJTJGZ2lwaHkuZ2lmJTIyJTIwaGVpZ2h0JTNEMTc1JTNFJTNDYnIlM0UlM0NiciUzRSUwQVRoZSUyMGNvbW1hbmRzJTIwdGhhdCUyMGFkZCUyMHNjaGVkdWxlZCUyMGpvYnMlMjBmb3IlMjBXaW5kb3dzJTIwYW5kJTIwTGludXglMjBjYW4lMjBiZSUyMHJldHJpZXZlZCUyMGZyb20lMjAlNjBnZXRfY29tbWFuZHNfdG9fc2NoZWR1bGVfam9icyU2MCUyMCVFMiU4MCU5NCUyMG1ha2UlMjBzdXJlJTIweW91JTIwdW5kZXJzdGFuZCUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUwQSUwQSUyMyUyMyUyME1hbnVhbCUyMHRlc3QlMjAlMjAlMEFPbmNlJTIweW91JTIwdGhpbmslMjB5b3UncmUlMjBkb25lLi4uJTBBLSUyMFJ1biUyMHRoZSUyME1vbmtleSUyMElzbGFuZCUwQS0lMjBNYWtlJTIwc3VyZSUyMHRoZSUyMCUyMkpvYiUyMHNjaGVkdWxpbmclMjIlMjBQQkElMjBpcyUyMGVuYWJsZWQlMjBpbiUyMHRoZSUyMCUyMk1vbmtleSUyMiUyMHRhYiUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMCVFMiU4MCU5NCUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEtJTIwUnVuJTIwdGhlJTIwTW9ua2V5JTBBLSUyME1ha2UlMjBzdXJlJTIweW91JTIwc2VlJTIwdGhlJTIwUEJBJTIwd2l0aCUyMGl0cyUyMHJlc3VsdHMlMjBpbiUyMHRoZSUyMFNlY3VyaXR5JTIwcmVwb3J0JTIwYXMlMjB3ZWxsJTIwYXMlMjBpbiUyMHRoZSUyMEFUVCUyNkNLJTIwcmVwb3J0JTIwdW5kZXIlMjB0aGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlJTBBJTBBJTNDaW1nJTIwc3JjJTNEJTIyaHR0cHMlM0ElMkYlMkZmaXJlYmFzZXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20lMkZ2MCUyRmIlMkZzd2ltbWlvLWNvbnRlbnQlMkZvJTJGcmVwb3NpdG9yaWVzJTI1MkY2TmxiOTlOdFk1RmMzYlNkOHN1SCUyNTJGaW1nJTI1MkZmMGU1M2U2Yy05ZGJlLTQxZDgtOTQ1NC0yYjU3NjFjM2Y1M2EucG5nJTNGYWx0JTNEbWVkaWElMjZ0b2tlbiUzRDIxYWE0YmI4LTdlYmUtNGRhYi1hNzM5LWM3N2UwNTkxNDRkZCUyMiUyMGhlaWdodCUzRDQwMCUzRSUwQSUzQ2JyJTNFJTNDYnIlM0UlMEElM0NpbWclMjBzcmMlM0QlMjJodHRwcyUzQSUyRiUyRmZpcmViYXNlc3RvcmFnZS5nb29nbGVhcGlzLmNvbSUyRnYwJTJGYiUyRnN3aW1taW8tY29udGVudCUyRm8lMkZyZXBvc2l0b3JpZXMlMjUyRjZObGI5OU50WTVGYzNiU2Q4c3VIJTI1MkZpbWclMjUyRjUyODM4OWEwLTM1YzgtNDM4MC1iNmUyLTM1MzA2OGVkMDFlNC5wbmclM0ZhbHQlM0RtZWRpYSUyNnRva2VuJTNEMDg3NjdmNTUtODZlMi00ZjUxLThlY2YtMTNmZDZjYzI1YWQ1JTIyJTIwaGVpZ2h0JTNENDAwJTNF", - "summary": "TWFueSUyMG90aGVyJTIwUEJBcyUyMGFyZSUyMGFzJTIwc2ltcGxlJTIwYXMlMjB0aGlzJTIwb25lJTJDJTIwdXNpbmclMjBzaGVsbCUyMGNvbW1hbmRzJTIwb3IlMjBzY3JpcHRzJTIwJUUyJTgwJTk0JTIwc2VlJTIwJTYwVGltZXN0b21waW5nJTYwJTIwYW5kJTIwJTYwQWNjb3VudERpc2NvdmVyeSU2MC4lMjAlM0NiciUzRSUzQ2JyJTNFJTBBJTBBSG93ZXZlciUyQyUyMGZvciUyMGxlc3MlMjBzdHJhaWdodGZvcndhcmQlMjBvbmVzJTJDJTIweW91JTIwY2FuJTIwb3ZlcnJpZGUlMjBmdW5jdGlvbnMlMjBhbmQlMjBpbXBsZW1lbnQlMjBuZXclMjBjbGFzc2VzJTIwZGVwZW5kaW5nJTIwb24lMjB3aGF0JTIwaXMlMjByZXF1aXJlZCUyMCVFMiU4MCU5NCUyMHNlZSUyMCU2MFNpZ25lZFNjcmlwdFByb3h5RXhlY3V0aW9uJTYwJTIwYW5kJTIwJTYwTW9kaWZ5U2hlbGxTdGFydHVwRmlsZXMlNjAuJTNDYnIlM0UlM0NiciUzRSUwQSUwQVRoaXMlMjBQQkElMkMlMjBhbG9uZyUyMHdpdGglMjBhbGwlMjB0aGUlMjBvdGhlciUyMFBCQXMlMkMlMjB3aWxsJTIwcnVuJTIwb24lMjBhJTIwc3lzdGVtJTIwYWZ0ZXIlMjBpdCUyMGhhcyUyMGJlZW4lMjBicmVhY2hlZC4lMjBUaGUlMjBwdXJwb3NlJTIwb2YlMjB0aGlzJTIwY29kZSUyMGlzJTIwdG8lMjB0ZXN0JTIwd2hldGhlciUyMHRhcmdldCUyMHN5c3RlbXMlMjBhbGxvdyUyMGF0dGFja2VycyUyMHRvJTIwc2NoZWR1bGUlMjBqb2JzJTJDJTIwd2hpY2glMjB0aGV5JTIwY291bGQlMjB1c2UlMjB0byUyMHJ1biUyMG1hbGljaW91cyUyMGNvZGUlMjBhdCUyMHNvbWUlMjBzcGVjaWZpZWQlMjBkYXRlJTIwYW5kJTIwdGltZS4=", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZzY2hlZHVsZV9qb2JzLnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZzY2hlZHVsZV9qb2JzLnB5JTBBaW5kZXglMjBkNmNkZDI3Ni4uNzlhNzcyNGQlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRnNjaGVkdWxlX2pvYnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRnNjaGVkdWxlX2pvYnMucHklMEElNDAlNDAlMjAtMTAlMkMxMCUyMCUyQjEwJTJDNSUyMCU0MCU0MCUyMGNsYXNzJTIwU2NoZWR1bGVKb2JzKFBCQSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMEElMjAlMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmKSUzQSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX3NjaGVkdWxlX2pvYnMoKSUwQS0lMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoU2NoZWR1bGVKb2JzJTJDJTIwc2VsZikuX19pbml0X18obmFtZSUzRFBPU1RfQlJFQUNIX0pPQl9TQ0hFRFVMSU5HJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTBBLSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZW1vdmVfc2NoZWR1bGVkX2pvYnMoKSUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwSU1QTEVNRU5UJTIwSEVSRSElMEE=", + "dod": "You should implement a new PBA in Monkey which schedules jobs on the machine.", + "description": "You need to implement the `ScheduleJobs` PBA which creates scheduled jobs on the machine.

\n

\nThe commands that add scheduled jobs for Windows and Linux can be retrieved from `get_commands_to_schedule_jobs` — make sure you understand how to use this function correctly.\n\n## Manual test \nOnce you think you're done...\n- Run the Monkey Island\n- Make sure the \"Job scheduling\" PBA is enabled in the \"Monkey\" tab in the configuration — for this test, disable network scanning, exploiting, and all other PBAs\n- Run the Monkey\n- Make sure you see the PBA with its results in the Security report as well as in the ATT&CK report under the relevant MITRE technique\n\n\n

\n", + "summary": "Many other PBAs are as simple as this one, using shell commands or scripts — see `Timestomping` and `AccountDiscovery`.

\n\nHowever, for less straightforward ones, you can override functions and implement new classes depending on what is required — see `SignedScriptProxyExecution` and `ModifyShellStartupFiles`.

\n\nThis PBA, along with all the other PBAs, will run on a system after it has been breached. The purpose of this code is to test whether target systems allow attackers to schedule jobs, which they could use to run malicious code at some specified date and time.", + "hunksOrder": [ + "monkey/infection_monkey/post_breach/actions/schedule_jobs.py_0" + ], "tests": [], "hints": [ "Check out the `Timestomping` PBA to get an idea about the implementation.", "Don't forget to add code to remove the scheduled jobs!" ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/infection_monkey/post_breach/actions/schedule_jobs.py": { - "index": [ - "d6cdd276..79a7724d", - "100644" - ], - "fileA": "monkey/infection_monkey/post_breach/actions/schedule_jobs.py", - "fileB": "monkey/infection_monkey/post_breach/actions/schedule_jobs.py", - "status": "MODIFIED", - "numLineDeletions": 7, - "numLineAdditions": 2, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMCUyQzEwJTIwJTJCMTAlMkM1JTIwJTQwJTQwJTIwY2xhc3MlMjBTY2hlZHVsZUpvYnMoUEJBKSUzQSUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjIlNUMlMjIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCUyQyUyMmIlMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMiUyQyUyMmIlMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX3NjaGVkdWxlX2pvYnMoKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKFNjaGVkdWxlSm9icyUyQyUyMHNlbGYpLl9faW5pdF9fKG5hbWUlM0RQT1NUX0JSRUFDSF9KT0JfU0NIRURVTElORyUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE1JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZW1vdmVfc2NoZWR1bGVkX2pvYnMoKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFzcyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMElNUExFTUVOVCUyMEhFUkUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMCUyQyUyMmxpbmVzQ291bnQlMjIlM0ExMCU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMCUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/post_breach/actions/schedule_jobs.py b/monkey/infection_monkey/post_breach/actions/schedule_jobs.py\nindex f7d8d805..06839463 100644\n--- a/monkey/infection_monkey/post_breach/actions/schedule_jobs.py\n+++ b/monkey/infection_monkey/post_breach/actions/schedule_jobs.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -10,12 +10,6 @@", + " \"\"\"", + " ", + " def __init__(self):", + "- linux_cmds, windows_cmds = get_commands_to_schedule_jobs()", + "+ pass", + " ", + "- super(ScheduleJobs, self).__init__(name=POST_BREACH_JOB_SCHEDULING,", + "+ # Swimmer: IMPLEMENT HERE!", + "- linux_cmd=' '.join(linux_cmds),", + "- windows_cmd=windows_cmds)", + "- ", + "- def run(self):", + "- super(ScheduleJobs, self).run()", + "- remove_scheduled_jobs()" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From 98e26b0be139b82641c4b8ed612e0c88e6bba225 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 11:23:24 -0500 Subject: [PATCH 27/46] ui: refactor getHideResetState() to use isSafe() --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 955aec509..834dcec3f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -108,7 +108,7 @@ class AdvancedMultiSelect extends React.Component { } getHideResetState(selectValues) { - return selectValues.every((value) => this.defaultValues.includes(value)); + return selectValues.every((value) => this.isSafe(value)); } setPaneInfo = (itemKey) => { From e43c91e87e68ca67317ba727f862752db4882ca4 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 13:06:21 -0500 Subject: [PATCH 28/46] ui: Show warning message when master checkbox selected with unsafe --- .../ui-components/AdvancedMultiSelect.js | 37 ++++++++++------ .../src/components/ui-components/InfoPane.js | 43 +++++++++++++------ 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 834dcec3f..575dbae8e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -3,7 +3,7 @@ import {Button, Card} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; -import {getDefaultPaneParams, InfoPane} from './InfoPane'; +import {getDefaultPaneParams, InfoPane, WarningType} from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckboxContainer from './ChildCheckbox'; import {getFullDefinitionByKey} from './JsonSchemaHelpers'; @@ -41,7 +41,11 @@ class AdvancedMultiSelect extends React.Component { this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), hideReset: this.getHideResetState(props.value), - infoPaneParams: getDefaultPaneParams(this.infoPaneRefString, this.registry) + infoPaneParams: getDefaultPaneParams( + this.infoPaneRefString, + this.registry, + this.unsafeOptionsSelected(this.props.value) + ) }; } @@ -55,6 +59,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(newValues); this.setMasterCheckboxState(newValues); this.setHideResetState(newValues); + this.setPaneInfoToDefault(this.unsafeOptionsSelected(newValues)); } onChildCheckboxClick = (value) => { @@ -98,7 +103,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(this.defaultValues); this.setHideResetState(this.defaultValues); this.setMasterCheckboxState(this.defaultValues); - this.setPaneInfoToDefault(); + this.setPaneInfoToDefault(this.unsafeOptionsSelected(this.defaultValues)); } setHideResetState(selectValues) { @@ -108,7 +113,15 @@ class AdvancedMultiSelect extends React.Component { } getHideResetState(selectValues) { - return selectValues.every((value) => this.isSafe(value)); + return !(this.unsafeOptionsSelected(selectValues)) + } + + unsafeOptionsSelected(selectValues) { + return !(selectValues.every((value) => this.isSafe(value))); + } + + isSafe = (itemKey) => { + return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; } setPaneInfo = (itemKey) => { @@ -119,22 +132,22 @@ class AdvancedMultiSelect extends React.Component { title: definitionObj.title, content: definitionObj.info, link: definitionObj.link, - showWarning: !(this.isSafe(itemKey)) + warningType: !(this.isSafe(itemKey)) ? WarningType.SINGLE : WarningType.NONE } } ); } - setPaneInfoToDefault() { + setPaneInfoToDefault(unsafeOptionsSelected) { this.setState(() => ({ - infoPaneParams: getDefaultPaneParams(this.props.schema.items.$ref, this.props.registry) + infoPaneParams: getDefaultPaneParams( + this.props.schema.items.$ref, + this.props.registry, + unsafeOptionsSelected + ) })); } - isSafe = (itemKey) => { - return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; - } - render() { const { schema, @@ -161,7 +174,7 @@ class AdvancedMultiSelect extends React.Component { + warningType={this.state.infoPaneParams.warningType}/>
); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index f0545a5c6..841eafe16 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -6,13 +6,19 @@ import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; import {getObjectFromRegistryByRef} from './JsonSchemaHelpers'; import WarningIcon from './WarningIcon'; -function getDefaultPaneParams(refString, registry) { +const WarningType = { + NONE: 0, + SINGLE: 1, + MULTIPLE: 2 +} + +function getDefaultPaneParams(refString, registry, unsafeOptionsSelected) { let configSection = getObjectFromRegistryByRef(refString, registry); return ( { title: configSection.title, content: configSection.description, - showWarning: false + warningType: unsafeOptionsSelected ? WarningType.Multiple : WarningType.NONE }); } @@ -56,8 +62,8 @@ function getSubtitle(props) { function getBody(props) { let body = [{props.body}]; - if (props.showWarning) { - body.push(getWarning()); + if (props.warningType != WarningType.NONE) { + body.push(getWarning(props.warningType)); } return ( @@ -67,14 +73,25 @@ function getBody(props) { ) } -function getWarning() { - return ( -
- This option may cause a system to become unstable or - change the system's state in undesirable ways. Therefore, this option - is not recommended for use in production or other sensitive environments. -
- ); +function getWarning(warningType) { + if (warningType == WarningType.SINGLE) { + return ( +
+ This option may cause a system to become unstable or may + change a system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive environments. +
+ ); + } else { + return ( +
+ Some options have been selected that may cause a system + to become unstable or may change a system's state in undesirable ways. + Running Infection Monkey in a production or other sensitive environment + with this configuration is not recommended. +
+ ); + } } -export {getDefaultPaneParams, InfoPane} +export {getDefaultPaneParams, InfoPane, WarningType} From 61eb9a7a23ee7a2dd05cab963669b5e04607c43c Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 13:23:04 -0500 Subject: [PATCH 29/46] ui: align warning text and icon --- monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss | 3 +++ .../cc/ui/src/styles/pages/ConfigurationPage.scss | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index 561e436cf..518757713 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -30,7 +30,10 @@ .info-pane-warning { margin-top: 1em; + display: flex; } .info-pane-warning .warning-icon { + margin-top: .188em; margin-left: 0em; + margin-right: .75em; } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index 98e598c81..6bda238ea 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -62,5 +62,4 @@ color: #ffc107; font-weight: 900; margin-left: .75em; - margin-right: .75em; } From 08926d778b4b2f8c1f8384acb0fab403e4db7081 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 13:27:36 -0500 Subject: [PATCH 30/46] ui: refactor duplicate code in getWarning() --- .../src/components/ui-components/InfoPane.js | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 841eafe16..21686b468 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -75,23 +75,22 @@ function getBody(props) { function getWarning(warningType) { if (warningType == WarningType.SINGLE) { - return ( -
- This option may cause a system to become unstable or may - change a system's state in undesirable ways. Therefore, this option - is not recommended for use in production or other sensitive environments. -
- ); + var warning = This option may cause a system to become unstable or + may change a system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive + environments.; } else { - return ( -
- Some options have been selected that may cause a system - to become unstable or may change a system's state in undesirable ways. - Running Infection Monkey in a production or other sensitive environment - with this configuration is not recommended. -
- ); + warning = Some options have been selected that may cause a system + to become unstable or may change a system's state in undesirable ways. + Running Infection Monkey in a production or other sensitive environment + with this configuration is not recommended.; } + + return ( +
+ {warning} +
+ ); } export {getDefaultPaneParams, InfoPane, WarningType} From f41f896aefa83b240b8abb60c3b6d5d7d5b4cb8a Mon Sep 17 00:00:00 2001 From: Swimm Date: Thu, 28 Jan 2021 20:42:14 +0200 Subject: [PATCH 31/46] Swimm: update unit Add a new System Info Collector (id: OwcKMnALpn7tuBaJY1US). --- .swm/OwcKMnALpn7tuBaJY1US.swm | 278 ++++++++++++++++++++++++---------- 1 file changed, 202 insertions(+), 76 deletions(-) diff --git a/.swm/OwcKMnALpn7tuBaJY1US.swm b/.swm/OwcKMnALpn7tuBaJY1US.swm index 4e446cb48..a243319d2 100644 --- a/.swm/OwcKMnALpn7tuBaJY1US.swm +++ b/.swm/OwcKMnALpn7tuBaJY1US.swm @@ -1,10 +1,20 @@ { "id": "OwcKMnALpn7tuBaJY1US", "name": "Add a new System Info Collector", - "dod": "QWRkJTIwYSUyMHN5c3RlbSUyMGluZm8lMjBjb2xsZWN0b3IlMjB0aGF0JTIwY29sbGVjdHMlMjB0aGUlMjBtYWNoaW5lJTIwaG9zdG5hbWUu", - "description": "JTIzJTIwV2hhdCUyMGFyZSUyMHN5c3RlbSUyMGluZm8lMjBjb2xsZWN0b3JzJTNGJTBBJTBBV2VsbCUyQyUyMHRoZSUyMG5hbWUlMjBwcmV0dHklMjBtdWNoJTIwZXhwbGFpbnMlMjBpdC4lMjBUaGV5JTIwYXJlJTIwTW9ua2V5JTIwY2xhc3NlcyUyMHdoaWNoJTIwY29sbGVjdCUyMHZhcmlvdXMlMjBpbmZvcm1hdGlvbiUyMHJlZ2FyZGluZyUyMHRoZSUyMHZpY3RpbSUyMHN5c3RlbSUyQyUyMHN1Y2glMjBhcyUyMEVudmlyb25tZW50JTJDJTIwU1NIJTIwSW5mbyUyQyUyMFByb2Nlc3MlMjBMaXN0JTJDJTIwTmV0c3RhdCUyMGFuZCUyMG1vcmUuJTIwJTBBJTBBJTIzJTIzJTIwV2hhdCUyMHNob3VsZCUyMEklMjBhZGQlM0YlMjAlMEElMEFBJTIwc3lzdGVtJTIwaW5mbyUyMGNvbGxlY3RvciUyMHdoaWNoJTIwY29sbGVjdHMlMjB0aGUlMjBob3N0bmFtZSUyMG9mJTIwdGhlJTIwc3lzdGVtLiUwQSUwQSUyMyUyMyUyMFRlc3QlMjBtYW51YWxseSUwQSUwQU9uY2UlMjB5b3UncmUlMjBkb25lJTJDJTIwbWFrZSUyMHN1cmUlMjB0aGF0JTIweW91ciUyMGNvbGxlY3RvciUzQSUwQSolMjBBcHBlYXJzJTIwaW4lMjB0aGUlMjBJc2xhbmQlMjBjb25maWd1cmF0aW9uJTJDJTIwYW5kJTIwaXMlMjBlbmFibGVkJTIwYnklMjBkZWZhdWx0JTBBKiUyMFRoZSUyMGNvbGxlY3RvciUyMGFjdHVhbGx5JTIwcnVucyUyMHdoZW4lMjBleGVjdXRpbmclMjBhJTIwTW9ua2V5LiUwQSolMjBSZXN1bHRzJTIwc2hvdyUyMHVwJTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHBsYWNlcyUzQSUwQSUyMCUyMColMjBUaGUlMjBpbmZlY3Rpb24lMjBtYXAuJTBBJTIwJTIwKiUyMFRoZSUyMHNlY3VyaXR5JTIwcmVwb3J0LiUwQSUyMCUyMColMjBUaGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlcy4lMEElMEEqKlRoZXJlJTIwYXJlJTIwYSUyMGxvdCUyMG9mJTIwaGludHMlMjBmb3IlMjB0aGlzJTIwdW5pdCUyMC0lMjBkb24ndCUyMGJlJTIwYWZyYWlkJTIwdG8lMjB1c2UlMjB0aGVtISoq", - "summary": "U3lzdGVtJTIwaW5mbyUyMGNvbGxlY3RvcnMlMjBhcmUlMjB1c2VmdWwlMjB0byUyMGdldCUyMG1vcmUlMjBkYXRhJTIwZm9yJTIwdmFyaW91cyUyMHRoaW5ncyUyQyUyMHN1Y2glMjBhcyUyMFpUJTIwdGVzdHMlMjBvciUyME1JVFJFJTIwdGVjaG5pcXVlcy4lMjBUYWtlJTIwYSUyMGxvb2slMjBhdCUyMHNvbWUlMjBvdGhlciUyMHRlY2huaXF1ZXMh", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzLnB5JTIwYiUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzLnB5JTBBaW5kZXglMjAxNzVhMDU0ZS4uM2I0NzhkYzklMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMucHklMEElNDAlNDAlMjAtMSUyQzUlMjAlMkIxJTJDNSUyMCU0MCU0MCUwQSUyMEFXU19DT0xMRUNUT1IlMjAlM0QlMjAlMjJBd3NDb2xsZWN0b3IlMjIlMEEtSE9TVE5BTUVfQ09MTEVDVE9SJTIwJTNEJTIwJTIySG9zdG5hbWVDb2xsZWN0b3IlMjIlMEElMkIlMjMlMjBTV0lNTUVSJTNBJTIwQ29sbGVjdG9yJTIwbmFtZSUyMGdvZXMlMjBoZXJlLiUwQSUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyMCUzRCUyMCUyMkVudmlyb25tZW50Q29sbGVjdG9yJTIyJTBBJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiUyMCUzRCUyMCUyMlByb2Nlc3NMaXN0Q29sbGVjdG9yJTIyJTBBJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTIwJTNEJTIwJTIyTWltaWthdHpDb2xsZWN0b3IlMjIlMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnN5c3RlbV9pbmZvJTJGY29sbGVjdG9ycyUyRmhvc3RuYW1lX2NvbGxlY3Rvci5weSUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGc3lzdGVtX2luZm8lMkZjb2xsZWN0b3JzJTJGaG9zdG5hbWVfY29sbGVjdG9yLnB5JTBBaW5kZXglMjBhZTk1NjA4MS4uNGRjNjcwMWElMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnN5c3RlbV9pbmZvJTJGY29sbGVjdG9ycyUyRmhvc3RuYW1lX2NvbGxlY3Rvci5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGc3lzdGVtX2luZm8lMkZjb2xsZWN0b3JzJTJGaG9zdG5hbWVfY29sbGVjdG9yLnB5JTBBJTQwJTQwJTIwLTElMkMxNiUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwaW1wb3J0JTIwbG9nZ2luZyUwQS1pbXBvcnQlMjBzb2NrZXQlMEEtJTBBLWZyb20lMjBjb21tb24uZGF0YS5zeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzJTIwaW1wb3J0JTIwSE9TVE5BTUVfQ09MTEVDVE9SJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnN5c3RlbV9pbmZvLnN5c3RlbV9pbmZvX2NvbGxlY3RvciUyMGltcG9ydCUyMCU1QyUwQS0lMjAlMjAlMjAlMjBTeXN0ZW1JbmZvQ29sbGVjdG9yJTBBJTIwJTBBJTIwbG9nZ2VyJTIwJTNEJTIwbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pJTBBJTIwJTBBLSUwQS1jbGFzcyUyMEhvc3RuYW1lQ29sbGVjdG9yKFN5c3RlbUluZm9Db2xsZWN0b3IpJTNBJTBBLSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKCkuX19pbml0X18obmFtZSUzREhPU1ROQU1FX0NPTExFQ1RPUiklMEEtJTBBLSUyMCUyMCUyMCUyMGRlZiUyMGNvbGxlY3Qoc2VsZiklMjAtJTNFJTIwZGljdCUzQSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlN0IlMjJob3N0bmFtZSUyMiUzQSUyMHNvY2tldC5nZXRmcWRuKCklN0QlMEElMkIlMjMlMjBTV0lNTUVSJTNBJTIwVGhlJTIwY29sbGVjdG9yJTIwY2xhc3MlMjBnb2VzJTIwaGVyZS4lMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3Nlcy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnN5c3RlbV9pbmZvX2NvbGxlY3Rvcl9jbGFzc2VzLnB5JTBBaW5kZXglMjA1ZjExM2Y0YS4uNzA0M2UyMjclMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3Nlcy5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnN5c3RlbV9pbmZvX2NvbGxlY3Rvcl9jbGFzc2VzLnB5JTBBJTQwJTQwJTIwLTElMkM3JTIwJTJCMSUyQzYlMjAlNDAlNDAlMEElMjBmcm9tJTIwY29tbW9uLmRhdGEuc3lzdGVtX2luZm9fY29sbGVjdG9yc19uYW1lcyUyMGltcG9ydCUyMChBV1NfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwQVpVUkVfQ1JFRF9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBFTlZJUk9OTUVOVF9DT0xMRUNUT1IlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwSE9TVE5BTUVfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMEElMjAlMEElNDAlNDAlMjAtMzclMkMxNSUyMCUyQjM2JTJDNyUyMCU0MCU0MCUyMFNZU1RFTV9JTkZPX0NPTExFQ1RPUl9DTEFTU0VTJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyaW5mbyUyMiUzQSUyMCUyMklmJTIwb24lMjBBV1MlMkMlMjBjb2xsZWN0cyUyMG1vcmUlMjBpbmZvcm1hdGlvbiUyMGFib3V0JTIwdGhlJTIwQVdTJTIwaW5zdGFuY2UlMjBjdXJyZW50bHklMjBydW5uaW5nJTIwb24uJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTA4MiUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3RCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMnN0cmluZyUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUQlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydGl0bGUlMjIlM0ElMjAlMjJIb3N0bmFtZSUyMGNvbGxlY3RvciUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJpbmZvJTIyJTNBJTIwJTIyQ29sbGVjdHMlMjBtYWNoaW5lJ3MlMjBob3N0bmFtZS4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTA4MiUyMiUyQyUyMCUyMlQxMDE2JTIyJTVEJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3RCUyQyUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFNXSU1NRVIlM0ElMjBDb2xsZWN0b3IlMjBjb25maWclMjBnb2VzJTIwaGVyZS4lMjBUaXAlM0ElMjBIb3N0bmFtZSUyMGNvbGxlY3Rpb24lMjByZWxhdGVzJTIwdG8lMjB0aGUlMjBUMTA4MiUyMGFuZCUyMFQxMDE2JTIwdGVjaG5pcXVlcy4lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZtb25rZXkucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBaW5kZXglMjBiNDdkNmExNS4uMWIxOTYyYTQlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRm1vbmtleS5weSUwQSU0MCU0MCUyMC0xJTJDNyUyMCUyQjElMkM2JTIwJTQwJTQwJTBBJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMlMjBpbXBvcnQlMjAoQVdTX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEFaVVJFX0NSRURfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME1JTUlLQVRaX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBST0NFU1NfTElTVF9DT0xMRUNUT1IpJTBBJTIwJTBBJTQwJTQwJTIwLTg4JTJDNyUyMCUyQjg3JTJDNiUyMCU0MCU0MCUyME1PTktFWSUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmRlZmF1bHQlMjIlM0ElMjAlNUIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBFTlZJUk9OTUVOVF9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBV1NfQ09MTEVDVE9SJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBST0NFU1NfTElTVF9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBNSU1JS0FUWl9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBWlVSRV9DUkVEX0NPTExFQ1RPUiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRnRlbGVtZXRyeSUyRnByb2Nlc3NpbmclMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzJTJGaG9zdG5hbWUucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRmhvc3RuYW1lLnB5JTBBaW5kZXglMjBlMmRlNDUxOS4uMDRiYzM1NTYlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRmhvc3RuYW1lLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGdGVsZW1ldHJ5JTJGcHJvY2Vzc2luZyUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnMlMkZob3N0bmFtZS5weSUwQSU0MCU0MCUyMC0xJTJDOSUyMCUyQjElMkM5JTIwJTQwJTQwJTBBJTIwaW1wb3J0JTIwbG9nZ2luZyUwQSUyMCUwQS1mcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5tb2RlbHMubW9ua2V5JTIwaW1wb3J0JTIwTW9ua2V5JTBBJTJCJTIzJTIwU1dJTU1FUiUzQSUyMFRoaXMlMjB3aWxsJTIwYmUlMjB1c2VmdWwlMjAlM0EpJTIwbW9ua2V5X2lzbGFuZC5jYy5tb2RlbHMubW9ua2V5Lk1vbmtleSUyMGhhcyUyMHRoZSUyMHVzZWZ1bCUwQSUyQiUyMyUyMCUyMmdldF9zaW5nbGVfbW9ua2V5X2J5X2d1aWQlMjIlMjBhbmQlMjAlMjJzZXRfaG9zdG5hbWUlMjIlMjBtZXRob2RzLiUwQSUyMCUwQSUyMGxvZ2dlciUyMCUzRCUyMGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKSUwQSUyMCUwQSUyMCUwQS1kZWYlMjBwcm9jZXNzX2hvc3RuYW1lX3RlbGVtZXRyeShjb2xsZWN0b3JfcmVzdWx0cyUyQyUyMG1vbmtleV9ndWlkKSUzQSUwQS0lMjAlMjAlMjAlMjBNb25rZXkuZ2V0X3NpbmdsZV9tb25rZXlfYnlfZ3VpZChtb25rZXlfZ3VpZCkuc2V0X2hvc3RuYW1lKGNvbGxlY3Rvcl9yZXN1bHRzJTVCJTIyaG9zdG5hbWUlMjIlNUQpJTBBJTJCJTIzJTIwU1dJTU1FUiUzQSUyMFByb2Nlc3NpbmclMjBmdW5jdGlvbiUyMGdvZXMlMjBoZXJlLiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRnRlbGVtZXRyeSUyRnByb2Nlc3NpbmclMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzJTJGc3lzdGVtX2luZm9fdGVsZW1ldHJ5X2Rpc3BhdGNoZXIucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRnN5c3RlbV9pbmZvX3RlbGVtZXRyeV9kaXNwYXRjaGVyLnB5JTBBaW5kZXglMjA2MzlhMzkyYy4uN2FhNmQzYTYlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRnN5c3RlbV9pbmZvX3RlbGVtZXRyeV9kaXNwYXRjaGVyLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGdGVsZW1ldHJ5JTJGcHJvY2Vzc2luZyUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnMlMkZzeXN0ZW1faW5mb190ZWxlbWV0cnlfZGlzcGF0Y2hlci5weSUwQSU0MCU0MCUyMC0zJTJDMTQlMjAlMkIzJTJDMTElMjAlNDAlNDAlMjBpbXBvcnQlMjB0eXBpbmclMEElMjAlMEElMjBmcm9tJTIwY29tbW9uLmRhdGEuc3lzdGVtX2luZm9fY29sbGVjdG9yc19uYW1lcyUyMGltcG9ydCUyMChBV1NfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBST0NFU1NfTElTVF9DT0xMRUNUT1IpJTBBJTIwZnJvbSUyMG1vbmtleV9pc2xhbmQuY2Muc2VydmljZXMudGVsZW1ldHJ5LnByb2Nlc3Npbmcuc3lzdGVtX2luZm9fY29sbGVjdG9ycy5hd3MlMjBpbXBvcnQlMjAlNUMlMEElMjAlMjAlMjAlMjAlMjBwcm9jZXNzX2F3c190ZWxlbWV0cnklMEElMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy50ZWxlbWV0cnkucHJvY2Vzc2luZy5zeXN0ZW1faW5mb19jb2xsZWN0b3JzLmVudmlyb25tZW50JTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwcHJvY2Vzc19lbnZpcm9ubWVudF90ZWxlbWV0cnklMEEtZnJvbSUyMG1vbmtleV9pc2xhbmQuY2Muc2VydmljZXMudGVsZW1ldHJ5LnByb2Nlc3Npbmcuc3lzdGVtX2luZm9fY29sbGVjdG9ycy5ob3N0bmFtZSUyMGltcG9ydCUyMCU1QyUwQS0lMjAlMjAlMjAlMjBwcm9jZXNzX2hvc3RuYW1lX3RlbGVtZXRyeSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLnRlbGVtZXRyeS56ZXJvX3RydXN0X3Rlc3RzLmFudGl2aXJ1c19leGlzdGVuY2UlMjBpbXBvcnQlMjAlNUMlMEElMjAlMjAlMjAlMjAlMjB0ZXN0X2FudGl2aXJ1c19leGlzdGVuY2UlMEElMjAlMEElNDAlNDAlMjAtMTklMkM3JTIwJTJCMTYlMkM2JTIwJTQwJTQwJTIwbG9nZ2VyJTIwJTNEJTIwbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pJTBBJTIwU1lTVEVNX0lORk9fQ09MTEVDVE9SX1RPX1RFTEVNRVRSWV9QUk9DRVNTT1JTJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwQVdTX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfYXdzX3RlbGVtZXRyeSU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfZW52aXJvbm1lbnRfdGVsZW1ldHJ5JTVEJTJDJTBBLSUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfaG9zdG5hbWVfdGVsZW1ldHJ5JTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiUzQSUyMCU1QnRlc3RfYW50aXZpcnVzX2V4aXN0ZW5jZSU1RCUwQSUyMCU3RCUwQSUyMCUwQQ==", + "dod": "Add a system info collector that collects the machine hostname.", + "description": "# What are system info collectors?\n\nWell, the name pretty much explains it. They are Monkey classes which collect various information regarding the victim system, such as Environment, SSH Info, Process List, Netstat and more. \n\n## What should I add? \n\nA system info collector which collects the hostname of the system.\n\n## Test manually\n\nOnce you're done, make sure that your collector:\n* Appears in the Island configuration, and is enabled by default\n* The collector actually runs when executing a Monkey.\n* Results show up in the relevant places:\n * The infection map.\n * The security report.\n * The relevant MITRE techniques.\n\n**There are a lot of hints for this unit - don't be afraid to use them!**", + "summary": "System info collectors are useful to get more data for various things, such as ZT tests or MITRE techniques. Take a look at some other techniques!", + "hunksOrder": [ + "monkey/common/data/system_info_collectors_names.py_0", + "monkey/infection_monkey/system_info/collectors/hostname_collector.py_0", + "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py_0", + "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py_1", + "monkey/monkey_island/cc/services/config_schema/monkey.py_0", + "monkey/monkey_island/cc/services/config_schema/monkey.py_1", + "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py_0", + "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py_0", + "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py_1" + ], "tests": [], "hints": [ "First thing you should do is take a look at a different collector (like EnvironmentCollector) and 100% understand how it runs, how results are relayed back to the server, and how the server processes the data.", @@ -12,95 +22,211 @@ "Take a look at SystemInfoCollector - that's the base class you'll need to implement.", "Make sure you add the new collector to the configuration in all relevant places, including making it ON by default!" ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/common/data/system_info_collectors_names.py": { - "index": [ - "175a054e..3b478dc9", - "100644" - ], - "fileA": "monkey/common/data/system_info_collectors_names.py", - "fileB": "monkey/common/data/system_info_collectors_names.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMEFXU19DT0xMRUNUT1IlMjAlM0QlMjAlNUMlMjJBd3NDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIySE9TVE5BTUVfQ09MTEVDVE9SJTIwJTNEJTIwJTVDJTIySG9zdG5hbWVDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIzJTIwU1dJTU1FUiUzQSUyMENvbGxlY3RvciUyMG5hbWUlMjBnb2VzJTIwaGVyZS4lMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTIwJTNEJTIwJTVDJTIyRW52aXJvbm1lbnRDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQUk9DRVNTX0xJU1RfQ09MTEVDVE9SJTIwJTNEJTIwJTVDJTIyUHJvY2Vzc0xpc3RDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTJDJTIyYiUyMiUzQTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBNSU1JS0FUWl9DT0xMRUNUT1IlMjAlM0QlMjAlNUMlMjJNaW1pa2F0ekNvbGxlY3RvciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/common/data/system_info_collectors_names.py b/monkey/common/data/system_info_collectors_names.py\nindex 175a054e..3b478dc9 100644\n--- a/monkey/common/data/system_info_collectors_names.py\n+++ b/monkey/common/data/system_info_collectors_names.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " AWS_COLLECTOR = \"AwsCollector\"", + "-HOSTNAME_COLLECTOR = \"HostnameCollector\"", + "+# SWIMMER: Collector name goes here.", + " ENVIRONMENT_COLLECTOR = \"EnvironmentCollector\"", + " PROCESS_LIST_COLLECTOR = \"ProcessListCollector\"", + " MIMIKATZ_COLLECTOR = \"MimikatzCollector\"" + ] + } ] }, "monkey/infection_monkey/system_info/collectors/hostname_collector.py": { - "index": [ - "ae956081..4dc6701a", - "100644" - ], - "fileA": "monkey/infection_monkey/system_info/collectors/hostname_collector.py", - "fileB": "monkey/infection_monkey/system_info/collectors/hostname_collector.py", - "status": "MODIFIED", - "numLineDeletions": 12, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTYlMjAlMkIxJTJDNSUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBpbXBvcnQlMjBsb2dnaW5nJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSUyQyUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmltcG9ydCUyMHNvY2tldCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEuc3lzdGVtX2luZm9fY29sbGVjdG9yc19uYW1lcyUyMGltcG9ydCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGluZmVjdGlvbl9tb25rZXkuc3lzdGVtX2luZm8uc3lzdGVtX2luZm9fY29sbGVjdG9yJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBTeXN0ZW1JbmZvQ29sbGVjdG9yJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGxvZ2dlciUyMCUzRCUyMGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTglMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTklMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJjbGFzcyUyMEhvc3RuYW1lQ29sbGVjdG9yKFN5c3RlbUluZm9Db2xsZWN0b3IpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdXBlcigpLl9faW5pdF9fKG5hbWUlM0RIT1NUTkFNRV9DT0xMRUNUT1IpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwZGVmJTIwY29sbGVjdChzZWxmKSUyMC0lM0UlMjBkaWN0JTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwJTdCJTVDJTIyaG9zdG5hbWUlNUMlMjIlM0ElMjBzb2NrZXQuZ2V0ZnFkbigpJTdEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTV0lNTUVSJTNBJTIwVGhlJTIwY29sbGVjdG9yJTIwY2xhc3MlMjBnb2VzJTIwaGVyZS4lMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E1JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0ExNiU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/system_info/collectors/hostname_collector.py b/monkey/infection_monkey/system_info/collectors/hostname_collector.py\nindex ae956081..bdeb5033 100644\n--- a/monkey/infection_monkey/system_info/collectors/hostname_collector.py\n+++ b/monkey/infection_monkey/system_info/collectors/hostname_collector.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,16 +1,5 @@", + " import logging", + "-import socket", + "-", + "-from common.data.system_info_collectors_names import HOSTNAME_COLLECTOR", + "-from infection_monkey.system_info.system_info_collector import \\", + "- SystemInfoCollector", + " ", + " logger = logging.getLogger(__name__)", + " ", + "-", + "+# SWIMMER: The collector class goes here.", + "-class HostnameCollector(SystemInfoCollector):", + "- def __init__(self):", + "- super().__init__(name=HOSTNAME_COLLECTOR)", + "-", + "- def collect(self) -> dict:", + "- return {\"hostname\": socket.getfqdn()}" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py": { - "index": [ - "5f113f4a..7043e227", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py", - "status": "MODIFIED", - "numLineDeletions": 10, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNyUyMCUyQjElMkM2JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5zeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzJTIwaW1wb3J0JTIwKEFXU19DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBWlVSRV9DUkVEX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBIT1NUTkFNRV9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E2JTdEJTdEJTdEJTdE", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0zNyUyQzE1JTIwJTJCMzYlMkM3JTIwJTQwJTQwJTIwU1lTVEVNX0lORk9fQ09MTEVDVE9SX0NMQVNTRVMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMklmJTIwb24lMjBBV1MlMkMlMjBjb2xsZWN0cyUyMG1vcmUlMjBpbmZvcm1hdGlvbiUyMGFib3V0JTIwdGhlJTIwQVdTJTIwaW5zdGFuY2UlMjBjdXJyZW50bHklMjBydW5uaW5nJTIwb24uJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMzclMkMlMjJiJTIyJTNBMzYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMDgyJTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMzglMkMlMjJiJTIyJTNBMzclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzOSUyQyUyMmIlMjIlM0EzOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQ0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIySG9zdG5hbWUlMjBjb2xsZWN0b3IlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJpbmZvJTVDJTIyJTNBJTIwJTVDJTIyQ29sbGVjdHMlMjBtYWNoaW5lJ3MlMjBob3N0bmFtZS4lNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMDgyJTVDJTIyJTJDJTIwJTVDJTIyVDEwMTYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFNXSU1NRVIlM0ElMjBDb2xsZWN0b3IlMjBjb25maWclMjBnb2VzJTIwaGVyZS4lMjBUaXAlM0ElMjBIb3N0bmFtZSUyMGNvbGxlY3Rpb24lMjByZWxhdGVzJTIwdG8lMjB0aGUlMjBUMTA4MiUyMGFuZCUyMFQxMDE2JTIwdGVjaG5pcXVlcy4lMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0EzOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQ5JTJDJTIyYiUyMiUzQTQwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMnN0cmluZyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUwJTJDJTIyYiUyMiUzQTQxJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUxJTJDJTIyYiUyMiUzQTQyJTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMzclMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMzYlMkMlMjJsaW5lc0NvdW50JTIyJTNBNyU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py\nindex 174133f4..de961fbd 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,7 +1,6 @@", + " from common.data.system_info_collectors_names import (AWS_COLLECTOR,", + " AZURE_CRED_COLLECTOR,", + " ENVIRONMENT_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " MIMIKATZ_COLLECTOR,", + " PROCESS_LIST_COLLECTOR)", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -40,16 +39,7 @@", + " \"info\": \"If on AWS, collects more information about the AWS instance currently running on.\",", + " \"attack_techniques\": [\"T1082\"]", + " },", + "- {", + "+ # SWIMMER: Collector config goes here. Tip: Hostname collection relates to the T1082 and T1016 techniques.", + "- \"type\": \"string\",", + "- \"enum\": [", + "- HOSTNAME_COLLECTOR", + "- ],", + "- \"title\": \"Hostname collector\",", + "- \"safe\": True,", + "- \"info\": \"Collects machine's hostname.\",", + "- \"attack_techniques\": [\"T1082\", \"T1016\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/monkey.py": { - "index": [ - "b47d6a15..1b1962a4", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/monkey.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/monkey.py", - "status": "MODIFIED", - "numLineDeletions": 2, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNyUyMCUyQjElMkM2JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5zeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzJTIwaW1wb3J0JTIwKEFXU19DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBWlVSRV9DUkVEX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBIT1NUTkFNRV9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E2JTdEJTdEJTdEJTdE", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC04OCUyQzclMjAlMkI4NyUyQzYlMjAlNDAlNDAlMjBNT05LRVklMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZGVmYXVsdCU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTg4JTJDJTIyYiUyMiUzQTg3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBODklMkMlMjJiJTIyJTNBODglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBV1NfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTAlMkMlMjJiJTIyJTNBODklN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwSE9TVE5BTUVfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBQUk9DRVNTX0xJU1RfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTIlMkMlMjJiJTIyJTNBOTAlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBNSU1JS0FUWl9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5MyUyQyUyMmIlMjIlM0E5MSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEFaVVJFX0NSRURfQ09MTEVDVE9SJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTQlMkMlMjJiJTIyJTNBOTIlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0E4OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTg3JTJDJTIybGluZXNDb3VudCUyMiUzQTYlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/monkey.py b/monkey/monkey_island/cc/services/config_schema/monkey.py\nindex b47d6a15..1b1962a4 100644\n--- a/monkey/monkey_island/cc/services/config_schema/monkey.py\n+++ b/monkey/monkey_island/cc/services/config_schema/monkey.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,7 +1,6 @@", + " from common.data.system_info_collectors_names import (AWS_COLLECTOR,", + " AZURE_CRED_COLLECTOR,", + " ENVIRONMENT_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " MIMIKATZ_COLLECTOR,", + " PROCESS_LIST_COLLECTOR)", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -88,7 +87,6 @@", + " \"default\": [", + " ENVIRONMENT_COLLECTOR,", + " AWS_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " PROCESS_LIST_COLLECTOR,", + " MIMIKATZ_COLLECTOR,", + " AZURE_CRED_COLLECTOR" + ] + } ] }, "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py": { - "index": [ - "e2de4519..04bc3556", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py", - "fileB": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py", - "status": "MODIFIED", - "numLineDeletions": 3, - "numLineAdditions": 3, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDOSUyMCUyQjElMkM5JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGltcG9ydCUyMGxvZ2dpbmclMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMG1vbmtleV9pc2xhbmQuY2MubW9kZWxzLm1vbmtleSUyMGltcG9ydCUyME1vbmtleSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTV0lNTUVSJTNBJTIwVGhpcyUyMHdpbGwlMjBiZSUyMHVzZWZ1bCUyMCUzQSklMjBtb25rZXlfaXNsYW5kLmNjLm1vZGVscy5tb25rZXkuTW9ua2V5JTIwaGFzJTIwdGhlJTIwdXNlZnVsJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMyUyMCU1QyUyMmdldF9zaW5nbGVfbW9ua2V5X2J5X2d1aWQlNUMlMjIlMjBhbmQlMjAlNUMlMjJzZXRfaG9zdG5hbWUlNUMlMjIlMjBtZXRob2RzLiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBsb2dnZXIlMjAlM0QlMjBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTJDJTIyYiUyMiUzQTclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZGVmJTIwcHJvY2Vzc19ob3N0bmFtZV90ZWxlbWV0cnkoY29sbGVjdG9yX3Jlc3VsdHMlMkMlMjBtb25rZXlfZ3VpZCklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyME1vbmtleS5nZXRfc2luZ2xlX21vbmtleV9ieV9ndWlkKG1vbmtleV9ndWlkKS5zZXRfaG9zdG5hbWUoY29sbGVjdG9yX3Jlc3VsdHMlNUIlNUMlMjJob3N0bmFtZSU1QyUyMiU1RCklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIzJTIwU1dJTU1FUiUzQSUyMFByb2Nlc3NpbmclMjBmdW5jdGlvbiUyMGdvZXMlMjBoZXJlLiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTklN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTklN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E5JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py\nindex e2de4519..04bc3556 100644\n--- a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py\n+++ b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,9 +1,9 @@", + " import logging", + " ", + "-from monkey_island.cc.models.monkey import Monkey", + "+# SWIMMER: This will be useful :) monkey_island.cc.models.monkey.Monkey has the useful", + "+# \"get_single_monkey_by_guid\" and \"set_hostname\" methods.", + " ", + " logger = logging.getLogger(__name__)", + " ", + " ", + "-def process_hostname_telemetry(collector_results, monkey_guid):", + "+# SWIMMER: Processing function goes here.", + "- Monkey.get_single_monkey_by_guid(monkey_guid).set_hostname(collector_results[\"hostname\"])" + ] + } ] }, "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py": { - "index": [ - "639a392c..7aa6d3a6", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py", - "fileB": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py", - "status": "MODIFIED", - "numLineDeletions": 4, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0zJTJDMTQlMjAlMkIzJTJDMTElMjAlNDAlNDAlMjBpbXBvcnQlMjB0eXBpbmclMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMlMjBpbXBvcnQlMjAoQVdTX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBIT1NUTkFNRV9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy50ZWxlbWV0cnkucHJvY2Vzc2luZy5zeXN0ZW1faW5mb19jb2xsZWN0b3JzLmF3cyUyMGltcG9ydCUyMCU1QyU1QyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTglMkMlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHByb2Nlc3NfYXdzX3RlbGVtZXRyeSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTklMkMlMjJiJTIyJTNBOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLnRlbGVtZXRyeS5wcm9jZXNzaW5nLnN5c3RlbV9pbmZvX2NvbGxlY3RvcnMuZW52aXJvbm1lbnQlMjBpbXBvcnQlMjAlNUMlNUMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCUyQyUyMmIlMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwcHJvY2Vzc19lbnZpcm9ubWVudF90ZWxlbWV0cnklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMSUyQyUyMmIlMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy50ZWxlbWV0cnkucHJvY2Vzc2luZy5zeXN0ZW1faW5mb19jb2xsZWN0b3JzLmhvc3RuYW1lJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwcHJvY2Vzc19ob3N0bmFtZV90ZWxlbWV0cnklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLnRlbGVtZXRyeS56ZXJvX3RydXN0X3Rlc3RzLmFudGl2aXJ1c19leGlzdGVuY2UlMjBpbXBvcnQlMjAlNUMlNUMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCUyQyUyMmIlMjIlM0ExMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHRlc3RfYW50aXZpcnVzX2V4aXN0ZW5jZSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE1JTJDJTIyYiUyMiUzQTEyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYlMkMlMjJiJTIyJTNBMTMlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0EzJTJDJTIybGluZXNDb3VudCUyMiUzQTE0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTMlMkMlMjJsaW5lc0NvdW50JTIyJTNBMTElN0QlN0QlN0QlN0Q=", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xOSUyQzclMjAlMkIxNiUyQzYlMjAlNDAlNDAlMjBsb2dnZXIlMjAlM0QlMjBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXyklMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwU1lTVEVNX0lORk9fQ09MTEVDVE9SX1RPX1RFTEVNRVRSWV9QUk9DRVNTT1JTJTIwJTNEJTIwJTdCJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTklMkMlMjJiJTIyJTNBMTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBBV1NfQ09MTEVDVE9SJTNBJTIwJTVCcHJvY2Vzc19hd3NfdGVsZW1ldHJ5JTVEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMjAlMkMlMjJiJTIyJTNBMTclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBFTlZJUk9OTUVOVF9DT0xMRUNUT1IlM0ElMjAlNUJwcm9jZXNzX2Vudmlyb25tZW50X3RlbGVtZXRyeSU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIxJTJDJTIyYiUyMiUzQTE4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfaG9zdG5hbWVfdGVsZW1ldHJ5JTVEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMjIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBQUk9DRVNTX0xJU1RfQ09MTEVDVE9SJTNBJTIwJTVCdGVzdF9hbnRpdmlydXNfZXhpc3RlbmNlJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMjMlMkMlMjJiJTIyJTNBMTklN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlN0QlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyNCUyQyUyMmIlMjIlM0EyMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTI1JTJDJTIyYiUyMiUzQTIxJTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMTklMkMlMjJsaW5lc0NvdW50JTIyJTNBNyU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExNiUyQyUyMmxpbmVzQ291bnQlMjIlM0E2JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py\nindex 639a392c..7aa6d3a6 100644\n--- a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py\n+++ b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -3,14 +3,11 @@", + " ", + " from common.data.system_info_collectors_names import (AWS_COLLECTOR,", + " ENVIRONMENT_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " PROCESS_LIST_COLLECTOR)", + " from monkey_island.cc.services.telemetry.processing.system_info_collectors.aws import \\", + " process_aws_telemetry", + " from monkey_island.cc.services.telemetry.processing.system_info_collectors.environment import \\", + " process_environment_telemetry", + "-from monkey_island.cc.services.telemetry.processing.system_info_collectors.hostname import \\", + "- process_hostname_telemetry", + " from monkey_island.cc.services.telemetry.zero_trust_tests.antivirus_existence import \\", + " test_antivirus_existence", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -19,7 +16,6 @@", + " SYSTEM_INFO_COLLECTOR_TO_TELEMETRY_PROCESSORS = {", + " AWS_COLLECTOR: [process_aws_telemetry],", + " ENVIRONMENT_COLLECTOR: [process_environment_telemetry],", + "- HOSTNAME_COLLECTOR: [process_hostname_telemetry],", + " PROCESS_LIST_COLLECTOR: [test_antivirus_existence]", + " }", + " " + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From e77868b656b40d904fc5cc2d5bd7a2c48abbb2d8 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 13:44:14 -0500 Subject: [PATCH 32/46] ui: sort checkbox options alphabetically Alphabetically sort options in AdvancedMultiSelect to improve usability. Float "unsafe" options to the bottom so they are grouped together. --- .../ui-components/AdvancedMultiSelect.js | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 575dbae8e..6398e85db 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -33,10 +33,10 @@ class AdvancedMultiSelect extends React.Component { constructor(props) { super(props); - this.enumOptions = props.options.enumOptions; this.defaultValues = props.schema.default; this.infoPaneRefString = props.schema.items.$ref; this.registry = props.registry; + this.enumOptions = props.options.enumOptions.sort(this.compareOptions); this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), @@ -49,6 +49,27 @@ class AdvancedMultiSelect extends React.Component { }; } + // Sort options alphabetically. "Unsafe" options float to the bottom" + compareOptions = (a, b) => { + if (!this.isSafe(a.value) && this.isSafe(b.value)) { + return 1; + } + + if (this.isSafe(a.value) && !this.isSafe(b.value)) { + return -1; + } + + if (a.value < b.value) { + return -1 + } + + if (a.value > b.value) { + return 1 + } + + return 0; + } + onMasterCheckboxClick = () => { if (this.state.masterCheckboxState === MasterCheckboxState.ALL) { var newValues = []; From 117678f91a5a69a6d4d84db574cb6042692cc66c Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Thu, 28 Jan 2021 14:06:05 -0500 Subject: [PATCH 33/46] ui: fix minor css formatting issues --- .../cc/ui/src/styles/components/AdvancedMultiSelect.scss | 2 +- monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss | 1 + .../cc/ui/src/styles/pages/ConfigurationPage.scss | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss index de3d5d542..cd1297f54 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss @@ -19,7 +19,7 @@ } .advanced-multi-select .card-header .master-checkbox span { - padding-bottom: 0.188rem; + padding-bottom: 0.188rem; } .advanced-multi-select .card-header .header-title { diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index 518757713..976246cb6 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -32,6 +32,7 @@ margin-top: 1em; display: flex; } + .info-pane-warning .warning-icon { margin-top: .188em; margin-left: 0em; diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index 6bda238ea..18e09d37b 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -59,7 +59,6 @@ .warning-icon { text-transform: uppercase; - color: #ffc107; - font-weight: 900; + color: #FFC107; margin-left: .75em; } From 06685b14cfc10f97b3fd08333fe616b6443c7274 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 29 Jan 2021 10:52:14 -0500 Subject: [PATCH 34/46] ui: simplify compareOptions() with boolean arithmetic --- .../ui-components/AdvancedMultiSelect.js | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 6398e85db..5a6cc6fcd 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -51,23 +51,14 @@ class AdvancedMultiSelect extends React.Component { // Sort options alphabetically. "Unsafe" options float to the bottom" compareOptions = (a, b) => { - if (!this.isSafe(a.value) && this.isSafe(b.value)) { - return 1; + // Apparently, you can use additive operators with boolean types. Ultimately, + // the ToNumber() abstraction operation is called to convert the booleans to + // numbers: https://tc39.es/ecma262/#sec-tonumeric + if (this.isSafe(b.value) - this.isSafe(a.value) !== 0) { + return this.isSafe(b.value) - this.isSafe(a.value); } - if (this.isSafe(a.value) && !this.isSafe(b.value)) { - return -1; - } - - if (a.value < b.value) { - return -1 - } - - if (a.value > b.value) { - return 1 - } - - return 0; + return a.value.localeCompare(b.value); } onMasterCheckboxClick = () => { From 57554ca4357c1229d6089d7d0eaa0bad6f76c0e1 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 29 Jan 2021 11:02:54 -0500 Subject: [PATCH 35/46] ui: fix some code cleanliness issues --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 4 ++-- .../cc/ui/src/components/ui-components/InfoPane.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 5a6cc6fcd..4963aca7c 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -104,7 +104,7 @@ class AdvancedMultiSelect extends React.Component { return MasterCheckboxState.NONE; } - if (selectValues.length != this.enumOptions.length) { + if (selectValues.length !== this.enumOptions.length) { return MasterCheckboxState.MIXED; } @@ -144,7 +144,7 @@ class AdvancedMultiSelect extends React.Component { title: definitionObj.title, content: definitionObj.info, link: definitionObj.link, - warningType: !(this.isSafe(itemKey)) ? WarningType.SINGLE : WarningType.NONE + warningType: this.isSafe(itemKey) ? WarningType.NONE : WarningType.SINGLE } } ); diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 21686b468..902646068 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -62,7 +62,7 @@ function getSubtitle(props) { function getBody(props) { let body = [{props.body}]; - if (props.warningType != WarningType.NONE) { + if (props.warningType !== WarningType.NONE) { body.push(getWarning(props.warningType)); } @@ -74,7 +74,7 @@ function getBody(props) { } function getWarning(warningType) { - if (warningType == WarningType.SINGLE) { + if (warningType === WarningType.SINGLE) { var warning = This option may cause a system to become unstable or may change a system's state in undesirable ways. Therefore, this option is not recommended for use in production or other sensitive From 1440121aeff3d042984be265e5951aacdec96eb2 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 29 Jan 2021 11:04:46 -0500 Subject: [PATCH 36/46] ui: rename unsafeOptionsSelected() -> isUnsafeOptionSelected() --- .../ui-components/AdvancedMultiSelect.js | 14 +++++++------- .../cc/ui/src/components/ui-components/InfoPane.js | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 4963aca7c..0dc813dc6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -44,7 +44,7 @@ class AdvancedMultiSelect extends React.Component { infoPaneParams: getDefaultPaneParams( this.infoPaneRefString, this.registry, - this.unsafeOptionsSelected(this.props.value) + this.isUnsafeOptionSelected(this.props.value) ) }; } @@ -71,7 +71,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(newValues); this.setMasterCheckboxState(newValues); this.setHideResetState(newValues); - this.setPaneInfoToDefault(this.unsafeOptionsSelected(newValues)); + this.setPaneInfoToDefault(this.isUnsafeOptionSelected(newValues)); } onChildCheckboxClick = (value) => { @@ -115,7 +115,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(this.defaultValues); this.setHideResetState(this.defaultValues); this.setMasterCheckboxState(this.defaultValues); - this.setPaneInfoToDefault(this.unsafeOptionsSelected(this.defaultValues)); + this.setPaneInfoToDefault(this.isUnsafeOptionSelected(this.defaultValues)); } setHideResetState(selectValues) { @@ -125,10 +125,10 @@ class AdvancedMultiSelect extends React.Component { } getHideResetState(selectValues) { - return !(this.unsafeOptionsSelected(selectValues)) + return !(this.isUnsafeOptionSelected(selectValues)) } - unsafeOptionsSelected(selectValues) { + isUnsafeOptionSelected(selectValues) { return !(selectValues.every((value) => this.isSafe(value))); } @@ -150,12 +150,12 @@ class AdvancedMultiSelect extends React.Component { ); } - setPaneInfoToDefault(unsafeOptionsSelected) { + setPaneInfoToDefault(isUnsafeOptionSelected) { this.setState(() => ({ infoPaneParams: getDefaultPaneParams( this.props.schema.items.$ref, this.props.registry, - unsafeOptionsSelected + isUnsafeOptionSelected ) })); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 902646068..e6476d3a2 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -12,13 +12,13 @@ const WarningType = { MULTIPLE: 2 } -function getDefaultPaneParams(refString, registry, unsafeOptionsSelected) { +function getDefaultPaneParams(refString, registry, isUnsafeOptionSelected) { let configSection = getObjectFromRegistryByRef(refString, registry); return ( { title: configSection.title, content: configSection.description, - warningType: unsafeOptionsSelected ? WarningType.Multiple : WarningType.NONE + warningType: isUnsafeOptionSelected ? WarningType.Multiple : WarningType.NONE }); } From a5acf4c4b55699b0b8fbba325dfe9541497527e3 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 29 Jan 2021 21:53:42 -0500 Subject: [PATCH 37/46] github: add a more descriptive explanation of a spike --- .github/ISSUE_TEMPLATE/spike.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/spike.md b/.github/ISSUE_TEMPLATE/spike.md index 1060ccef8..d42784cba 100644 --- a/.github/ISSUE_TEMPLATE/spike.md +++ b/.github/ISSUE_TEMPLATE/spike.md @@ -1,6 +1,6 @@ --- name: "⌛Spike" -about: Create a spike. +about: Create a spike to investigate a cool idea. title: '' labels: Spike assignees: '' @@ -9,6 +9,11 @@ assignees: '' # Spike + + ## Objective _A description of this spike's objective._ From c8c763d918ef8dbb408400f9f03a4ce134c43d75 Mon Sep 17 00:00:00 2001 From: Shreya Date: Fri, 29 Jan 2021 18:48:48 +0530 Subject: [PATCH 38/46] Store converted techniques' messages (markdown to HTML) separately --- .../cc/ui/src/components/attack/techniques/T1003.js | 2 +- .../cc/ui/src/components/attack/techniques/T1005.js | 2 +- .../cc/ui/src/components/attack/techniques/T1016.js | 2 +- .../cc/ui/src/components/attack/techniques/T1018.js | 2 +- .../cc/ui/src/components/attack/techniques/T1021.js | 2 +- .../cc/ui/src/components/attack/techniques/T1035.js | 2 +- .../cc/ui/src/components/attack/techniques/T1041.js | 2 +- .../cc/ui/src/components/attack/techniques/T1053.js | 2 +- .../cc/ui/src/components/attack/techniques/T1059.js | 2 +- .../cc/ui/src/components/attack/techniques/T1064.js | 2 +- .../cc/ui/src/components/attack/techniques/T1065.js | 2 +- .../cc/ui/src/components/attack/techniques/T1075.js | 2 +- .../cc/ui/src/components/attack/techniques/T1082.js | 2 +- .../cc/ui/src/components/attack/techniques/T1086.js | 2 +- .../cc/ui/src/components/attack/techniques/T1087.js | 2 +- .../cc/ui/src/components/attack/techniques/T1090.js | 2 +- .../cc/ui/src/components/attack/techniques/T1099.js | 2 +- .../cc/ui/src/components/attack/techniques/T1105.js | 2 +- .../cc/ui/src/components/attack/techniques/T1106.js | 2 +- .../cc/ui/src/components/attack/techniques/T1107.js | 2 +- .../cc/ui/src/components/attack/techniques/T1110.js | 2 +- .../cc/ui/src/components/attack/techniques/T1129.js | 2 +- .../cc/ui/src/components/attack/techniques/T1136.js | 2 +- .../cc/ui/src/components/attack/techniques/T1145.js | 2 +- .../cc/ui/src/components/attack/techniques/T1146.js | 2 +- .../cc/ui/src/components/attack/techniques/T1154.js | 2 +- .../cc/ui/src/components/attack/techniques/T1156.js | 2 +- .../cc/ui/src/components/attack/techniques/T1158.js | 2 +- .../cc/ui/src/components/attack/techniques/T1166.js | 2 +- .../cc/ui/src/components/attack/techniques/T1168.js | 2 +- .../cc/ui/src/components/attack/techniques/T1188.js | 2 +- .../cc/ui/src/components/attack/techniques/T1197.js | 2 +- .../cc/ui/src/components/attack/techniques/T1210.js | 2 +- .../cc/ui/src/components/attack/techniques/T1216.js | 2 +- .../cc/ui/src/components/attack/techniques/T1222.js | 2 +- .../cc/ui/src/components/attack/techniques/T1504.js | 2 +- .../cc/ui/src/components/report-components/AttackReport.js | 4 ++-- 37 files changed, 38 insertions(+), 38 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1003.js b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1003.js index f58f870c1..1a93c8e06 100644 --- a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1003.js +++ b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1003.js @@ -14,7 +14,7 @@ class T1003 extends React.Component { render() { return (
-
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.services.length !== 0 ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.scripts.length !== 0 ? -
{this.props.data.message}
+
{this.props.data.message_html}
); diff --git a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1075.js b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1075.js index 330f7d129..9b2850dfa 100644 --- a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1075.js +++ b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1075.js @@ -33,7 +33,7 @@ class T1075 extends React.Component { render() { return (
-
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status !== ScanStatus.UNSCANNED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.api_uses.length !== 0 ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.deleted_files.length !== 0 ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status !== ScanStatus.UNSCANNED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.dlls.length !== 0 ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ?
-
{this.props.data.message}
+
{this.props.data.message_html}
{this.props.data.bits_jobs.length > 0 ?
BITS jobs were used in these machines:
: ''}

diff --git a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1210.js b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1210.js index 3bb6ad8c9..1a25d2ad5 100644 --- a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1210.js +++ b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1210.js @@ -95,7 +95,7 @@ class T1210 extends React.Component { let scanned_services = this.props.data.scanned_services.map(T1210.formatScanned).flat(); return (
-
{this.props.data.message}
+
{this.props.data.message_html}
{scanned_services.length > 0 ? this.renderScannedServices(scanned_services) : ''} {this.props.data.exploited_services.length > 0 ? diff --git a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1216.js b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1216.js index e608492a1..d65ab6a42 100644 --- a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1216.js +++ b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1216.js @@ -27,7 +27,7 @@ class T1216 extends React.Component { render() { return (
-
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? -
{this.props.data.message}
+
{this.props.data.message_html}

{this.props.data.status === ScanStatus.USED ? ; + techniques[tech_id]['message_html'] =
; } return techniques From 9f12702c3e835f90171a0d474d760015fb71ca53 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Mon, 1 Feb 2021 06:57:04 -0500 Subject: [PATCH 39/46] ui: code readability improvements --- .../components/ui-components/ChildCheckbox.js | 9 +--- .../src/components/ui-components/InfoPane.js | 41 ++++++++++--------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 47a86dab6..6ebe69985 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -52,18 +52,13 @@ function ChildCheckbox(props) { safe } = props; - let displayLabel = [{label}]; - - if (!safe) { - displayLabel.push() - } - return ( onPaneClick(value)}> - {displayLabel} + {label} + {!safe && } ); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index e6476d3a2..21e71e29f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -60,37 +60,38 @@ function getSubtitle(props) { } function getBody(props) { - let body = [{props.body}]; - - if (props.warningType !== WarningType.NONE) { - body.push(getWarning(props.warningType)); - } - return ( - {body} + {props.body} + {props.warningType !== WarningType.NONE && getWarning(props.warningType)} ) } function getWarning(warningType) { - if (warningType === WarningType.SINGLE) { - var warning = This option may cause a system to become unstable or - may change a system's state in undesirable ways. Therefore, this option - is not recommended for use in production or other sensitive - environments.; - } else { - warning = Some options have been selected that may cause a system - to become unstable or may change a system's state in undesirable ways. - Running Infection Monkey in a production or other sensitive environment - with this configuration is not recommended.; - } - return (
- {warning} + {warningType === WarningType.SINGLE ? getSingleOptionWarning() : getMultipleOptionsWarning()}
); } +function getSingleOptionWarning() { + return ( + This option may cause a system to become unstable or + may change a system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive + environments. + ); +} + +function getMultipleOptionsWarning() { + return ( + Some options have been selected that may cause a system + to become unstable or may change a system's state in undesirable ways. + Running Infection Monkey in a production or other sensitive environment + with this configuration is not recommended. + ); +} + export {getDefaultPaneParams, InfoPane, WarningType} From 09a8415aec98963aa575d04f0de8950d185398da Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Mon, 1 Feb 2021 07:14:15 -0500 Subject: [PATCH 40/46] ui: remove disabled/readonly from AdvancedMultiSelect --- .../src/components/ui-components/AdvancedMultiSelect.js | 9 +++------ .../cc/ui/src/components/ui-components/ChildCheckbox.js | 8 +++----- .../cc/ui/src/components/ui-components/MasterCheckbox.js | 3 +-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 0dc813dc6..670b99cd7 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -11,7 +11,6 @@ import {getFullDefinitionByKey} from './JsonSchemaHelpers'; function AdvancedMultiSelectHeader(props) { const { title, - disabled, onCheckboxClick, checkboxState, hideReset, @@ -20,7 +19,7 @@ function AdvancedMultiSelectHeader(props) { return ( - + {label} diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js index b5a646aca..907ccf08f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js @@ -15,7 +15,6 @@ const MasterCheckboxState = { function MasterCheckbox(props) { const { title, - disabled, onClick, checkboxState } = props; @@ -30,7 +29,7 @@ function MasterCheckbox(props) { return (
- {title} From cc9b88b8e579a4e09acfe7c1b87825eedd3a5573 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 2 Feb 2021 13:47:45 -0500 Subject: [PATCH 41/46] ui: fix spelling error catagory -> category Fixes #689 --- .../monkey_island/cc/ui/src/components/pages/TelemetryPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/ui/src/components/pages/TelemetryPage.js b/monkey/monkey_island/cc/ui/src/components/pages/TelemetryPage.js index faa9ad138..b4a7d25d8 100644 --- a/monkey/monkey_island/cc/ui/src/components/pages/TelemetryPage.js +++ b/monkey/monkey_island/cc/ui/src/components/pages/TelemetryPage.js @@ -15,7 +15,7 @@ const renderTime = (val) => val.split('.')[0]; const columns = [ {title: 'Time', prop: 'timestamp', render: renderTime}, {title: 'Monkey', prop: 'monkey'}, - {title: 'Type', prop: 'telem_catagory'}, + {title: 'Type', prop: 'telem_category'}, {title: 'Details', prop: 'data', render: renderJson, width: '40%'} ]; From c8b4089bd2a11b158059f3601195a5c67da7355d Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Mon, 1 Feb 2021 17:06:11 -0500 Subject: [PATCH 42/46] ui: display cross-segment issues as "pinged" if no services/ports Issue #819 --- .../report-components/SecurityReport.js | 70 ++++++++++++++----- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js index 63749ced1..9a4e2120a 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js +++ b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js @@ -452,24 +452,58 @@ class ReportPageComponent extends AuthComponent { generateCrossSegmentIssue(crossSegmentIssue) { let crossSegmentIssueOverview = 'Communication possible from ' + crossSegmentIssue['source_subnet'] + ' to ' + crossSegmentIssue['target_subnet'] - return
  • - {crossSegmentIssueOverview} - -
      - {crossSegmentIssue['issues'].map(x => - x['is_self'] ? -
    • - {'Machine ' + x['hostname'] + ' has both ips: ' + x['source'] + ' and ' + x['target']} -
    • - : -
    • - {'IP ' + x['source'] + ' (' + x['hostname'] + ') connected to IP ' + x['target'] - + ' using the services: ' + Object.keys(x['services']).join(', ')} -
    • - )} -
    -
    -
  • ; + + return ( +
  • + {crossSegmentIssueOverview} + +
      + {crossSegmentIssue['issues'].map(issue => this.generateCrossSegmentIssueListItem(issue))} +
    +
    +
  • + ); + } + + generateCrossSegmentIssueListItem(issue) { + if (issue['is_self']) { + return this.generateCrossSegmentSingleHostMessage(issue); + } + + return this.generateCrossSegmentMultiHostMessage(issue); + } + + generateCrossSegmentSingleHostMessage(issue) { + return ( +
  • + {'Machine ' + issue['hostname'] + ' has both ips: ' + issue['source'] + ' and ' + issue['target']} +
  • + ); + } + + generateCrossSegmentMultiHostMessage(issue) { + return ( +
  • + { + Object.keys(issue['services']).length > 0 ? + this.generateCrossSegmentServiceMessage(issue) : + this.generateCrossSegmentPingMessage(issue) + } +
  • + ); + } + + generateCrossSegmentServiceMessage(issue) { + return ( + 'IP ' + issue['source'] + ' (' + issue['hostname'] + ') connected to IP ' + issue['target'] + + ' using the services: ' + Object.keys(issue['services']).join(', ') + ); + } + + generateCrossSegmentPingMessage(issue) { + return ( + `IP ${issue['source']} (${issue['hostname']}) successfully pinged IP ${issue['target']}` + ); } generateShellshockPathListBadges(paths) { From 458e01cf247b066019afbb12ff0897078469f1eb Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 2 Feb 2021 06:49:21 -0500 Subject: [PATCH 43/46] ui: use template strings when generating cross-segment report --- .../src/components/report-components/SecurityReport.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js index 9a4e2120a..f8c8fa192 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js +++ b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js @@ -451,7 +451,8 @@ class ReportPageComponent extends AuthComponent { } generateCrossSegmentIssue(crossSegmentIssue) { - let crossSegmentIssueOverview = 'Communication possible from ' + crossSegmentIssue['source_subnet'] + ' to ' + crossSegmentIssue['target_subnet'] + let crossSegmentIssueOverview = 'Communication possible from ' + + `${crossSegmentIssue['source_subnet']} to ${crossSegmentIssue['target_subnet']}`; return (
  • @@ -476,7 +477,7 @@ class ReportPageComponent extends AuthComponent { generateCrossSegmentSingleHostMessage(issue) { return (
  • - {'Machine ' + issue['hostname'] + ' has both ips: ' + issue['source'] + ' and ' + issue['target']} + {`Machine ${issue['hostname']} has both ips: ${issue['source']} and ${issue['target']}`}
  • ); } @@ -495,8 +496,8 @@ class ReportPageComponent extends AuthComponent { generateCrossSegmentServiceMessage(issue) { return ( - 'IP ' + issue['source'] + ' (' + issue['hostname'] + ') connected to IP ' + issue['target'] - + ' using the services: ' + Object.keys(issue['services']).join(', ') + `IP ${issue['source']} (${issue['hostname']}) connected to IP ${issue['target']}` + + ` using the services: ${Object.keys(issue['services']).join(', ')}` ); } From c7a1f246cbfdf4162cd8fca07c2db6505cc4d073 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 2 Feb 2021 11:00:59 -0500 Subject: [PATCH 44/46] agent: add icmp property to VictimHost Keep track of whether or not PingScanner was successful by storing a boolean in VictimHost objects. This information is communicated back to the Monkey Island via telemetry. --- monkey/infection_monkey/model/host.py | 3 ++- monkey/infection_monkey/network/ping_scanner.py | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/monkey/infection_monkey/model/host.py b/monkey/infection_monkey/model/host.py index 1a4fef1c8..d71446108 100644 --- a/monkey/infection_monkey/model/host.py +++ b/monkey/infection_monkey/model/host.py @@ -7,6 +7,7 @@ class VictimHost(object): self.domain_name = str(domain_name) self.os = {} self.services = {} + self.icmp = False self.monkey_exe = None self.default_tunnel = None self.default_server = None @@ -40,7 +41,7 @@ class VictimHost(object): victim += "] Services - [" for k, v in list(self.services.items()): victim += "%s-%s " % (k, v) - victim += '] ' + victim += '] ICMP: %s ' % (self.icmp) victim += "target monkey: %s" % self.monkey_exe return victim diff --git a/monkey/infection_monkey/network/ping_scanner.py b/monkey/infection_monkey/network/ping_scanner.py index 27c814593..fd19550a3 100644 --- a/monkey/infection_monkey/network/ping_scanner.py +++ b/monkey/infection_monkey/network/ping_scanner.py @@ -62,6 +62,9 @@ class PingScanner(HostScanner, HostFinger): host.os['type'] = 'linux' else: # as far we we know, could also be OSX/BSD but lets handle that when it comes up. host.os['type'] = 'windows' + + host.icmp = True + return True except Exception as exc: LOG.debug("Error parsing ping fingerprint: %s", exc) From c6bec1335cf7f8590289927766a01314299ed182 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 2 Feb 2021 11:03:39 -0500 Subject: [PATCH 45/46] island: include 'icmp' from scan telemetry in report --- monkey/monkey_island/cc/services/reporting/report.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/services/reporting/report.py b/monkey/monkey_island/cc/services/reporting/report.py index d60d53dec..1e77065d4 100644 --- a/monkey/monkey_island/cc/services/reporting/report.py +++ b/monkey/monkey_island/cc/services/reporting/report.py @@ -510,6 +510,7 @@ class ReportService: 'hostname': monkey['hostname'], 'target': target_ip, 'services': scan['data']['machine']['services'], + 'icmp': scan['data']['machine']['icmp'], 'is_self': False }) @@ -544,7 +545,7 @@ class ReportService: @staticmethod def get_cross_segment_issues(): scans = mongo.db.telemetry.find({'telem_category': 'scan'}, - {'monkey_guid': 1, 'data.machine.ip_addr': 1, 'data.machine.services': 1}) + {'monkey_guid': 1, 'data.machine.ip_addr': 1, 'data.machine.services': 1, 'data.machine.icmp': 1}) cross_segment_issues = [] From 919c51b9202342e0c705fedc815499be121838a3 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Tue, 2 Feb 2021 11:06:27 -0500 Subject: [PATCH 46/46] ui: display ICMP in cross-segment issues report --- .../report-components/SecurityReport.js | 38 ++++++++++--------- .../src/styles/pages/report/ReportPage.scss | 9 +++++ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js index f8c8fa192..1d6072ece 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js +++ b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js @@ -458,8 +458,10 @@ class ReportPageComponent extends AuthComponent {
  • {crossSegmentIssueOverview} -
      - {crossSegmentIssue['issues'].map(issue => this.generateCrossSegmentIssueListItem(issue))} +
        + {crossSegmentIssue['issues'].map( + issue => this.generateCrossSegmentIssueListItem(issue) + )}
      @@ -485,26 +487,28 @@ class ReportPageComponent extends AuthComponent { generateCrossSegmentMultiHostMessage(issue) { return (
    • - { - Object.keys(issue['services']).length > 0 ? - this.generateCrossSegmentServiceMessage(issue) : - this.generateCrossSegmentPingMessage(issue) - } + IP {issue['source']} ({issue['hostname']}) was able to communicate with + IP {issue['target']} using: +
        + {issue['icmp'] &&
      • ICMP
      • } + {this.generateCrossSegmentServiceListItems(issue)} +
    • ); } - generateCrossSegmentServiceMessage(issue) { - return ( - `IP ${issue['source']} (${issue['hostname']}) connected to IP ${issue['target']}` - + ` using the services: ${Object.keys(issue['services']).join(', ')}` - ); - } + generateCrossSegmentServiceListItems(issue) { + let service_list_items = []; - generateCrossSegmentPingMessage(issue) { - return ( - `IP ${issue['source']} (${issue['hostname']}) successfully pinged IP ${issue['target']}` - ); + for (const [service, info] of Object.entries(issue['services'])) { + service_list_items.push( +
    • + {service} ({info['display_name']}) +
    • + ); + } + + return service_list_items; } generateShellshockPathListBadges(paths) { diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportPage.scss index 5fb8252fe..088e012f3 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportPage.scss @@ -76,3 +76,12 @@ div.report-wrapper .nav-tabs > .nav-item > a:hover:not(.active), .nav-tabs > .n text-decoration: none; background-color: $light-gray; } + +ul.cross-segment-issues { + list-style-type: none; + padding: 0px; + margin: 0px; +} +span.cross-segment-service { + text-transform: uppercase; +}