diff --git a/c7n/policy.py b/c7n/policy.py
index bae8e04cb..faa858ca2 100644
--- a/c7n/policy.py
+++ b/c7n/policy.py
@@ -922,6 +922,15 @@ class PolicyConditions:
         self.policy = policy
         self.data = data
         self.filters = self.data.get('conditions', [])
+        # for value_from usage / we use the conditions class
+        # to mimic a resource manager interface. we can't use
+        # the actual resource manager as we're overriding block
+        # filters which work w/ resource type metadata and our
+        # resource here is effectively the execution variables.
+        self.config = self.policy.options
+        rm = self.policy.resource_manager
+        self._cache = rm._cache
+        self.session_factory = rm.session_factory
         # used by c7n-org to extend evaluation conditions
         self.env_vars = {}
 
diff --git a/c7n/resources/cw.py b/c7n/resources/cw.py
index b0ccf6e14..6c8655a52 100644
--- a/c7n/resources/cw.py
+++ b/c7n/resources/cw.py
@@ -176,6 +176,13 @@ class LogGroup(QueryResourceManager):
         return [r['arn'][:-2] for r in resources]
 
 
+@LogGroup.filter_registry.register('metrics')
+class LogGroupMetrics(MetricsFilter):
+
+    def get_dimensions(self, resource):
+        return [{'Name': 'LogGroupName', 'Value': resource['logGroupName']}]
+
+
 @LogGroup.action_registry.register('retention')
 class Retention(BaseAction):
     """Action to set the retention period (in days) for CloudWatch log groups
diff --git a/docs/source/gcp/gettingstarted.rst b/docs/source/gcp/gettingstarted.rst
index 26563e237..ce7773077 100644
--- a/docs/source/gcp/gettingstarted.rst
+++ b/docs/source/gcp/gettingstarted.rst
@@ -61,7 +61,7 @@ Then run the following command, substituting your username:
 
 .. code-block:: bash
 
-    gcloud auth application-default login <your_user_name>
+    gcloud auth application-default login
 
 Executing the command will open a browser window with prompts to finish configuring
 your credentials. For more information on this command,
@@ -105,7 +105,6 @@ Filename: ``custodian.yml``
           - type: value
             key: name
             value: test
-            op: in
         actions:
           - type: stop
 
@@ -119,7 +118,7 @@ Next, run the following command to execute the policy with Custodian:
 
 .. code-block:: bash
 
-    custodian run --output-dir=. custodian.yml
+    GOOGLE_CLOUD_PROJECT="project-id" custodian run --output-dir=. custodian.yml
 
 If successful, you should see output similar to the following on the command line::
 

App-ELB Conditions Error - PolicyConditions object has no attribute config
**Describe the bug**
When running a app-elb policy which has a conditions statement to see if the account_id is present in a S3 csv file we are getting the error "PolicyConditions object has no attribute config"

**To Reproduce**
Steps to reproduce the behavior: Running policy produces error

**Expected behavior**
On previous 0.9.1 this policy seemed to work fine.


**Background (please complete the following information):**
 - OS: [e.g. OSX 10.15] Ubuntu v20
 - Python Version: [e.g. python 3.8.1] 3.8.2
 - Custodian Version: [e.g. 0.8.46.1] 0.9.4.0  c7n-org 0.6.3
 - Tool Version: [if applicable] c7n-org 0.6.3
 - Cloud Provider: [e.g. gcp, aws, azure] aws
 - Policy: [please exclude any account/sensitive information]
```

- name: app-elb-tag-now-compliant-poll
  resource: app-elb
  description: |
    Any Application ELBs which have previously been marked as non compliant with tag policies, that are now compliant
    should be unmarked and the customer emailed.
  conditions:
    - type: value
      key: account_id
      op: not-in
      value_from:
         url: s3://mys3bucket/AccountExceptions.csv
         format: csv2dict
  filters:
    - "tag:c7n_tag_compliance_poll": not-null
    - "tag:ResourceContact": present
    - type: value
      key: "tag:ResourceContact"
      op: not-in
      value_from:
         url: s3://mys3bucket/InvalidEmails.csv
         format: csv2dict
    - type: value
      key: "tag:ResourceContact"
      op: regex
      value: (^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)
    - "tag:BillingCostCenter": present
    - type: value
      key: "tag:BillingCostCenter"
      op: in
      value_from:
         url: s3://mys3bucket/ValidCostCenters.csv
         format: csv2dict
    - "tag:Environment": present
    - type: value
      key: "tag:Environment"
      op: in
      value:
        - tst
        - dev
        - mdl
        - acc
        - prd
        - eat
    - "tag:ResourcePurpose": present
    - type: value
      key: "tag:ResourcePurpose"
      op: regex
      value: ^.{3,}$
    - "tag:Division": present
    - type: value
      key: "tag:Division"
      op: in
      value_from:
         url: s3://mys3bucket/ValidDivisions.csv
         format: csv2dict
    - type: value
      value_type: date
      key: CreatedTime
      op: greater-than
      value: "2020/05/05"
  actions:
    - type: remove-tag
      tags: ["c7n_tag_compliance_poll"]
    - type: notify
      template: default.html
      priority_header: 1
      subject: "Application ELB Tags - Application ELB is now compliant - [custodian {{ account }} - {{ region }}]" 
      violation_desc: |
          The Application ELB which was previously missing or had invalid required tags is now compliant and won't be deleted
      action_desc: "Actions Taken:  Notification Only. The Application ELB is now compliant with tags."
      to:
        - resource-owner
      transport:
        type: sqs
        queue: https://sqs.us-east-1.amazonaws.com/123456789/cloud-custodian-mailer
        region: us-east-1

```
 - Traceback: [if applicable, please exclude sensitive/account information]

```
Traceback (most recent call last):
  File "/root/c7n/lib/python3.8/site-packages/c7n/cli.py", line 362, in main
    command(config)
  File "/root/c7n/lib/python3.8/site-packages/c7n/commands.py", line 136, in _load_policies
    return f(options, list(policies))
  File "/root/c7n/lib/python3.8/site-packages/c7n/commands.py", line 282, in run
    policy()
  File "/root/c7n/lib/python3.8/site-packages/c7n/policy.py", line 1171, in __call__
    elif not self.is_runnable():
  File "/root/c7n/lib/python3.8/site-packages/c7n/policy.py", line 1011, in is_runnable
    return self.conditions.evaluate(event)
  File "/root/c7n/lib/python3.8/site-packages/c7n/policy.py", line 945, in evaluate
    state = all([f.process([policy_vars], event) for f in self.filters])
  File "/root/c7n/lib/python3.8/site-packages/c7n/policy.py", line 945, in <listcomp>
    state = all([f.process([policy_vars], event) for f in self.filters])
  File "/root/c7n/lib/python3.8/site-packages/c7n/filters/core.py", line 530, in process
    return super(ValueFilter, self).process(resources, event)
  File "/root/c7n/lib/python3.8/site-packages/c7n/filters/core.py", line 217, in process
    return list(filter(self, resources))
  File "/root/c7n/lib/python3.8/site-packages/c7n/filters/core.py", line 517, in __call__
    matched = self.match(i)
  File "/root/c7n/lib/python3.8/site-packages/c7n/filters/core.py", line 569, in match
    values = ValuesFrom(self.data['value_from'], self.manager)
  File "/root/c7n/lib/python3.8/site-packages/c7n/resolver.py", line 132, in __init__
    'account_id': manager.config.account_id,
AttributeError: 'PolicyConditions' object has no attribute 'config'
> /root/c7n/lib/python3.8/site-packages/c7n/resolver.py(132)__init__()
-> 'account_id': manager.config.account_id,
(Pdb)

```
 - `custodian version --debug` output 

```
Custodian:   0.9.4
Python:      3.8.2 (default, Apr 27 2020, 15:53:34)
             [GCC 9.3.0]
Platform:    posix.uname_result(sysname='Linux', nodename='ip-10-128-128-28', release='5.4.0-1009-aws', version='#9-Ubuntu SMP Sun Apr 12 19:46:01 UTC 2020', machine='x86_64')
Using venv:  True
Docker: False
Installed:

argcomplete==1.11.1
attrs==19.3.0
boto3==1.14.20
botocore==1.17.20
docutils==0.15.2
importlib-metadata==1.7.0
jmespath==0.10.0
jsonschema==3.2.0
pyrsistent==0.16.0
python-dateutil==2.8.1
pyyaml==5.3.1
s3transfer==0.3.3
setuptools==44.0.0
six==1.15.0
tabulate==0.8.7
urllib3==1.25.9
zipp==3.1.0
```

**Additional context**
Add any other context about the problem here.

diff --git a/tests/data/placebo/test_log_group_metric/logs.DescribeLogGroups_1.json b/tests/data/placebo/test_log_group_metric/logs.DescribeLogGroups_1.json
new file mode 100644
index 000000000..fcbcc6f18
--- /dev/null
+++ b/tests/data/placebo/test_log_group_metric/logs.DescribeLogGroups_1.json
@@ -0,0 +1,22 @@
+{
+    "status_code": 200,
+    "data": {
+        "logGroups": [
+            {
+                "logGroupName": "/aws/lambda/myIOTFunction",
+                "creationTime": 6441605581965,
+                "metricFilterCount": 0,
+                "arn": "arn:aws:logs:us-west-2:644160558196:log-group:/aws/lambda/myIOTFunction:*",
+                "storedBytes": 857324
+            },
+            {
+                "logGroupName": "devlog",
+                "creationTime": 6441605581968,
+                "metricFilterCount": 0,
+                "arn": "arn:aws:logs:us-west-2:644160558196:log-group:devlog:*",
+                "storedBytes": 0
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_log_group_metric/monitoring.GetMetricStatistics_1.json b/tests/data/placebo/test_log_group_metric/monitoring.GetMetricStatistics_1.json
new file mode 100644
index 000000000..5478a41ce
--- /dev/null
+++ b/tests/data/placebo/test_log_group_metric/monitoring.GetMetricStatistics_1.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "Label": "IncomingBytes",
+        "Datapoints": [
+            {
+                "Timestamp": {
+                    "hour": 11, 
+                    "__class__": "datetime", 
+                    "month": 8, 
+                    "second": 0, 
+                    "microsecond": 0, 
+                    "year": 2016, 
+                    "day": 8, 
+                    "minute": 46
+                }, 
+                "Average": 107.0, 
+                "Unit": "Bytes"
+            }  
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_log_group_metric/tagging.GetResources_1.json b/tests/data/placebo/test_log_group_metric/tagging.GetResources_1.json
new file mode 100644
index 000000000..8b704d185
--- /dev/null
+++ b/tests/data/placebo/test_log_group_metric/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/test_cwl.py b/tests/test_cwl.py
index ff2525d45..8ba8ec007 100644
--- a/tests/test_cwl.py
+++ b/tests/test_cwl.py
@@ -161,3 +161,20 @@ class LogGroupTest(BaseTest):
         self.assertEqual(
             results[0]['kmsKeyId'],
             'arn:aws:kms:us-west-2:644160558196:key/6f13fc53-8da0-46f2-9c69-c1f9fbf471d7')
+
+    def test_metrics(self):
+        session_factory = self.replay_flight_data('test_log_group_metric')
+        p = self.load_policy(
+            {'name': 'metric-log-group',
+             'resource': 'log-group',
+             'filters': [
+                 {"logGroupName": "/aws/lambda/myIOTFunction"},
+                 {"type": "metrics",
+                  "name": "IncomingBytes",
+                  "value": 1,
+                  "op": "greater-than"}]},
+            config={'region': 'us-west-2'},
+            session_factory=session_factory)
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        self.assertIn('c7n.metrics', resources[0])
diff --git a/tests/test_policy.py b/tests/test_policy.py
index 823f55817..d4965f6a0 100644
--- a/tests/test_policy.py
+++ b/tests/test_policy.py
@@ -16,6 +16,7 @@ from datetime import datetime, timedelta
 import json
 import logging
 import mock
+import os
 import shutil
 import tempfile
 
@@ -992,6 +993,24 @@ class TestPolicy(BaseTest):
 
 class PolicyConditionsTest(BaseTest):
 
+    def test_value_from(self):
+        tmp_dir = self.change_cwd()
+        p = self.load_policy({
+            'name': 'fx',
+            'resource': 'aws.ec2',
+            'conditions': [{
+                'type': 'value',
+                'key': 'account_id',
+                'op': 'in',
+                'value_from': {
+                    'url': 'file:///{}/accounts.txt'.format(tmp_dir),
+                    'type': 'txt'}
+            }]
+        })
+        with open(os.path.join(tmp_dir, 'accounts.txt'), 'w') as fh:
+            fh.write(p.ctx.options.account_id)
+        self.assertTrue(p.is_runnable())
+
     def test_env_var_extension(self):
         p = self.load_policy({
             'name': 'profx',

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock
apt-get update apt-get install -y gcc
3.8
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
apipkg==1.5
appdirs==1.4.4
argcomplete==1.11.1
attrs==19.3.0
aws-xray-sdk==2.6.0
bleach==3.1.5
boto3==1.14.16
botocore==1.17.16
-e git+https://github.com/cloud-custodian/cloud-custodian.git@22b4fda1a74bff43c854a594076a1c460e5ff573#egg=c7n
certifi==2020.6.20
cffi==1.14.0
chardet==3.0.4
colorama==0.4.3
coverage==5.2
cryptography==2.9.2
distlib==0.3.1
docutils==0.15.2
exceptiongroup==1.2.2
execnet==1.7.1
filelock==3.0.12
flake8==3.8.3
future==0.18.2
idna==2.10
importlib-metadata==1.7.0
iniconfig==2.1.0
jeepney==0.4.3
jmespath==0.10.0
jsonpatch==1.26
jsonpickle==1.4.1
jsonpointer==2.0
jsonschema==3.2.0
keyring==21.2.1
mccabe==0.6.1
mock==4.0.2
more-itertools==8.4.0
multidict==4.7.6
packaging==20.4
pkginfo==1.5.0.1
placebo==0.9.0
pluggy==1.5.0
psutil==5.7.0
py==1.9.0
pycodestyle==2.6.0
pycparser==2.20
pyflakes==2.2.0
Pygments==2.6.1
pyparsing==2.4.7
pyrsistent==0.16.0
pytest==8.3.5
pytest-cov==2.10.0
pytest-forked==1.2.0
pytest-mock==3.14.0
pytest-sugar==0.9.3
pytest-xdist==1.32.0
python-dateutil==2.8.1
PyYAML==5.3.1
readme-renderer==26.0
requests==2.24.0
requests-toolbelt==0.9.1
rfc3986==1.4.0
s3transfer==0.3.3
SecretStorage==3.1.2
six==1.15.0
tabulate==0.8.7
termcolor==1.1.0
toml==0.10.1
tomli==2.2.1
tox==3.16.1
tqdm==4.47.0
twine==3.2.0
urllib3==1.25.9
vcrpy==4.0.2
virtualenv==20.0.25
wcwidth==0.2.5
webencodings==0.5.1
wrapt==1.12.1
yarl==1.4.2
zipp==3.1.0

name: cloud-custodian
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=24.2=py38h06a4308_0
  - python=3.8.20=he870216_0
  - readline=8.2=h5eee18b_0
  - setuptools=75.1.0=py38h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.44.0=py38h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - apipkg==1.5
      - appdirs==1.4.4
      - argcomplete==1.11.1
      - attrs==19.3.0
      - aws-xray-sdk==2.6.0
      - bleach==3.1.5
      - boto3==1.14.16
      - botocore==1.17.16
      - c7n==0.9.4
      - certifi==2020.6.20
      - cffi==1.14.0
      - chardet==3.0.4
      - colorama==0.4.3
      - coverage==5.2
      - cryptography==2.9.2
      - distlib==0.3.1
      - docutils==0.15.2
      - exceptiongroup==1.2.2
      - execnet==1.7.1
      - filelock==3.0.12
      - flake8==3.8.3
      - future==0.18.2
      - idna==2.10
      - importlib-metadata==1.7.0
      - iniconfig==2.1.0
      - jeepney==0.4.3
      - jmespath==0.10.0
      - jsonpatch==1.26
      - jsonpickle==1.4.1
      - jsonpointer==2.0
      - jsonschema==3.2.0
      - keyring==21.2.1
      - mccabe==0.6.1
      - mock==4.0.2
      - more-itertools==8.4.0
      - multidict==4.7.6
      - packaging==20.4
      - pkginfo==1.5.0.1
      - placebo==0.9.0
      - pluggy==1.5.0
      - psutil==5.7.0
      - py==1.9.0
      - pycodestyle==2.6.0
      - pycparser==2.20
      - pyflakes==2.2.0
      - pygments==2.6.1
      - pyparsing==2.4.7
      - pyrsistent==0.16.0
      - pytest==8.3.5
      - pytest-cov==2.10.0
      - pytest-forked==1.2.0
      - pytest-mock==3.14.0
      - pytest-sugar==0.9.3
      - pytest-xdist==1.32.0
      - python-dateutil==2.8.1
      - pyyaml==5.3.1
      - readme-renderer==26.0
      - requests==2.24.0
      - requests-toolbelt==0.9.1
      - rfc3986==1.4.0
      - s3transfer==0.3.3
      - secretstorage==3.1.2
      - six==1.15.0
      - tabulate==0.8.7
      - termcolor==1.1.0
      - toml==0.10.1
      - tomli==2.2.1
      - tox==3.16.1
      - tqdm==4.47.0
      - twine==3.2.0
      - urllib3==1.25.9
      - vcrpy==4.0.2
      - virtualenv==20.0.25
      - wcwidth==0.2.5
      - webencodings==0.5.1
      - wrapt==1.12.1
      - yarl==1.4.2
      - zipp==3.1.0
prefix: /opt/conda/envs/cloud-custodian

tests/test_cwl.py::LogGroupTest::test_metrics tests/test_policy.py::PolicyConditionsTest::test_value_from
tests/test_cwl.py::LogGroupTest::test_age_normalize tests/test_cwl.py::LogGroupTest::test_cross_account tests/test_cwl.py::LogGroupTest::test_delete tests/test_cwl.py::LogGroupTest::test_encrypt tests/test_cwl.py::LogGroupTest::test_last_write tests/test_cwl.py::LogGroupTest::test_log_group_delete_error tests/test_cwl.py::LogGroupTest::test_retention tests/test_policy.py::PolicyMetaLint::test_cfn_resource_validity tests/test_policy.py::PolicyMetaLint::test_config_resource_support tests/test_policy.py::PolicyMetaLint::test_filter_action_additional tests/test_policy.py::PolicyMetaLint::test_filter_action_type tests/test_policy.py::PolicyMetaLint::test_policy_detail_spec_permissions tests/test_policy.py::PolicyMetaLint::test_policy_missing_provider_session tests/test_policy.py::PolicyMetaLint::test_resource_arn_info tests/test_policy.py::PolicyMetaLint::test_resource_arn_override_generator tests/test_policy.py::PolicyMetaLint::test_resource_augment_universal_mask tests/test_policy.py::PolicyMetaLint::test_resource_legacy_type tests/test_policy.py::PolicyMetaLint::test_resource_meta_with_class tests/test_policy.py::PolicyMetaLint::test_resource_name tests/test_policy.py::PolicyMetaLint::test_resource_permissions tests/test_policy.py::PolicyMetaLint::test_resource_shadow_source_augment tests/test_policy.py::PolicyMetaLint::test_resource_type_empty_metadata tests/test_policy.py::PolicyMetaLint::test_resource_universal_taggable_arn_type tests/test_policy.py::PolicyMetaLint::test_schema tests/test_policy.py::PolicyMetaLint::test_schema_plugin_name_mismatch tests/test_policy.py::PolicyMetaLint::test_schema_serialization tests/test_policy.py::PolicyMetaLint::test_securityhub_resource_support tests/test_policy.py::PolicyMeta::test_policy_detail_spec_permissions tests/test_policy.py::PolicyMeta::test_policy_manager_custom_permissions tests/test_policy.py::TestPolicyCollection::test_expand_partitions tests/test_policy.py::TestPolicyCollection::test_policy_expand_group_region tests/test_policy.py::TestPolicyCollection::test_policy_region_expand_global tests/test_policy.py::TestPolicy::test_child_resource_trail_validation tests/test_policy.py::TestPolicy::test_file_not_found tests/test_policy.py::TestPolicy::test_get_resource_manager tests/test_policy.py::TestPolicy::test_load_policy_validation_error tests/test_policy.py::TestPolicy::test_policy_name_and_resource_type_filtering tests/test_policy.py::TestPolicy::test_policy_resource_limit_and_percent tests/test_policy.py::TestPolicy::test_policy_resource_limits tests/test_policy.py::TestPolicy::test_policy_resource_limits_count tests/test_policy.py::TestPolicy::test_policy_resource_limits_with_filter tests/test_policy.py::TestPolicy::test_policy_validation tests/test_policy.py::TestPolicy::test_policy_variable_interpolation tests/test_policy.py::TestPolicy::test_policy_variable_precedent tests/test_policy.py::TestPolicy::test_policy_with_role_complete tests/test_policy.py::TestPolicy::test_validate_policy_start_stop tests/test_policy.py::PolicyConditionsTest::test_boolean_and_blocks tests/test_policy.py::PolicyConditionsTest::test_boolean_not_blocks tests/test_policy.py::PolicyConditionsTest::test_boolean_not_event tests/test_policy.py::PolicyConditionsTest::test_boolean_or_blocks tests/test_policy.py::PolicyConditionsTest::test_dryrun_event_filter tests/test_policy.py::PolicyConditionsTest::test_env_var_extension tests/test_policy.py::PolicyConditionsTest::test_event_filter tests/test_policy.py::PolicyExecutionModeTest::test_get_logs_unimplemented tests/test_policy.py::PolicyExecutionModeTest::test_run_unimplemented tests/test_policy.py::LambdaModeTest::test_tags_injection tests/test_policy.py::LambdaModeTest::test_tags_validation tests/test_policy.py::PullModeTest::test_is_runnable_dates tests/test_policy.py::PullModeTest::test_is_runnable_mismatch_region tests/test_policy.py::PullModeTest::test_is_runnable_parse_dates tests/test_policy.py::PullModeTest::test_skip_when_region_not_equal tests/test_policy.py::PhdModeTest::test_validation tests/test_policy.py::ConfigModeTest::test_config_poll tests/test_policy.py::GuardModeTest::test_ec2_guard_event_pattern tests/test_policy.py::GuardModeTest::test_ec2_instance_guard tests/test_policy.py::GuardModeTest::test_iam_guard_event_pattern tests/test_policy.py::GuardModeTest::test_iam_user_access_key_annotate tests/test_policy.py::GuardModeTest::test_lambda_policy_validate_name tests/test_policy.py::GuardModeTest::test_unsupported_resource
docs/source/gcp/gettingstarted.rst c7n/policy.py c7n/resources/cw.py
docs/source/gcp/gettingstarted.rst c7n/policy.py c7n/resources/cw.py